Deno标准库HTTP模块深度解析
Deno标准库中的HTTP模块(deno_std/http/mod.ts
)为开发者提供了构建HTTP服务器和客户端的丰富工具集。本文将深入剖析这个模块的核心功能和使用方法。
模块概览
HTTP模块是Deno标准库中最重要的模块之一,它封装了Deno原生的HTTP服务器功能,提供了更加用户友好的API接口。该模块包含以下主要功能组件:
- 文件服务器
- HTTP状态码处理
- HTTP错误处理
- HTTP方法工具
- 内容协商
- 用户代理处理
- 路由功能
核心功能详解
1. 文件服务器
文件服务器功能允许开发者快速启动一个本地静态文件服务器:
deno run --allow-net --allow-read jsr:@std/http/file-server
当添加--allow-sys=networkInterfaces
权限时,服务器还会显示局域网访问地址。
2. HTTP状态码处理
模块提供了标准化的HTTP状态码和状态文本处理,开发者可以方便地获取状态码对应的标准描述:
import { STATUS_TEXT } from "@std/http/status";
console.log(STATUS_TEXT[404]); // 输出 "Not Found"
3. HTTP错误处理
模块为每个HTTP错误状态码提供了专门的错误类,便于结构化错误处理:
import { BadRequest } from "@std/http/errors";
try {
if (invalidRequest) {
throw new BadRequest("Invalid request data");
}
} catch (e) {
if (e instanceof BadRequest) {
// 处理400错误
}
}
4. 内容协商
内容协商功能帮助服务器根据客户端请求头(Accept
, Accept-Language
, Accept-Encoding
)选择最合适的响应内容:
import { accepts } from "@std/http/negotiation";
const preferredType = accepts(req, ["text/html", "application/json"]);
// 返回客户端最优先接受的类型
5. 用户代理处理
UserAgent
类可以解析User-Agent字符串,获取浏览器和操作系统信息:
import { UserAgent } from "@std/http/user-agent";
const userAgent = new UserAgent(req.headers.get("user-agent") ?? "");
console.log(userAgent.browser.name); // 输出浏览器名称
console.log(userAgent.os.name); // 输出操作系统名称
6. 路由功能
路由系统基于URLPattern实现,支持路径参数和多种HTTP方法:
import { route } from "@std/http/unstable-route";
const routes = [
{
pattern: new URLPattern({ pathname: "/users/:id" }),
handler: (_req, _info, params) =>
new Response(`User ID: ${params?.pathname.groups.id}`),
},
];
Deno.serve(route(routes, defaultHandler));
实用工具
Cookie处理
模块提供了完整的Cookie处理功能,包括解析和序列化:
import { getCookies } from "@std/http/cookie";
const cookies = getCookies(req.headers);
console.log(cookies.sessionId);
ETag生成
自动为响应内容生成ETag,支持弱验证和强验证:
import { calculate } from "@std/http/etag";
const etag = calculate(responseBody);
response.headers.set("ETag", etag);
Server-Sent Events
支持服务器推送事件(SSE)的实现:
import { ServerSentEventStream } from "@std/http/server_sent_event_stream";
const stream = new ServerSentEventStream();
stream.dispatchMessage({ data: "Hello", event: "greeting" });
最佳实践
-
权限控制:始终最小化权限,文件服务器需要
--allow-net
和--allow-read
权限。 -
错误处理:使用内置的错误类确保错误响应符合HTTP标准。
-
内容协商:在处理多种响应格式时,优先使用
accepts
函数确定最佳响应类型。 -
路由组织:对于复杂应用,将路由配置单独组织在配置文件中。
-
性能考虑:对于静态文件服务,考虑使用ETag缓存机制减少带宽消耗。
总结
Deno标准库的HTTP模块提供了从基础到高级的完整HTTP功能支持,既适合快速原型开发,也能满足生产环境需求。其模块化设计允许开发者按需引入特定功能,避免不必要的代码体积。通过合理利用这些工具,开发者可以构建高效、规范的HTTP服务。