ZetCode

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 请求来获取数据。

main.dart
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 请求。

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

处理响应标头

此示例演示如何访问和处理响应标头。

main.dart
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 请求的全面错误处理。

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

带进度的文件上传

此示例演示带进度跟踪的文件上传。

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

最佳实践

来源

Dart HttpRequest 文档

本教程涵盖了 Dart 的 HttpRequest 类,通过实际示例展示了各种 HTTP 操作、错误处理和上传等高级功能。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有超过十年的经验。

列出 所有 Dart 教程