在现代 Web 应用程序中,HTTP 是一种非常重要的协议。由于 Node.js 从一开始就支持异步 I/O,因此 Node.js 与 HTTP 协议的结合非常良好。现在,我们有了一个新的 JS 运行时:Deno。
Deno 是一种相对较新的 JavaScript 和 TypeScript 运行时,因此我们需要探究探究有关 Deno 的基础知识,特别是在处理 HTTP 请求方面的知识。
前置说明
在开始学习 Deno 中的 HTTP 请求处理之前,有一些前置说明是必要的。
Deno 并不依赖于 Node.js 或 npm。它有自己的包管理器和类型检查工具。
和 Node.js 不同,Deno 使用其他机制来处理同步和异步操作:
异步操作:Deno 借助了 Promise 和 async/await 模式,让程序的控制流可以利用 await 语句来等待异步函数中的结果;
同步操作:Deno 则使用一个叫做 “Worker” 的实体来执行同步操作,这是一个类似于线程的概念。
HTTP 服务端
在 Deno 中运行一个HTTP服务端的基本结构如下所示。
// javascriptcn.com 代码示例 import { serve } from "https://deno.land/std/http/server.ts"; const server = serve({ port: 2019 }); // 绑定在本地2019端口 console.log("HTTP web server running..."); for await (const req of server) { // 在这里处理请求 }
在这段代码中,我们引入了 Deno 自带的 HTTP 模块,然后通过 serve
函数创建了一个服务实例,该函数需要一个端口作为参数,用于绑定服务地址。
然后我们再通过Sync的 console.log
方法打印一些信息以及成功启动了这个服务。
接下来,在它下面的 for ... of
循环中处理 HTTP 请求。
HTTP 请求处理函数
在 Deno 的 HTTP 模块中,处理请求的函数是 handle()
. handle()
方法是在 for ... of
循环中调用的。
下面是一个处理 HTTP GET 请求的例子。
// javascriptcn.com 代码示例 import { serve } from "https://deno.land/std/http/server.ts"; const server = serve({ port: 2019 }); console.log("HTTP web server running..."); async function handle(conn: any) { for await (const { request, respondWith } of Deno.serveHttp(conn)) { if (request.method === "GET") { const body = `Hello, ${request.url}`; respondWith(new Response(body)); } } } for await (const req of server) { handle(req.conn); }
在这个例子中,我们定义了一个 handle()
函数来处理从客户端发来的 HTTP 请求,并且通过 respondWith()
方法返回一个 HTTP 响应。
为了触发 handle()
函数,我们需要通过循环依次监听HTTP请求。这里我们使用了 for ... of
循环来监听服务实例中的请求。
HTTP POST 请求处理
除了 GET 请求,Deno 也支持 POST 请求。
下面是一个处理 HTTP POST 请求的例子。
// javascriptcn.com 代码示例 import { serve } from "https://deno.land/std/http/server.ts"; const server = serve({ port: 2019 }); console.log("HTTP web server running..."); async function handle(conn: any) { for await (const { request, respondWith } of Deno.serveHttp(conn)) { if (request.method === "POST") { const requestJson = await request.json(); console.log(requestJson); const body = {message: "Post received!"}; respondWith(new Response(JSON.stringify(body), {headers: {"Content-Type": "application/json"}})); } } } for await (const req of server) { handle(req.conn); }
在这个例子中,我们使用了 request.json()
方法来获取请求中的 JSON 数据,并把它打印出来。
我们还在响应中使用了 Content-Type
标头来指定返回的响应数据类型为 JSON。在这里我们使用JSON.stringify来序列化并将body的类型设置为 "application/json"。
总结
在这份指南中,我们讨论了 Deno 中 HTTP 请求处理的基础知识,包括如何使用 Deno 内置的 HTTP 模块来创建 HTTP 服务端以及如何处理 HTTP 请求。我们还提供了一些示例代码,帮助您更好的理解这些基础知识。
在以后的学习中,我们可以深入探索 Deno 的各种功能,如使用 Deno 来读写文件、部署 Deno 应用到生产环境等。当我们深入了解这些知识后,我们将能够更加熟悉 Deno,并且可以在我们的下一份 Web 应用程序中更好地利用它。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654dea547d4982a6eb747282