Dart HttpServer
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpServer
类提供了创建 HTTP 服务器的功能。它是 dart:io
库的一部分,支持构建 Web 应用程序和 API。
HttpServer 处理传入的 HTTP 请求并管理响应。它支持请求路由、标头和不同的 HTTP 方法等功能。
基本定义
HttpServer
是一个在 Dart 中实现 HTTP 服务器的类。它监听指定端口和地址上的传入 HTTP 请求。
主要功能包括请求处理、响应生成和对持久连接的支持。它构成了 Dart 中 Web 应用程序的基础。
基本的 HttpServer 示例
此示例展示了一个响应所有请求的简单 HTTP 服务器。
import 'dart:io'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); print('Server running on http://${server.address.host}:${server.port}'); await for (HttpRequest request in server) { request.response ..headers.contentType = ContentType.text ..write('Hello from Dart server!') ..close(); } }
我们在端口 8080 上的 localhost 上绑定了一个 HttpServer。对于每个请求,我们发送一个简单的文本响应。服务器使用 Futures 异步运行。
$ dart main.dart Server running on https://:8080
处理不同的路由
此示例演示了 HTTP 服务器中的基本路由处理。
import 'dart:io'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); await for (HttpRequest request in server) { switch (request.uri.path) { case '/': request.response.write('Home page'); break; case '/about': request.response.write('About page'); break; default: request.response.statusCode = HttpStatus.notFound; request.response.write('Not found'); } await request.response.close(); } }
我们检查请求 URI 路径以提供不同的响应。默认情况使用 404 状态码处理未知路由。每个响应都必须关闭。
$ dart main.dart
处理 POST 请求
此示例展示了如何处理 POST 请求和读取请求体。
import 'dart:io'; import 'dart:convert'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); await for (HttpRequest request in server) { if (request.method == 'POST') { try { final content = await utf8.decoder.bind(request).join(); final data = jsonDecode(content) as Map; request.response.write('Received: ${data['message']}'); } catch (e) { request.response.statusCode = HttpStatus.badRequest; request.response.write('Invalid request'); } } else { request.response.statusCode = HttpStatus.methodNotAllowed; request.response.write('Only POST supported'); } await request.response.close(); } }
我们检查请求方法并将 POST 数据作为 JSON 处理。请求体是异步读取的。错误处理确保了稳健的运行。
$ dart main.dart
服务静态文件
此示例演示了如何从目录中服务静态文件。
import 'dart:io'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); final staticDir = Directory('static'); await for (HttpRequest request in server) { final filePath = 'static${request.uri.path}'; final file = File(filePath); if (await file.exists()) { await request.response.addStream(file.openRead()); } else { request.response.statusCode = HttpStatus.notFound; request.response.write('File not found'); } await request.response.close(); } }
我们从与请求路径匹配的“static”目录中服务文件。文件内容直接流式传输到响应中以提高效率。
$ dart main.dart
WebSocket 服务器
此示例展示了如何将 HTTP 连接升级到 WebSocket。
import 'dart:io'; Future<void> main() async { final server = await HttpServer.bind('localhost', 8080); await for (HttpRequest request in server) { if (WebSocketTransformer.isUpgradeRequest(request)) { final socket = await WebSocketTransformer.upgrade(request); socket.listen((data) { socket.add('Echo: $data'); }); } else { request.response.statusCode = HttpStatus.badRequest; request.response.write('WebSocket expected'); await request.response.close(); } } }
我们检查 WebSocket 升级请求并单独处理它们。WebSocket 连接允许与客户端进行双向通信。
$ dart main.dart
最佳实践
- 错误处理:始终处理潜在的 I/O 错误
- 资源管理:妥善关闭响应
- 异步操作:对异步操作使用 await
- 安全:验证所有传入数据
- 性能:流式传输大型响应
来源
本教程介绍了 Dart 的 HttpServer 类,并通过实际示例展示了基本用法、路由处理、POST 处理、静态文件和服务 WebSockets。
作者
列出 所有 Dart 教程。