介绍
Deno 是一个新的 JavaScript/TypeScript 运行时,由 Node.js 的创始人 Ryan Dahl 开发。Deno 采用了 V8 引擎和 Rust 编写的底层模块,可以在浏览器之外运行 JavaScript/TypeScript 代码。Deno 支持模块化开发、异步 I/O、ES6+ 特性和 TypeScript 等功能,且在安全性、可维护性和性能方面有很多优势。
REST API 是一种基于 HTTP 协议的应用程序接口,可以实现客户端和服务器之间的数据交互。REST API 通常使用 JSON 或 XML 格式传输数据,并使用 HTTP 方法(如 GET、POST、PUT、DELETE)来操作资源。在 Deno 中,我们可以使用标准库中的 http
模块来开发 REST API。
本文将介绍如何从头开始学习 Deno 如何开发 REST API,包括搭建开发环境、创建 API 路由、处理请求和响应、使用中间件等内容。
搭建开发环境
首先,我们需要安装 Deno 运行时。可以通过以下命令在命令行中安装 Deno:
$ curl -fsSL https://deno.land/x/install/install.sh | sh
安装完成后,我们可以通过以下命令验证 Deno 是否安装成功:
$ deno --version
接下来,我们需要安装一个文本编辑器,以便编写代码。推荐使用 Visual Studio Code(VS Code)编辑器,并安装 Deno 扩展,以便在编辑器中使用 Deno。可以通过以下命令安装 Deno 扩展:
$ code --install-extension denoland.vscode-deno
现在,我们已经搭建好了 Deno 开发环境。
创建 API 路由
在 Deno 中,我们可以使用标准库中的 http
模块来创建 HTTP 服务器。首先,我们需要创建一个 server.ts
文件,并引入 http
模块:
import { serve } from "http"; const server = serve({ port: 8000 }); console.log("Server is running on http://localhost:8000"); for await (const req of server) { console.log(`${req.method} ${req.url}`); }
以上代码中,我们使用 serve
函数创建了一个监听 8000 端口的 HTTP 服务器,并在控制台输出了服务器运行的地址。然后,我们使用 for await
循环来监听客户端的请求,并输出请求的方法和路径。
现在,我们已经创建了一个简单的 HTTP 服务器。接下来,我们需要创建 API 路由,以便客户端可以通过不同的路径访问不同的资源。
import { serve } from "http"; const server = serve({ port: 8000 }); console.log("Server is running on http://localhost:8000"); for await (const req of server) { console.log(`${req.method} ${req.url}`); if (req.url === "/api/users") { if (req.method === "GET") { // 处理 GET 请求 } else if (req.method === "POST") { // 处理 POST 请求 } else if (req.method === "PUT") { // 处理 PUT 请求 } else if (req.method === "DELETE") { // 处理 DELETE 请求 } } else if (req.url === "/api/products") { if (req.method === "GET") { // 处理 GET 请求 } else if (req.method === "POST") { // 处理 POST 请求 } else if (req.method === "PUT") { // 处理 PUT 请求 } else if (req.method === "DELETE") { // 处理 DELETE 请求 } } else { req.respond({ status: 404, body: "Not Found" }); } }
以上代码中,我们在 for await
循环中使用了 if
语句来判断客户端请求的路径和方法,并分别处理不同的请求。如果客户端请求的路径不存在,则返回 404 状态码和错误信息。
处理请求和响应
在 REST API 中,客户端向服务器发送请求时,通常需要携带一些数据,例如查询参数、请求体和请求头等。服务器需要解析这些数据,并根据请求的路径和方法执行相应的操作,然后将结果返回给客户端。
在 Deno 中,我们可以使用标准库中的 Request
和 Response
类来处理请求和响应。以下是一个简单的示例:
import { serve } from "http"; const server = serve({ port: 8000 }); console.log("Server is running on http://localhost:8000"); for await (const req of server) { console.log(`${req.method} ${req.url}`); if (req.url === "/api/users") { if (req.method === "GET") { const params = new URL(req.url, `http://${req.headers.get("host")}`).searchParams; const id = params.get("id"); if (id) { req.respond({ body: `Get user with id ${id}` }); } else { req.respond({ body: "Get all users" }); } } else if (req.method === "POST") { const body = await req.json(); req.respond({ body: `Create user with name ${body.name}` }); } else if (req.method === "PUT") { const params = new URL(req.url, `http://${req.headers.get("host")}`).searchParams; const id = params.get("id"); const body = await req.json(); req.respond({ body: `Update user with id ${id} and name ${body.name}` }); } else if (req.method === "DELETE") { const params = new URL(req.url, `http://${req.headers.get("host")}`).searchParams; const id = params.get("id"); req.respond({ body: `Delete user with id ${id}` }); } } else if (req.url === "/api/products") { // 处理产品资源的请求 } else { req.respond({ status: 404, body: "Not Found" }); } }
以上代码中,我们在 GET
请求中解析了查询参数,并根据参数的值返回不同的结果;在 POST
请求中解析了请求体,并根据请求体的内容创建新的资源;在 PUT
请求中同时解析了查询参数和请求体,并根据参数和请求体的内容更新指定的资源;在 DELETE
请求中解析了查询参数,并根据参数的值删除指定的资源。
使用中间件
在 REST API 中,中间件是一种常用的技术,可以在请求和响应之间执行各种操作。例如,我们可以使用中间件来验证请求的身份、记录请求日志、处理错误等。
在 Deno 中,我们可以使用标准库中的 Middleware
类来实现中间件。以下是一个简单的示例:
import { serve } from "http"; import { Middleware } from "https://deno.land/x/oak/mod.ts"; const server = serve({ port: 8000 }); console.log("Server is running on http://localhost:8000"); const authMiddleware: Middleware = async (ctx, next) => { const token = ctx.request.headers.get("Authorization"); if (token !== "secret") { ctx.response.status = 401; ctx.response.body = "Unauthorized"; return; } await next(); }; for await (const req of server) { console.log(`${req.method} ${req.url}`); if (req.url === "/api/users") { // 处理用户资源的请求 } else if (req.url === "/api/products") { // 处理产品资源的请求 } else { req.respond({ status: 404, body: "Not Found" }); } }
以上代码中,我们使用了 Middleware
类来定义了一个名为 authMiddleware
的中间件,用于验证请求的身份。在每个请求到达时,我们可以通过 await next()
来调用下一个中间件或路由处理程序。
总结
本文介绍了如何从头开始学习 Deno 如何开发 REST API,包括搭建开发环境、创建 API 路由、处理请求和响应、使用中间件等内容。Deno 具有很多优势,例如安全性、可维护性和性能等,可以为开发者提供更好的开发体验和更高效的开发方式。希望本文对您有所帮助,欢迎提出宝贵的意见和建议。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658e88cbeb4cecbf2d46b20b