ZetCode

Dart HttpClientRequest

最后修改于 2025 年 4 月 4 日

Dart 中的 HttpClientRequest 类代表一个 HTTP 客户端请求。它用于配置和向服务器发送 HTTP 请求。此类提供了设置标头、写入数据和管理请求生命周期的方法。

HttpClientRequest 是 Dart dart:io 库的一部分。它由 HttpClient 在打开连接时创建。该类支持各种 HTTP 方法,如 GET、POST、PUT 和 DELETE。

基本定义

HttpClientRequest 代表一个传出的 HTTP 请求。它提供了对请求标头、请求正文输出流和响应处理的访问。

主要功能包括标头操作、请求方法配置和基于流的正文写入。它与 HttpClientResponse 配合使用以实现完整的 HTTP 客户端功能。

基本的 GET 请求

此示例展示了如何使用 HttpClientRequest 进行简单的 GET 请求。

main.dart
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  var client = HttpClient();
  
  try {
    HttpClientRequest request = await client.getUrl(
      Uri.parse('https://jsonplaceholder.typicode.com/posts/1')
    );
    
    HttpClientResponse response = await request.close();
    var responseBody = await response.transform(utf8.decoder).join();
    
    print('Status code: ${response.statusCode}');
    print('Response body:\n$responseBody');
  } finally {
    client.close();
  }
}

我们创建一个 HttpClient,然后使用 getUrl() 创建一个 GET 请求。配置完成后,我们关闭请求并等待响应。响应正文将从 UTF-8 解码。

$ dart main.dart
Status code: 200
Response body:
{
  "userId": 1,
  "id": 1,
  "title": "...",
  "body": "..."
}

带 JSON 正文的 POST 请求

此示例演示了发送带 JSON 数据的 POST 请求。

main.dart
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  var client = HttpClient();
  
  try {
    HttpClientRequest request = await client.postUrl(
      Uri.parse('https://jsonplaceholder.typicode.com/posts')
    );
    
    request.headers.contentType = ContentType.json;
    request.write(jsonEncode({
      'title': 'foo',
      'body': 'bar',
      'userId': 1
    }));
    
    HttpClientResponse response = await request.close();
    var responseBody = await response.transform(utf8.decoder).join();
    
    print('Status code: ${response.statusCode}');
    print('Response body:\n$responseBody');
  } finally {
    client.close();
  }
}

我们创建一个 POST 请求,并将 Content-Type 标头设置为 application/json。请求正文以 JSON 编码的数据写入。服务器响应已创建的资源表示。

$ dart main.dart
Status code: 201
Response body:
{
  "title": "foo",
  "body": "bar",
  "userId": 1,
  "id": 101
}

设置自定义标头

此示例展示了如何为请求设置自定义标头。

main.dart
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  var client = HttpClient();
  
  try {
    HttpClientRequest request = await client.getUrl(
      Uri.parse('https://httpbin.org/headers')
    );
    
    request.headers.add('X-Custom-Header', 'DartClient');
    request.headers.add('Accept', 'application/json');
    
    HttpClientResponse response = await request.close();
    var responseBody = await response.transform(utf8.decoder).join();
    
    print('Status code: ${response.statusCode}');
    print('Response body:\n$responseBody');
  } finally {
    client.close();
  }
}

我们使用 headers 属性向请求添加自定义标头。httpbin.org 服务在其响应中回显所有接收到的标头。这有助于验证标头的传输。

$ dart main.dart
Status code: 200
Response body:
{
  "headers": {
    "Accept": "application/json",
    "Host": "httpbin.org",
    "X-Custom-Header": "DartClient",
    ...
  }
}

使用 PUT 请求上传文件

此示例演示了使用 PUT 请求上传文件。

main.dart
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  var client = HttpClient();
  var file = File('example.txt');
  
  try {
    HttpClientRequest request = await client.putUrl(
      Uri.parse('https://example.com/upload')
    );
    
    request.headers.contentType = ContentType.text;
    request.contentLength = await file.length();
    await request.addStream(file.openRead());
    
    HttpClientResponse response = await request.close();
    print('Upload complete. Status: ${response.statusCode}');
  } finally {
    client.close();
  }
}

我们创建一个 PUT 请求,并根据文件大小设置内容长度。文件内容直接流式传输到请求正文中。这种方法对于大文件来说内存效率很高。

$ dart main.dart
Upload complete. Status: 200

处理重定向

此示例展示了如何配置和处理 HTTP 重定向。

main.dart
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  var client = HttpClient();
  
  try {
    client.maxRedirects = 3; // Set maximum redirects
    HttpClientRequest request = await client.getUrl(
      Uri.parse('http://google.com')
    );
    
    request.followRedirects = true;
    HttpClientResponse response = await request.close();
    
    print('Final status: ${response.statusCode}');
    print('Redirect count: ${response.redirects.length}');
    print('Final URL: ${response.redirects.last?.location}');
  } finally {
    client.close();
  }
}

我们配置客户端以遵循重定向并设置最大限制。响应对象包含有关发生的所有重定向的信息。这有助于调试和分析重定向链。

$ dart main.dart
Final status: 200
Redirect count: 1
Final URL: https://www.google.com/

最佳实践

来源

Dart HttpClientRequest 文档

本教程介绍了 Dart 的 HttpClientRequest 类,并通过实际示例展示了各种 HTTP 方法、标头、文件上传和重定向处理。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 Dart 教程