当前位置:   article > 正文

互联网和网络:Node.js REST API

node.js rest api

概述

API 是现代 Web 应用程序的支柱,它使不同的应用程序能够相互通信。如今,开发人员在其应用程序中使用其他各种公司提供的 API。这有助于他们快速构建应用程序,并减轻维护负担,因为这些公开可用的 API 通常是安全的并且经过了很好的测试。有可用于用户身份验证、支付网关、地图、电子邮件、社交媒体资料以及您能想到的几乎所有东西的 API。在本文中,我们将了解 REST API,并深入了解Node.js REST API 的世界。

什么是 API?

当您在手机上滚动浏览 Instagram 时,该应用程序会向其服务器发送一些请求。他们的服务器接收请求,处理请求,并向您的手机返回响应。您手机上的应用程序会处理响应并以可读的方式将其呈现给您。在这里,您手机上的应用程序通过我们所说的应用程序编程接口或 API 与 Instagram 的服务器通信。

让我们再举一个例子来理解 API。您一定听说过 UPI 支付和 GPay、PhonePe 和 Paytm 等应用程序,它们允许您通过 UPI 进行交易。UPI 支付系统由 NPCI 或印度国家支付公司管理,该公司公开其 API,以便这些支付应用程序可以使用它们并促进其客户的 UPI 交易。 简单地说,API 是两个或多个软件系统相互通信的一种方式。

发送请求的应用程序通常称为客户端,发送响应的应用程序称为服务器。因此,在上面的示例中,您设备上的应用程序是从 Instagram 服务器请求数据的客户端。

API 的工作方式是客户端向特定端点的服务器发送一些请求,并使用其中一种 HTTP 方法发送一些有效负载;服务器处理请求并返回响应,该响应可以是 HTML、XML、JSON 等格式。

什么是 REST API?

有各种 API 架构定义了 API 调用的规则,即 SOAP、RPC 和 REST。其中,REST是构建API的最流行选择

REST 代表代表性状态转移,由 Roy Fielding 于 2000 年推出

REST不是一个协议或标准,而是一组基于HTTP或超文本传输协议的设计原则

任何符合 REST 架构风格原则并允许与 RESTful 系统交互的 API 都称为 REST API

REST的原理

对于要称为 RESTful 的 API,它应符合以下六个设计原则:

1. 客户端服务器解耦

REST 强制客户端和服务器应相互独立。客户端应仅具有有关资源 URI 的信息,并且客户端不应以任何其他方式与服务器交互。同样,服务器不应以发送请求数据以外的任何方式与客户端交互。

2. 无状态

REST API 是无状态的,这意味着从客户端到服务器的每个请求都必须包含处理请求所需的所有信息。不允许服务器应用程序存储与客户端请求相关的任何信息。

3.统一接口

特定端点上可用的所有资源和操作都应由客户端和服务器决定并遵守。此外,无论客户端发送请求的客户端如何,用于访问特定资源的所有 API 请求都应看起来相同。响应不应很长,但它必须提供客户端所需的所有详细信息。

4.可缓存

缓存是一种将常用数据临时存储在本地内存中的方法,以便当客户端请求相同的信息时,数据将从本地内存提供,而不是从服务器检索。此原则强制要求在服务器响应中包含有关是否允许对所提供的资源进行缓存的信息。

5. 分层系统架构

REST API 的设计方式应防止客户端确定它是与终端服务器还是中间服务器通信。此体系结构通过允许负载平衡和共享缓存来提高系统可伸缩性。

6. 按需编码

这是一个可选约束,它指出,API 响应还可以包含小程序或脚本形式的可执行代码,而不是 JSON 或 XML 响应。因此,服务器可以以代码的形式向客户端提供部分功能,客户端只需要执行代码即可。

为什么选择 REST?

客户端和服务器之间的解耦是使用 REST API 最重要的优势。这种解耦允许客户端和服务器端系统独立发展,并提高开发速度。

解耦还有助于开发人员毫不费力地扩展其功能,使其更具可扩展性。

REST API 非常灵活。它们可以处理各种请求并以各种格式传输数据,如 HTML、XML、YAML 和 JSON。 REST API 与语言和平台无关,这意味着它们可以与任何客户端集成,而不管 API 是用什么语言和平台编写的。

借助 RESTf API,我们可以使用 HTTP 缓存和代理服务器来管理高负载,从而提高性能。

REST非常易于学习和使用。

在 Node.js 中创建安全的 REST API

让我们创建自己的 Node.js REST API,以便更好地理解。对于这个特定的用例,我们将提供来自 JSON 文件的虚拟数据来模仿数据库。我们还将使用 Postman 来测试我们的 Node.js REST API。

第 1 步:初始化 npm 和初始设置

创建一个新目录 api-demo,遍历到该目录,并使用 npm init 初始化该目录中的 npm

 
  1. mkdir api-demo
  2. cd api-demo
  3. npm init -y
  • 这里的 -y 代表“Yes to All”,将为 npm 初始化所需的所有字段选择默认值。
  • 正如我们已经知道的,Node.js只是一个允许开发人员在服务器上运行 Javascript 的运行时环境。因此,为了执行其他常见的 Web 开发任务,我们需要使用 Web 框架。
  • Express 就是这样一种常用的 Node.js Web 框架,它构建在 Node.js 之上,它提供了用于构建服务器和 Web 应用程序的通用实用程序集。它还使得为 Node.js REST API 编写处理程序变得非常容易且相当简单。
  • 由于我们在这里使用的不是实际的数据库,而是创建一个 JSON 文件来充当我们的数据库,因此我们需要一个名为 fs(文件系统的缩写)的Node.js模块来帮助我们读取和写入系统上的文件。

让我们继续在我们的项目中安装 express 和 fs

 
npm i express fs

步骤 2:创建虚拟数据库

创建名为 users.json 的文件,如下所示。在这里,我们有一个具有五个键值对的 JSON 对象,其中每个键是分配给每个用户的随机 ID,而值是包含用户属性的对象。此文件将充当我们Node.js REST API 的数据库。

 
  1. {
  2. "1": {
  3. "first_name": "Rahul",
  4. "last_name": "Gupta",
  5. "age": 23
  6. },
  7. "2": {
  8. "first_name": "Archana",
  9. "last_name": "Singh",
  10. "age": 26
  11. },
  12. "3": {
  13. "first_name": "John",
  14. "last_name": "Doe",
  15. "age": 24
  16. },
  17. "4": {
  18. "first_name": "Riya",
  19. "last_name": "Shah",
  20. "age": 26
  21. },
  22. "5": {
  23. "first_name": "Ayush",
  24. "last_name": "Jain",
  25. "age": 28
  26. }
  27. }

步骤 3:创建app.js文件并设置服务器

创建一个名为 app.js 的文件 - 这将是我们项目的主文件,我们将在其中定义 Node.js REST API 的所有 HTTP 方法并设置后端服务器。

 
  1. // Import express and fs modules
  2. const express = require('express');
  3. const fs = require('fs');
  4. // Create an express application
  5. const app = express();
  6. // Add express middleware for parsing json payloads
  7. app.use(express.json());
  8. // Our Node.js server should listen for requests on port 3000
  9. app.listen(3000, () => console.log('Server running on port 3000'));

步骤 4:使用 GET 方法获取所有用户的数据

使用 Express 时,发出 HTTP 请求的常用语法如下所示:

 
app.<http-method>(<endpoint>, callback(req, res));

在这里,req 和 res 分别代表请求和响应对象。 因此,为了检索所有用户的数据,我们可以编写一个 GET 请求,如下所示:

 
  1. app.get('/users', (req, res) => {
  2. //Returns raw binary data from `users.json`
  3. const rawData = fs.readFileSync('users.json');
  4. //Converts the binary data to human readable JSON format
  5. const jsonData = JSON.parse(rawData);
  6. //Send JSON data as a response to the request
  7. res.json(jsonData);
  8. });

当我们使用 Postman 发出请求时,正如预期的那样,我们会获得响应中所有用户的数据。

步骤 5:使用用户的 ID 作为路由参数获取用户的数据

在这种情况下,我们将从路由中获取用户的 ID,并在响应中仅发送该用户的数据。因此,以下是我们Node.js REST API 中的 GET 方法的样子:

 
  1. app.get('/users/:userId', (req, res) => {
  2. const rawData = fs.readFileSync('users.json');
  3. const jsonData = JSON.parse(rawData);
  4. //Getting id of the user from the route
  5. const userId = req.params.userId;
  6. res.json(jsonData[userId]);
  7. });

Postman 中的示例请求:

步骤 6:使用 POST 方法创建新用户

要在我们的数据库中创建一个新用户,我们需要使用用户的数据进行 POST 调用。另外,请注意,由于我们正在创建自己的数据库,因此我们必须显式添加用于获取后续用户 ID 的逻辑。如果您使用的是 MongoDB 之类的东西,它会自动将 ID 分配给所有数据库条目。

 
  1. app.post('/users', (req, res) => {
  2. const rawData = fs.readFileSync('users.json');
  3. const jsonData = JSON.parse(rawData);
  4. //Retrieve data in the request body
  5. const newUserData = req.body;
  6. //The next user ID should be the maximum ID plus 1
  7. const arrayOfUserIds = Object.keys(jsonData).map(userId => parseInt(userId));
  8. const nextUserId = Math.max(...arrayOfUserIds) + 1;
  9. updatedUsers = {
  10. ...jsonData,
  11. [nextUserId]: newData
  12. }
  13. //Write the new data to the users.json file
  14. fs.writeFileSync('users.json', JSON.stringify(updatedUsers));
  15. res.send('New User added successfully');
  16. });

要测试 POST API,请确保在请求正文中添加用户详细信息。若要添加用户数据,请转到“正文”部分,选择“原始数据”,选择“JSON作为数据类型,然后在文本框中添加 JSON 对象,如下所示:

步骤 7:使用 PATCH 方法更新用户的名字和年龄

要更新用户的某些属性,我们可以使用 PATCH 方法,在路由参数中传递用户 ID,在请求体中传递要更新的属性。所有其他用户属性将保持不变。以下是 Node.js REST API 中 PATCH 方法的图示:

 
  1. app.patch('/users/:userId', (req, res) => {
  2. const rawData = fs.readFileSync('users.json');
  3. const jsonData = JSON.parse(rawData);
  4. const requestBody = req.body;
  5. const userId = req.params.userId;
  6. //Overwrite the user properties with the values passed in request body
  7. updatedUserData = {
  8. ...jsonData[userId],
  9. ...requestBody
  10. }
  11. jsonData[userId] = updatedUserData;
  12. fs.writeFileSync('users.json', JSON.stringify(jsonData));
  13. res.send('User data updated successfully');
  14. });

Postman 中的示例请求:

步骤 8:使用 PUT 方法覆盖用户的数据

要覆盖用户的所有详细信息,我们可以使用 PUT 方法。它将用请求正文中传递的属性替换用户的当前属性。

 
  1. app.put('/users/:userId', (req, res) => {
  2. const rawData = fs.readFileSync('users.json');
  3. const jsonData = JSON.parse(rawData);
  4. const updatedUserData = req.body;
  5. const userId = req.params.userId;
  6. //Replace the current user data with the data received in the request body
  7. jsonData[userId] = updatedUserData;
  8. fs.writeFileSync('users.json', JSON.stringify(jsonData));
  9. res.send('User data updated successfully');
  10. });

Postman 中的示例请求:

步骤 9:使用 DELETE 方法删除用户

要删除具有特定 ID 的用户,我们可以在 Node.js REST API 中使用 HTTP DELETE 方法。

 
  1. app.delete('/users/:userId', (req, res) => {
  2. const rawData = fs.readFileSync('users.json');
  3. const jsonData = JSON.parse(rawData);
  4. const userId = req.params.userId;
  5. //Delete the user from the JSON object
  6. delete jsonData[userId];
  7. res.json('User deleted successfully');
  8. });

Postman 中的示例请求:

至此,我们已经完成了具有基本创建、读取、更新和删除或 CRUD 功能的 Node.js REST API 的编写。

REST API 最佳实践

以 JSON 格式发送请求和响应

由于大多数编程语言都支持 JSON,并且可以轻松读取,因此它应该是发送和接收数据的首选,而不是 XML 或 YAML。

在 REST API 端点中使用名词而不是动词

使用 https://example-site.com/users 而不是 https://example-site.com/getUsers,因为 GET、POST 等 HTTP 方法已经是动词。

在 API 终结点中使用复数名词来表示集合名称

使用 /users/abc 而不是 /user/abc 来表明 abc 是一个路由参数,并且可以有更多用户。

REST API 响应必须始终具有 HTTP 状态代码

您应该始终返回一个 HTTP 状态代码,让客户端知道其请求的状态,以及客户端想要在其结束时进行一些处理。

API 端点应具有嵌套以显示关系

使用像 users/userId/profile 这样的终结点可以更容易地理解我们正在请求特定用户的配置文件。

API 端点应具有筛选、排序和分页功能,以防数据库非常大

拥有像 /posts?tags=nodejs 这样的端点可以使客户端更容易只检索带有“nodejs”标签的帖子,而不是检索所有帖子,然后在客户端过滤它们。

API 域应始终使用 SSL

安全套接字层或 SSL 提供增强的安全性,这对于 REST API 至关重要。因此,您的 URL 应以 HTTPS 而不是 HTTP 开头。

使 API 版本在端点中明显

REST API 应在端点本身中指定其版本,以便新版本不会影响当前系统。例如,如果 URL 像 https://example-site.com/users/v1 这样,则表明我们使用的是版本 1 的 API。

API 文档必须易于阅读,并且应包含可能需要的所有信息

API 文档是任何想要在其服务中使用 API 的开发人员的说明手册。您必须确保文档易于理解,并且包含有关请求和响应对象的所有信息。您可以使用 SwaggerStoplightReadMe 等工具编写出色的 API 文档并帮助您的用户。GitHub 和 Stripe 的 API 文档是简单易懂的文档示例。

结论

  • API 促进了两个 Web 应用程序之间的通信
  • 发送请求的应用程序称为客户端,发送响应的应用程序称为服务器。
  • 使用 REST 设计原则构建的 API 称为 REST API
  • JSON 是使用 Node.js REST API 发送和接收数据的最常用格式
  • REST API 的主要优点是客户端和服务器的分离,这使它们更具可扩展性和灵活性
  • 与 SOAP 和 RPC 等其他标准相比,REST API 更快、更轻量级
  • Express 是 Node.js REST API 的常用框架
  • Postman 是开发人员构建和测试其 API 的流行工具。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/723420
推荐阅读
相关标签
  

闽ICP备14008679号