Dart HttpResponse
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpResponse
类提供了在服务器应用程序中处理 HTTP 响应的功能。它是服务器端 Dart 编程的 dart:io
库的一部分。
HttpResponse 允许设置状态码、标头和写入响应正文。它通常与 HttpServer 一起用于创建 Web 服务器和 HTTP 服务。
基本定义
HttpResponse
表示可以发送回客户端的 HTTP 响应。它提供了控制响应状态、标头和正文的方法。
主要功能包括状态码管理、标头操作以及多种写入响应数据的方式。它与 HttpRequest 对象结合使用。
基本 HTTP 服务器响应
本示例展示了一个返回文本响应的简单 HTTP 服务器。
import 'dart:io'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); print('Server running on ${server.address}:${server.port}'); await for (HttpRequest request in server) { request.response ..statusCode = HttpStatus.ok ..write('Hello, World!') ..close(); } }
我们创建一个监听 8080 端口的 HTTP 服务器。对于每个请求,我们将状态码设置为 200 (OK),写入响应,然后关闭连接。
$ dart main.dart Server running on InternetAddress('127.0.0.1', IPv4):8080
设置响应标头
本示例演示了如何设置各种 HTTP 响应标头。
import 'dart:io'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); await for (HttpRequest request in server) { request.response ..headers.contentType = ContentType.html ..headers.set('X-Custom-Header', 'DartServer') ..headers.date = DateTime.now() ..write(''' <html> <body> <h1>Hello from Dart!</h1> </body> </html> ''') ..close(); } }
我们设置内容类型为 HTML,添加一个自定义标头,并设置响应日期。headers 属性提供了对响应所有 HTTP 标头的访问。
$ dart main.dart
提供 JSON 数据
本示例展示了如何从 HTTP 服务器返回 JSON 数据。
import 'dart:io'; import 'dart:convert'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); await for (HttpRequest request in server) { final data = { 'message': 'Hello from Dart', 'timestamp': DateTime.now().toIso8601String(), 'status': 'success' }; request.response ..statusCode = HttpStatus.ok ..headers.contentType = ContentType.json ..write(jsonEncode(data)) ..close(); } }
我们用数据创建一个 Dart Map,将内容类型设置为 JSON,然后将数据编码为 JSON 格式,再写入响应。
$ dart main.dart
处理不同的状态码
本示例演示了如何在响应中使用不同的 HTTP 状态码。
import 'dart:io'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); await for (HttpRequest request in server) { try { if (request.uri.path == '/secret') { request.response ..statusCode = HttpStatus.forbidden ..write('Access denied') ..close(); } else if (request.uri.path == '/notfound') { request.response ..statusCode = HttpStatus.notFound ..write('Page not found') ..close(); } else { request.response ..statusCode = HttpStatus.ok ..write('Welcome!') ..close(); } } catch (e) { request.response ..statusCode = HttpStatus.internalServerError ..write('Server error: $e') ..close(); } } }
我们检查请求路径并相应地返回不同的状态码。这展示了如何在 Web 服务器应用程序中处理各种场景。
$ dart main.dart
流式传输大型响应
本示例演示了如何高效地流式传输大型响应。
import 'dart:io'; import 'dart:async'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); await for (HttpRequest request in server) { if (request.uri.path == '/stream') { final response = request.response; response.headers.contentType = ContentType.text; final timer = Timer.periodic(Duration(seconds: 1), (timer) { response.write('Data chunk at ${DateTime.now()}\n'); if (timer.tick >= 5) { timer.cancel(); response.close(); } }); } else { request.response ..write('Send request to /stream for streaming data') ..close(); } } }
我们创建一个流式响应,在 5 秒内每秒发送数据块。这对于大型响应或实时数据非常有用,而无需一次将所有数据加载到内存中。
$ dart main.dart
最佳实践
- 始终关闭:确保响应被正确关闭
- 错误处理:优雅地处理潜在的 I/O 错误
- 先标头:在写入内容之前设置标头
- 内容类型:始终指定适当的内容类型
- 流式传输:对大型响应使用流式传输
来源
本教程介绍了 Dart 的 HttpResponse 类,并通过实际示例展示了基本用法、标头管理、状态码和流式响应。
作者
列出 所有 Dart 教程。