Dart HttpRequest
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpRequest 类提供了向 Web 服务器发出 HTTP 请求的功能。它是 Dart 网页平台库的一部分。
HttpRequest 支持各种 HTTP 方法,包括 GET、POST、PUT 和 DELETE。它处理同步和异步请求以及响应处理。
基本定义
HttpRequest 是一个客户端 API,用于从 Dart Web 应用发出 HTTP 请求。它在 dart:html 库中可用。
主要功能包括请求配置、标头管理、响应处理和错误管理。它仅在浏览器环境中运行。
基本的 GET 请求
此示例演示如何发出简单的 GET 请求来获取数据。
import 'dart:html';
void main() async {
try {
var response = await HttpRequest.getString('https://jsonplaceholder.typicode.com/posts/1');
print('Response: $response');
} catch (e) {
print('Error: $e');
}
}
我们使用 HttpRequest.getString() 来进行简单的 GET 请求。该方法返回一个 Future,其中响应体为字符串。错误处理会捕获网络问题。
$ dart main.dart
Response: {
"userId": 1,
"id": 1,
"title": "...",
"body": "..."
}
带 JSON 的 POST 请求
此示例演示如何发送带 JSON 数据的 POST 请求。
import 'dart:html';
import 'dart:convert';
void main() async {
var url = 'https://jsonplaceholder.typicode.com/posts';
var data = {
'title': 'foo',
'body': 'bar',
'userId': 1
};
try {
var request = await HttpRequest.request(
url,
method: 'POST',
sendData: jsonEncode(data),
requestHeaders: {
'Content-type': 'application/json; charset=UTF-8'
}
);
print('Status: ${request.status}');
print('Response: ${request.responseText}');
} catch (e) {
print('Error: $e');
}
}
我们创建一个带 JSON 数据的 POST 请求。requestHeaders 指定了内容类型。HttpRequest.request() 提供了对请求配置的完全控制。
$ dart main.dart
Status: 201
Response: {
"title": "foo",
"body": "bar",
"userId": 1,
"id": 101
}
处理响应标头
此示例演示如何访问和处理响应标头。
import 'dart:html';
void main() async {
try {
var request = await HttpRequest.request(
'https://jsonplaceholder.typicode.com/posts/1'
);
print('Status: ${request.status}');
print('Content-Type: ${request.getResponseHeader('content-type')}');
var headers = request.responseHeaders;
print('All headers:');
headers.forEach((key, value) => print('$key: $value'));
} catch (e) {
print('Error: $e');
}
}
在成功请求后,我们检查响应标头。getResponseHeader() 访问特定标头,而 responseHeaders 提供所有标头。
$ dart main.dart Status: 200 Content-Type: application/json; charset=utf-8 All headers: cache-control: public, max-age=14400 content-type: application/json; charset=utf-8 ...
错误处理
此示例演示了对 HTTP 请求的全面错误处理。
import 'dart:html';
void main() async {
try {
var request = await HttpRequest.request(
'https://jsonplaceholder.typicode.com/nonexistent',
method: 'GET'
);
if (request.status >= 200 && request.status < 300) {
print('Success: ${request.responseText}');
} else {
print('HTTP Error: ${request.status}');
print('Status text: ${request.statusText}');
}
} catch (e) {
if (e is ErrorEvent) {
print('Network error: ${e.message}');
} else {
print('Unexpected error: $e');
}
}
}
我们处理 HTTP 状态错误和网络错误。该示例检查状态码,并为不同的失败场景提供不同的错误消息。
$ dart main.dart HTTP Error: 404 Status text: Not Found
带进度的文件上传
此示例演示带进度跟踪的文件上传。
import 'dart:html';
void main() {
var fileInput = FileUploadInputElement();
fileInput.onChange.listen((e) {
var file = fileInput.files!.first;
var formData = FormData();
formData.appendBlob('file', file, file.name);
var request = HttpRequest();
request.open('POST', 'https://example.com/upload');
request.upload.onProgress.listen((ProgressEvent e) {
if (e.lengthComputable) {
var percent = (e.loaded / e.total * 100).round();
print('Upload progress: $percent%');
}
});
request.onLoad.listen((e) {
if (request.status == 200) {
print('Upload complete');
}
});
request.send(formData);
});
document.body!.append(fileInput);
}
我们创建一个带进度跟踪的文件上传。upload.onProgress 事件在上传期间提供更新。此示例在浏览器环境中运行。
$ dart main.dart Upload progress: 25% Upload progress: 50% Upload progress: 75% Upload progress: 100% Upload complete
最佳实践
- CORS: 正确处理跨域资源共享
- 超时: 实现请求超时以提高可靠性
- 标头: 设置适当的请求标头
- 错误: 同时处理网络和 HTTP 错误
- 安全: 在处理所有响应之前进行验证
来源
本教程涵盖了 Dart 的 HttpRequest 类,通过实际示例展示了各种 HTTP 操作、错误处理和上传等高级功能。
作者
列出 所有 Dart 教程。