使用 Deno 和 Oak 构建 RESTful API 指南

阅读时长 7 分钟读完

使用 Deno 和 Oak 构建 RESTful API 指南

在前端开发中,RESTful API 是一个非常重要的概念,也是 web 应用程序与后端服务器之间通信的主要方式之一。RESTful API 提供了一种轻松的方式来访问和操作服务器上的资源。然而,RESTful API 的构建需要语言与工具的支持,本文将介绍如何使用 Deno 与 Oak 构建 RESTful API。

Deno 是一种基于 JavaScript 和 TypeScript 的运行时环境,它在 Node.js 的基础上,对安全性和性能做了进一步的改进。而 Oak 是 Deno 网络中间件的一个流行的选择,它提供了高效的路由和中间件支持。

安装 Deno

安装 Deno 是非常容易的,只需要在官方网站下载并安装即可。Windows 和 macOS 用户可以从 deno.land 下载安装程序进行安装,Linux 用户可以使用 Shell 安装。

$ curl -fsSL https://deno.land/x/install/install.sh | sh

安装完成后,即可开始构建 RESTful API。

安装 Oak

Oak 是 Deno 上的一个中间件库,它可以帮助我们快速构建 RESTful API。要使用 Oak,需要在项目中安装它。

使用以下命令进行安装:

$ deno install --allow-read --allow-net https://deno.land/x/oak/mod.ts

如此便完成了 Oak 的安装。

创建 RESTful API

现在我们将开展繁琐的构建工作。首先,我们需要创建一个文件 index.ts,它将定义我们的 API 路由和逻辑。

import { Application, Router } from "https://deno.land/x/oak/mod.ts";

const router = new Router();

router.get("/products", (context) => { context.response.body = "All products"; });

router.get("/products/:id", (context) => { context.response.body = Product ${context.params.id}; });

const app = new Application();

app.use(router.routes()); app.use(router.allowedMethods());

await app.listen({ port: 8000 });

在这个例子中,我们定义了两个路由:/products 和 /products/:id。对于 /products 的 GET 请求,我们只是简单地返回了 All products。而对于 /products/:id,我们返回了带上参数的 Product <id>。

第一步就完成了。我们实际上已经构建了一个真正工作的 RESTful API,我们可以在 localhost:8000 上进行测试。但是,这只是一个极简和无用的示例。

访问和分析请求数据

我们的示例还没有什么实用价值。我们需要开始访问和分析请求数据。

Oak 提供了一些中间件来实现这些功能。以下是一些常见的中间件:

  • logger:记录请求和响应。
  • bodyParser:将请求体从字符串解析为 JSON。
  • cors:允许跨域资源共享。
  • serve:提供静态文件访问。

让我们在我们的示例中添加一些中间件。

import { Application, Router } from "https://deno.land/x/oak/mod.ts"; import { logger } from "https://deno.land/x/oak/logger.ts"; import { oakCors } from "https://deno.land/x/cors/mod.ts";

const router = new Router();

router.get("/products", (context) => { context.response.body = "All products"; });

router.get("/products/:id", (context) => { context.response.body = Product ${context.params.id}; });

const app = new Application();

// Logger app.use(logger);

app.use(oakCors());

// Routes app.use(router.routes()); app.use(router.allowedMethods());

await app.listen({ port: 8000 });

现在,我们已经添加了两个中间件:logger 和 oakCors。logger 记录请求和响应,而 oakCors 提供了跨域资源共享支持。

解析请求体

接下来,我们将扩展我们的示例,使我们能够解析请求体。我们需要使用 bodyParser 中间件。

import { Application, Router } from "https://deno.land/x/oak/mod.ts"; import { logger } from "https://deno.land/x/oak/logger.ts"; import { oakCors } from "https://deno.land/x/cors/mod.ts"; import { body } from "https://deno.land/x/oak/mod.ts";

const products = new Map([["1", "Product 1"], ["2", "Product 2"]]);

const router = new Router();

router.get("/products", (context) => { context.response.body = Array.from(products.values()); });

router.get("/products/:id", (context) => { context.response.body = products.get(context.params.id); });

router.post("/products", async (context) => { const data = await context.request.body().value; const id = (Math.random() * 100000).toFixed(); const product = data['product']; products.set(id, product); context.response.body = { 'id': id, 'content': Product ${id} created. }; });

const app = new Application();

app.use(logger);

app.use(oakCors());

// parse request body app.use(body());

app.use(router.routes()); app.use(router.allowedMethods());

await app.listen({ port: 8000 });

我们添加了一个 POST 路由 /products,它将解析请求体并在 Map 中创建一个新的音乐。我们现在使用产品的 ID 来索引 Map 条目。

在这个例子中,我们还添加了一个新的映射变量 products。这个变量将用于存储我们的产品。

构建真实世界的 RESTful API

我们现在已经完成了构建一个简单的 RESTful API 的全部过程,这是一些中间件和动态路径的实现。对于简单的示例,这可以很好地工作,但是在生产环境中,我们需要考虑一些实际的情况,例如:

  • 数据库集成:我们需要从数据库中检索数据而不是使用 Map。
  • 用户身份验证:我们可能需要确保 API 使用者已经向服务器验证了身份。
  • 缓存:我们可以通过使用 Redis 等缓存解决性能问题。

最好使用 Deno CLI 进行构建,这在大型应用程序中特别方便。当然,我们建议使用模块化架构,这有助于减少代码复杂度。此外,我们建议使用 TypeScript 编写代码。这将使您的代码更加健壮且具有良好的类型安全性。

结论

在本文中,我们学习了如何使用 Deno 和 Oak 来构建 RESTful API。我们还深入研究了 Oak 中的中间件,包括日志记录和消息体解析器。我们尝试通过发布第一个 API 来将理论应用于实际问题。

当然,我们的示例还比较简单,没有真正的生产部署。但是我们相信这篇文章提供了一个非常好的起点。如果你有任何关于 Deno 和 Oak 的问题,请在评论中告诉我们。我们非常乐意为您提供帮助!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fa630644713626014bef57

纠错
反馈