Dart HeaderValue
最后修改于 2025 年 4 月 4 日
Dart 中的 HeaderValue
类提供了用于解析和操作 HTTP 标头值的工具。它可以处理标头中常见的简单值和复杂参数。
HeaderValue 可以解析带有参数、质量因子和其他元数据的 H 标头值。它是 Dart 的 dart:io
库中用于 HTTP 通信的一部分。
基本定义
HeaderValue
表示一个 HTTP 标头值,其中可能包含一个主值和可选参数。它可以解析字符串,如 "text/html; charset=utf-8"。
关键组件包括值本身和一个参数映射。该类提供了标头值的解析、构建和操作方法。
基本的 HeaderValue 解析
此示例显示了 Content-Type 标头值的基本解析。
import 'dart:io'; void main() { var header = 'text/html; charset=utf-8'; var parsed = HeaderValue.parse(header); print('Value: ${parsed.value}'); print('Charset: ${parsed.parameters['charset']}'); }
我们将 Content-Type 标头字符串解析为 HeaderValue 对象。value 属性包含 "text/html",而 parameters 包含 "charset=utf-8"。
$ dart main.dart Value: text/html Charset: utf-8
处理质量值
此示例演示了带有质量值的 Accept 标头的解析。
import 'dart:io'; void main() { var accept = 'text/html,application/xhtml+xml;q=0.9,image/webp;q=0.8'; var values = accept.split(',').map((s) => HeaderValue.parse(s.trim())); for (var value in values) { print('Type: ${value.value}, Quality: ${value.parameters['q'] ?? '1.0'}'); } }
我们解析了一个包含多个媒体类型和质量因子的 Accept 标头。q 参数指示优先级,值越高越受欢迎。
$ dart main.dart Type: text/html, Quality: 1.0 Type: application/xhtml+xml, Quality: 0.9 Type: image/webp, Quality: 0.8
创建 HeaderValue
此示例显示了如何以编程方式构造 HeaderValue 对象。
import 'dart:io'; void main() { var contentType = HeaderValue('application/json', {'charset': 'utf-8'}); print(contentType.toString()); var cacheControl = HeaderValue('no-cache', {'max-age': '0'}); print(cacheControl.toString()); }
我们创建了带有主值和参数的 HeaderValue 实例。toString() 方法会将其正确格式化为 HTTP 标头。
$ dart main.dart application/json; charset=utf-8 no-cache; max-age=0
解析复杂标头
此示例处理一个带有多个参数的复杂 Set-Cookie 标头。
import 'dart:io'; void main() { var cookie = 'sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Lax'; var parsed = HeaderValue.parse(cookie, parameterSeparator: ';'); print('Cookie value: ${parsed.value}'); print('Parameters:'); parsed.parameters.forEach((key, value) { print(' $key: ${value.isEmpty ? "(flag)" : value}'); }); }
我们解析了一个 Set-Cookie 标头,并对分号分隔符进行了特殊处理。没有值的标志(如 HttpOnly)会显示为空参数。
$ dart main.dart Cookie value: sessionId=abc123 Parameters: Path: / HttpOnly: (flag) Secure: (flag) SameSite: Lax
处理多个值
此示例处理单个标头字段中的多个值。
import 'dart:io'; void main() { var vary = 'Accept-Encoding, User-Agent, Accept-Language'; var values = vary.split(',').map((s) => s.trim()); print('Vary header values:'); for (var value in values) { print('- $value'); } // For headers that might have parameters on each value var link = '; rel=preload; as=style, ; rel=preload'; var linkValues = link.split(',').map((s) => HeaderValue.parse(s.trim())); print('\nLink header values:'); for (var value in linkValues) { print('Resource: ${value.value}'); print(' rel: ${value.parameters['rel']}'); if (value.parameters['as'] != null) { print(' as: ${value.parameters['as']}'); } } }
我们处理包含多个值的标头,包括简单值和带参数的值。Link 标头示例展示了复杂的多个值解析。
$ dart main.dart Vary header values: - Accept-Encoding - User-Agent - Accept-Language Link header values: Resource: rel: preload as: style Resource: rel: preload
最佳实践
- 区分大小写: HTTP 标头不区分大小写
- 参数处理: 始终检查 null 参数
- 特殊字符: 正确处理带引号的值
- 边缘情况: 考虑格式错误的标头
- 性能: 尽可能重用已解析的值
来源
本教程通过实际示例介绍了 Dart 的 HeaderValue 类,展示了针对各种用例的 HTTP 标头解析、构建和操作。
作者
列出 所有 Dart 教程。