Deno 是一个现代的 JavaScript 和 TypeScript 运行时,它内置了许多安全功能,并且提供了一种处理 HTTP 请求的新方法。本章将详细介绍如何使用 Deno 来处理 HTTP 请求。
创建简单的 HTTP 服务器
创建一个简单的 HTTP 服务器是学习如何使用 Deno 处理 HTTP 请求的基础。首先,让我们来看一下如何通过 Deno 创建一个基本的 HTTP 服务器。
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
const server = serve({ port: 8000 });
console.log("Server running on http://localhost:8000");
for await (const req of server) {
req.respond({ body: "Hello World\n" });
}这段代码首先导入了 serve 函数,然后通过这个函数创建了一个监听 8000 端口的服务器。对于每个传入的请求,服务器会简单地返回 "Hello World"。
接收和解析请求参数
在实际应用中,我们经常需要处理来自客户端的请求参数。这些参数可以通过 URL、查询字符串或请求体传递给服务器。Deno 提供了多种方式来接收和解析这些参数。
URL 参数
URL 参数通常通过路径传递。例如,如果你的 API 路径是 /api/users/:id,那么 :id 就是一个 URL 参数。你可以使用以下代码来获取这些参数:
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
const server = serve({ port: 8000 });
for await (const req of server) {
const url = new URL(req.url);
console.log(url.pathname); // 输出 /api/users/123
console.log(url.searchParams.get('id')); // 输出 123
req.respond({ body: `You requested user with ID ${url.pathname.split('/').pop()}` });
}查询字符串
查询字符串通常是 URL 中的一部分,用于向服务器发送额外的信息。你可以通过 URLSearchParams 对象来访问它们。
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
const server = serve({ port: 8000 });
for await (const req of server) {
const url = new URL(req.url);
const params = url.searchParams;
console.log(params.get('name')); // 输出可能的名字参数值
req.respond({ body: `Query string parameters: ${params.toString()}` });
}请求体
当客户端通过 POST 或 PUT 请求发送数据时,这些数据会出现在请求体中。为了从请求体中读取数据,你需要使用 req.body 属性。
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
import { JSONStream } from "https://deno.land/std@0.148.0/streams/json_stream.ts";
const server = serve({ port: 8000 });
for await (const req of server) {
const body = await req.body.json();
console.log(body); // 输出请求体中的 JSON 数据
req.respond({ body: `Received data: ${JSON.stringify(body)}` });
}响应处理
除了发送简单的文本响应之外,你还可以发送更复杂的响应,如 JSON、HTML 或者静态文件。
发送 JSON 响应
在许多 Web 应用中,API 通常会返回 JSON 格式的响应。下面是如何使用 Deno 发送 JSON 响应的例子:
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
import { json } from "https://deno.land/std@0.148.0/http/middleware/json.ts";
const server = serve({ port: 8000 });
server.use(json());
for await (const req of server) {
if (req.url === "/api/data") {
req.respond({ body: { message: "Hello, this is a JSON response!" } });
}
}发送 HTML 响应
有时候,你可能需要发送 HTML 内容作为响应。这可以通过简单地设置响应头并发送 HTML 字符串来实现。
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
const server = serve({ port: 8000 });
for await (const req of server) {
if (req.url === "/html") {
req.respond({
headers: { "Content-Type": "text/html" },
body: "<h1>Hello, this is an HTML response!</h1>",
});
}
}发送静态文件
在开发 Web 应用时,有时需要提供一些静态资源,如图片、CSS 文件或 JavaScript 文件。Deno 提供了简单的机制来处理这些静态文件。
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
const server = serve({ port: 8000 });
for await (const req of server) {
const filePath = `./public${req.url}`;
try {
const data = await Deno.readFile(filePath);
req.respond({ headers: { "content-type": "text/html; charset=UTF-8" }, body: data });
} catch (_) {
req.respond({ status: 404, body: "File not found" });
}
}在这个例子中,服务器尝试从指定目录(这里是 ./public)读取请求的文件。如果文件存在,则返回文件内容;否则返回 404 错误。
中间件和路由
随着应用变得复杂,你可能会发现需要使用中间件来处理各种任务,如日志记录、错误处理等。Deno 提供了一些工具和库来帮助你管理这些需求。
使用中间件
中间件可以让你在请求到达最终处理程序之前对其进行操作。Deno 的标准库提供了 http/middleware 模块,你可以利用它来添加日志记录等功能。
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
import { log } from "https://deno.land/std@0.148.0/http/middleware/log.ts";
const server = serve({ port: 8000 });
server.use(log());
for await (const req of server) {
if (req.url === "/log-test") {
req.respond({ body: "This is a test request." });
}
}路由管理
随着应用规模的增长,你可能需要对不同的 URL 使用不同的处理逻辑。这时,路由管理就显得尤为重要。虽然 Deno 没有内置的路由系统,但你可以使用第三方库来简化这一过程。
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.148.0/http/server.ts";
import { router, get, post } from "https://deno.land/x/router@v1.0.0/mod.ts";
const routes = router()
.get("/", (ctx) => ctx.response.body = "Home page")
.get("/about", (ctx) => ctx.response.body = "About page")
.post("/submit", (ctx) => {
const body = ctx.request.body();
return ctx.response.body = `Received data: ${body}`;
});
const server = serve({ port: 8000 });
for await (const req of server) {
const handler = routes.lookup(req.method, req.url);
if (handler) {
handler(req);
} else {
req.respond({ status: 404, body: "Not Found" });
}
}在这个例子中,我们定义了几个路由,包括 GET 和 POST 方法。当请求到达时,路由器会查找匹配的处理函数并执行它。
以上就是关于 Deno 如何处理 HTTP 请求的详细讲解。希望这些示例能帮助你在实际项目中更好地使用 Deno。