Dart HttpHeaders
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpHeaders 类提供了管理请求和响应的 HTTP Header 的功能。它是 Dart HTTP 库的一部分。
HttpHeaders 会自动处理 Header 名称的区分大小写、多个值以及诸如 content-length 之类的特殊 Header。它与 HttpClient 和 HttpServer 类一起使用。
基本定义
HttpHeaders 是一个表示 HTTP Header 的抽象类。它提供了添加、设置、删除和检查 Header 的方法。
主要功能包括不区分大小写的 Header 名称、值列表管理以及对 Cookie 和 Content Header 的特殊处理。一旦冻结,它是不可变的。
创建 HttpHeaders
此示例展示了如何创建和填充 HttpHeaders。
import 'dart:io';
void main() {
var headers = HttpHeaders();
headers.add('Content-Type', 'text/html');
headers.add('X-Custom-Header', 'value1');
headers.add('X-Custom-Header', 'value2');
print('Content-Type: ${headers.value('content-type')}');
print('X-Custom-Header: ${headers['x-custom-header']}');
}
我们创建 HttpHeaders 并添加多个 Header。Header 名称不区分大小写。同一个 Header 可以有多个值。可以通过名称访问值。
$ dart main.dart Content-Type: text/html X-Custom-Header: [value1, value2]
设置与添加 Header
此示例演示了 set 和 add 操作之间的区别。
import 'dart:io';
void main() {
var headers = HttpHeaders();
headers.add('Accept', 'text/html');
headers.add('Accept', 'application/json');
print('Before set: ${headers['accept']}');
headers.set('Accept', 'image/png');
print('After set: ${headers['accept']}');
headers.remove('accept', 'image/png');
print('After remove: ${headers['accept']}');
}
Add 追加值,而 set 则替换所有现有值。Remove 删除特定值。所有操作均不区分大小写。
$ dart main.dart Before set: [text/html, application/json] After set: [image/png] After remove: []
Content Headers
此示例展示了对内容相关 Header 的特殊处理。
import 'dart:io';
void main() {
var headers = HttpHeaders();
headers.contentType = ContentType('text', 'html', charset: 'utf-8');
headers.contentLength = 1024;
headers.chunkedTransferEncoding = false;
print('Content-Type: ${headers.contentType}');
print('Content-Length: ${headers.contentLength}');
print('Chunked: ${headers.chunkedTransferEncoding}');
}
Content Header 具有用于类型、长度和编码的专用属性。这些属性提供了对常见 HTTP 内容 Header 的类型安全访问。
$ dart main.dart Content-Type: text/html; charset=utf-8 Content-Length: 1024 Chunked: false
Date 和 Cookie Headers
此示例演示了日期和 Cookie Header 的处理。
import 'dart:io';
void main() {
var headers = HttpHeaders();
var date = DateTime.now();
headers.date = date;
headers.add('Set-Cookie', 'id=a3fWa; Expires=Wed, 21 Oct 2025 07:28:00 GMT');
headers.add('Set-Cookie', 'session=abc123; HttpOnly');
print('Date: ${headers.date}');
print('Cookies:');
headers.forEach((name, values) {
if (name == 'set-cookie') {
values.forEach(print);
}
});
}
Date Header 使用 DateTime 对象进行处理。Cookie 可以作为字符串添加,但会进行特殊格式化。forEach 方法会遍历所有 Header。
$ dart main.dart Date: 2025-04-04 12:34:56.789 Cookies: id=a3fWa; Expires=Wed, 21 Oct 2025 07:28:00 GMT session=abc123; HttpOnly
HttpClient 与 Headers
此示例展示了如何在 HttpClient 请求中使用 HttpHeaders。
import 'dart:io';
import 'dart:convert';
Future<void> main() async {
var client = HttpClient();
try {
var request = await client.getUrl(Uri.parse('https://example.com'));
request.headers.add('Accept', 'application/json');
request.headers.add('User-Agent', 'Dart/3.0');
request.headers.add('X-Request-ID', '12345');
var response = await request.close();
print('Status: ${response.statusCode}');
var body = await response.transform(utf8.decoder).join();
print('Response length: ${body.length}');
} finally {
client.close();
}
}
我们创建一个带有自定义 Header 的 HTTP GET 请求。headers 属性是 HttpHeaders 实例。Header 会随请求一起发送到服务器。
$ dart main.dart Status: 200 Response length: 1256
最佳实践
- 重用: 创建一次 Header,尽可能重用
- 验证: 在设置之前验证 Header 值
- 常量: 使用常量来命名 Header
- 安全: 清理用户提供的 Header 值
来源
本教程通过实际示例涵盖了 Dart 的 HttpHeaders 类,展示了 Header 管理、特殊 Header 以及 HTTP 客户端集成。
作者
列出 所有 Dart 教程。