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 请求。
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 请求。
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
}
设置自定义标头
此示例展示了如何为请求设置自定义标头。
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 请求上传文件。
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 重定向。
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/
最佳实践
- 关闭请求:始终使用 close() 关闭请求
- 错误处理:实现适当的错误处理
- 流式传输数据:对大型有效负载使用流
- 重用客户端:尽可能重用 HttpClient 实例
- 设置超时:配置超时以提高可靠性
来源
本教程介绍了 Dart 的 HttpClientRequest 类,并通过实际示例展示了各种 HTTP 方法、标头、文件上传和重定向处理。
作者
列出 所有 Dart 教程。