赞
踩
API 是现代 Web 应用程序的支柱,它使不同的应用程序能够相互通信。如今,开发人员在其应用程序中使用其他各种公司提供的 API。这有助于他们快速构建应用程序,并减轻维护负担,因为这些公开可用的 API 通常是安全的并且经过了很好的测试。有可用于用户身份验证、支付网关、地图、电子邮件、社交媒体资料以及您能想到的几乎所有东西的 API。在本文中,我们将了解 REST API,并深入了解Node.js REST API 的世界。
当您在手机上滚动浏览 Instagram 时,该应用程序会向其服务器发送一些请求。他们的服务器接收请求,处理请求,并向您的手机返回响应。您手机上的应用程序会处理响应并以可读的方式将其呈现给您。在这里,您手机上的应用程序通过我们所说的应用程序编程接口或 API 与 Instagram 的服务器通信。
让我们再举一个例子来理解 API。您一定听说过 UPI 支付和 GPay、PhonePe 和 Paytm 等应用程序,它们允许您通过 UPI 进行交易。UPI 支付系统由 NPCI 或印度国家支付公司管理,该公司公开其 API,以便这些支付应用程序可以使用它们并促进其客户的 UPI 交易。 简单地说,API 是两个或多个软件系统相互通信的一种方式。
发送请求的应用程序通常称为客户端,发送响应的应用程序称为服务器。因此,在上面的示例中,您设备上的应用程序是从 Instagram 服务器请求数据的客户端。
API 的工作方式是客户端向特定端点的服务器发送一些请求,并使用其中一种 HTTP 方法发送一些有效负载;服务器处理请求并返回响应,该响应可以是 HTML、XML、JSON 等格式。
有各种 API 架构定义了 API 调用的规则,即 SOAP、RPC 和 REST。其中,REST是构建API的最流行选择
REST 代表代表性状态转移,由 Roy Fielding 于 2000 年推出
REST不是一个协议或标准,而是一组基于HTTP或超文本传输协议的设计原则
任何符合 REST 架构风格原则并允许与 RESTful 系统交互的 API 都称为 REST API
对于要称为 RESTful 的 API,它应符合以下六个设计原则:
REST 强制客户端和服务器应相互独立。客户端应仅具有有关资源 URI 的信息,并且客户端不应以任何其他方式与服务器交互。同样,服务器不应以发送请求数据以外的任何方式与客户端交互。
REST API 是无状态的,这意味着从客户端到服务器的每个请求都必须包含处理请求所需的所有信息。不允许服务器应用程序存储与客户端请求相关的任何信息。
特定端点上可用的所有资源和操作都应由客户端和服务器决定并遵守。此外,无论客户端发送请求的客户端如何,用于访问特定资源的所有 API 请求都应看起来相同。响应不应很长,但它必须提供客户端所需的所有详细信息。
缓存是一种将常用数据临时存储在本地内存中的方法,以便当客户端请求相同的信息时,数据将从本地内存提供,而不是从服务器检索。此原则强制要求在服务器响应中包含有关是否允许对所提供的资源进行缓存的信息。
REST API 的设计方式应防止客户端确定它是与终端服务器还是中间服务器通信。此体系结构通过允许负载平衡和共享缓存来提高系统可伸缩性。
这是一个可选约束,它指出,API 响应还可以包含小程序或脚本形式的可执行代码,而不是 JSON 或 XML 响应。因此,服务器可以以代码的形式向客户端提供部分功能,客户端只需要执行代码即可。
客户端和服务器之间的解耦是使用 REST API 最重要的优势。这种解耦允许客户端和服务器端系统独立发展,并提高开发速度。
解耦还有助于开发人员毫不费力地扩展其功能,使其更具可扩展性。
REST API 非常灵活。它们可以处理各种请求并以各种格式传输数据,如 HTML、XML、YAML 和 JSON。 REST API 与语言和平台无关,这意味着它们可以与任何客户端集成,而不管 API 是用什么语言和平台编写的。
借助 RESTf API,我们可以使用 HTTP 缓存和代理服务器来管理高负载,从而提高性能。
REST非常易于学习和使用。
让我们创建自己的 Node.js REST API,以便更好地理解。对于这个特定的用例,我们将提供来自 JSON 文件的虚拟数据来模仿数据库。我们还将使用 Postman 来测试我们的 Node.js REST API。
创建一个新目录 api-demo,遍历到该目录,并使用 npm init 初始化该目录中的 npm
- mkdir api-demo
- cd api-demo
- npm init -y
让我们继续在我们的项目中安装 express 和 fs
npm i express fs
创建名为 users.json 的文件,如下所示。在这里,我们有一个具有五个键值对的 JSON 对象,其中每个键是分配给每个用户的随机 ID,而值是包含用户属性的对象。此文件将充当我们Node.js REST API 的数据库。
{ "1": { "first_name": "Rahul", "last_name": "Gupta", "age": 23 }, "2": { "first_name": "Archana", "last_name": "Singh", "age": 26 }, "3": { "first_name": "John", "last_name": "Doe", "age": 24 }, "4": { "first_name": "Riya", "last_name": "Shah", "age": 26 }, "5": { "first_name": "Ayush", "last_name": "Jain", "age": 28 } }
创建一个名为 app.js 的文件 - 这将是我们项目的主文件,我们将在其中定义 Node.js REST API 的所有 HTTP 方法并设置后端服务器。
- // Import express and fs modules
- const express = require('express');
- const fs = require('fs');
-
- // Create an express application
- const app = express();
-
- // Add express middleware for parsing json payloads
- app.use(express.json());
-
- // Our Node.js server should listen for requests on port 3000
- app.listen(3000, () => console.log('Server running on port 3000'));
使用 Express 时,发出 HTTP 请求的常用语法如下所示:
app.<http-method>(<endpoint>, callback(req, res));
在这里,req 和 res 分别代表请求和响应对象。 因此,为了检索所有用户的数据,我们可以编写一个 GET 请求,如下所示:
- app.get('/users', (req, res) => {
- //Returns raw binary data from `users.json`
- const rawData = fs.readFileSync('users.json');
-
- //Converts the binary data to human readable JSON format
- const jsonData = JSON.parse(rawData);
-
- //Send JSON data as a response to the request
- res.json(jsonData);
- });
当我们使用 Postman 发出请求时,正如预期的那样,我们会获得响应中所有用户的数据。
在这种情况下,我们将从路由中获取用户的 ID,并在响应中仅发送该用户的数据。因此,以下是我们Node.js REST API 中的 GET 方法的样子:
- app.get('/users/:userId', (req, res) => {
- const rawData = fs.readFileSync('users.json');
- const jsonData = JSON.parse(rawData);
-
- //Getting id of the user from the route
- const userId = req.params.userId;
-
- res.json(jsonData[userId]);
- });
Postman 中的示例请求:
要在我们的数据库中创建一个新用户,我们需要使用用户的数据进行 POST 调用。另外,请注意,由于我们正在创建自己的数据库,因此我们必须显式添加用于获取后续用户 ID 的逻辑。如果您使用的是 MongoDB 之类的东西,它会自动将 ID 分配给所有数据库条目。
- app.post('/users', (req, res) => {
- const rawData = fs.readFileSync('users.json');
- const jsonData = JSON.parse(rawData);
-
- //Retrieve data in the request body
- const newUserData = req.body;
-
- //The next user ID should be the maximum ID plus 1
- const arrayOfUserIds = Object.keys(jsonData).map(userId => parseInt(userId));
- const nextUserId = Math.max(...arrayOfUserIds) + 1;
-
- updatedUsers = {
- ...jsonData,
- [nextUserId]: newData
- }
-
- //Write the new data to the users.json file
- fs.writeFileSync('users.json', JSON.stringify(updatedUsers));
- res.send('New User added successfully');
- });
要测试 POST API,请确保在请求正文中添加用户详细信息。若要添加用户数据,请转到“正文”部分,选择“原始数据”,选择“JSON”作为数据类型,然后在文本框中添加 JSON 对象,如下所示:
要更新用户的某些属性,我们可以使用 PATCH 方法,在路由参数中传递用户 ID,在请求体中传递要更新的属性。所有其他用户属性将保持不变。以下是 Node.js REST API 中 PATCH 方法的图示:
- app.patch('/users/:userId', (req, res) => {
- const rawData = fs.readFileSync('users.json');
- const jsonData = JSON.parse(rawData);
-
- const requestBody = req.body;
- const userId = req.params.userId;
-
- //Overwrite the user properties with the values passed in request body
- updatedUserData = {
- ...jsonData[userId],
- ...requestBody
- }
-
- jsonData[userId] = updatedUserData;
-
- fs.writeFileSync('users.json', JSON.stringify(jsonData));
- res.send('User data updated successfully');
- });
Postman 中的示例请求:
要覆盖用户的所有详细信息,我们可以使用 PUT 方法。它将用请求正文中传递的属性替换用户的当前属性。
- app.put('/users/:userId', (req, res) => {
- const rawData = fs.readFileSync('users.json');
- const jsonData = JSON.parse(rawData);
-
- const updatedUserData = req.body;
- const userId = req.params.userId;
-
- //Replace the current user data with the data received in the request body
- jsonData[userId] = updatedUserData;
-
- fs.writeFileSync('users.json', JSON.stringify(jsonData));
- res.send('User data updated successfully');
- });
Postman 中的示例请求:
要删除具有特定 ID 的用户,我们可以在 Node.js REST API 中使用 HTTP DELETE 方法。
- app.delete('/users/:userId', (req, res) => {
- const rawData = fs.readFileSync('users.json');
- const jsonData = JSON.parse(rawData);
- const userId = req.params.userId;
-
- //Delete the user from the JSON object
- delete jsonData[userId];
- res.json('User deleted successfully');
- });
Postman 中的示例请求:
至此,我们已经完成了具有基本创建、读取、更新和删除或 CRUD 功能的 Node.js REST API 的编写。
由于大多数编程语言都支持 JSON,并且可以轻松读取,因此它应该是发送和接收数据的首选,而不是 XML 或 YAML。
使用 https://example-site.com/users 而不是 https://example-site.com/getUsers,因为 GET、POST 等 HTTP 方法已经是动词。
使用 /users/abc 而不是 /user/abc 来表明 abc 是一个路由参数,并且可以有更多用户。
您应该始终返回一个 HTTP 状态代码,让客户端知道其请求的状态,以及客户端想要在其结束时进行一些处理。
使用像 users/userId/profile 这样的终结点可以更容易地理解我们正在请求特定用户的配置文件。
拥有像 /posts?tags=nodejs 这样的端点可以使客户端更容易只检索带有“nodejs”标签的帖子,而不是检索所有帖子,然后在客户端过滤它们。
安全套接字层或 SSL 提供增强的安全性,这对于 REST API 至关重要。因此,您的 URL 应以 HTTPS 而不是 HTTP 开头。
REST API 应在端点本身中指定其版本,以便新版本不会影响当前系统。例如,如果 URL 像 https://example-site.com/users/v1 这样,则表明我们使用的是版本 1 的 API。
API 文档是任何想要在其服务中使用 API 的开发人员的说明手册。您必须确保文档易于理解,并且包含有关请求和响应对象的所有信息。您可以使用 Swagger、Stoplight、ReadMe 等工具编写出色的 API 文档并帮助您的用户。GitHub 和 Stripe 的 API 文档是简单易懂的文档示例。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。