ZetCode

Dart HeaderValue

最后修改于 2025 年 4 月 4 日

Dart 中的 HeaderValue 类提供了用于解析和操作 HTTP 标头值的工具。它可以处理标头中常见的简单值和复杂参数。

HeaderValue 可以解析带有参数、质量因子和其他元数据的 H 标头值。它是 Dart 的 dart:io 库中用于 HTTP 通信的一部分。

基本定义

HeaderValue 表示一个 HTTP 标头值,其中可能包含一个主值和可选参数。它可以解析字符串,如 "text/html; charset=utf-8"。

关键组件包括值本身和一个参数映射。该类提供了标头值的解析、构建和操作方法。

基本的 HeaderValue 解析

此示例显示了 Content-Type 标头值的基本解析。

main.dart
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 标头的解析。

main.dart
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 对象。

main.dart
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 标头。

main.dart
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

处理多个值

此示例处理单个标头字段中的多个值。

main.dart
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

最佳实践

来源

Dart HeaderValue 文档

本教程通过实际示例介绍了 Dart 的 HeaderValue 类,展示了针对各种用例的 HTTP 标头解析、构建和操作。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Dart 教程