Dart HttpClient
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpClient 类提供了一种强大的方式来发出 HTTP 请求。它支持各种 HTTP 方法、标头以及请求/响应处理。
HttpClient 是 Dart dart:io 库的一部分,适用于命令行和服务器应用程序。它不适用于浏览器环境。
基本定义
HttpClient 是用于发出 HTTP 请求的客户端。它支持 GET、POST、PUT、DELETE 以及其他具有可配置选项的 HTTP 方法。
主要功能包括连接持久化、Cookie 管理和请求配置。它提供了对请求的高级和低级控制。
基本的 GET 请求
此示例展示了如何发出简单的 GET 请求来获取数据。
import 'dart:io';
import 'dart:convert';
void main() async {
var client = HttpClient();
try {
var request = await client.getUrl(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
var response = await request.close();
if (response.statusCode == HttpStatus.ok) {
var json = await response.transform(utf8.decoder).join();
print('Response data: $json');
} else {
print('Request failed with status: ${response.statusCode}');
}
} finally {
client.close();
}
}
我们创建一个 HttpClient 实例,发出一个 GET 请求,并处理响应。客户端在使用后必须关闭以释放资源。我们使用 async/await 进行异步操作。
$ dart main.dart
Response data: {
"userId": 1,
"id": 1,
"title": "sunt aut facere...",
"body": "quia et suscipit..."
}
带 JSON 的 POST 请求
此示例演示了如何使用 POST 请求发送 JSON 数据。
import 'dart:io';
import 'dart:convert';
void main() async {
var client = HttpClient();
try {
var 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
}));
var response = await request.close();
var responseBody = await response.transform(utf8.decoder).join();
print('Response status: ${response.statusCode}');
print('Response body: $responseBody');
} finally {
client.close();
}
}
我们使用 JSON 内容类型配置 POST 请求,并发送编码后的 JSON 数据。服务器响应创建的资源,包括分配的 ID。标头在写入请求正文之前设置。
$ dart main.dart
Response status: 201
Response body: {
"title": "foo",
"body": "bar",
"userId": 1,
"id": 101
}
处理标头
此示例展示了如何设置请求标头和读取响应标头。
import 'dart:io';
void main() async {
var client = HttpClient();
try {
var request = await client.getUrl(
Uri.parse('https://httpbin.org/headers'));
// Set custom headers
request.headers.add('X-Custom-Header', 'DartClient');
request.headers.add('Accept', 'application/json');
var response = await request.close();
// Print response headers
print('Response headers:');
response.headers.forEach((name, values) {
print('$name: $values');
});
// Print response body
var body = await response.transform(utf8.decoder).join();
print('\nResponse body:\n$body');
} finally {
client.close();
}
}
我们将自定义标头添加到请求中,并检查响应标头。httpbin.org 服务在响应正文中回显我们的请求标头。标头值始终是列表,因为 HTTP 允许为每个标头设置多个值。
$ dart main.dart
Response headers:
date: [Wed, 03 Apr 2024 12:00:00 GMT]
content-type: [application/json]
...
Response body:
{
"headers": {
"Accept": "application/json",
"Host": "httpbin.org",
"X-Custom-Header": "DartClient",
...
}
}
文件下载
此示例演示了如何下载文件并将其本地保存。
import 'dart:io';
void main() async {
var client = HttpClient();
var file = File('downloaded_image.jpg');
try {
var request = await client.getUrl(
Uri.parse('https://picsum.photos/200/300.jpg'));
var response = await request.close();
if (response.statusCode == HttpStatus.ok) {
await response.pipe(file.openWrite());
print('File downloaded successfully');
} else {
print('Download failed: ${response.statusCode}');
}
} finally {
client.close();
}
}
我们下载一个图片文件,并将其直接流式传输到本地文件。pipe() 方法高效地处理数据传输,而无需将整个文件加载到内存中。这种方法适用于大文件。
$ dart main.dart File downloaded successfully
错误处理
本示例展示了 HTTP 请求的正确错误处理。
import 'dart:io';
void main() async {
var client = HttpClient();
try {
var request = await client.getUrl(
Uri.parse('https://nonexistent.example.com'));
var response = await request.close();
var body = await response.transform(utf8.decoder).join();
print(body);
} on SocketException catch (e) {
print('Network error: $e');
} on HttpException catch (e) {
print('HTTP error: $e');
} on Exception catch (e) {
print('Unexpected error: $e');
} finally {
client.close();
}
}
我们演示了如何捕获 HTTP 请求期间可能发生的特定异常。SocketException 处理网络问题,HttpException 捕获 HTTP 特定的错误。始终在 finally 块中关闭客户端。
$ dart main.dart Network error: SocketException: Failed host lookup...
最佳实践
- 重用客户端:为每个应用程序创建一个 HttpClient
- 关闭客户端:完成后始终关闭 HttpClient
- 错误处理:捕获特定异常
- 流式传输响应:对大响应使用流
- 超时:实现请求超时
来源
本教程通过实际示例介绍了 Dart 的 HttpClient 类,展示了基本请求、标头、文件下载和错误处理。
作者
列出 所有 Dart 教程。