• Node.js Video Tutorials

Node.js - RESTful API



使用 ExpressJS 的 Node.js 应用程序非常适合构建 REST API。在本章中,我们将解释什么是 REST(也称为 RESTFul)API,并构建一个基于 Node.js 的 Express.js REST 应用程序。我们还将使用 REST 客户端来测试 REST API。

API 是应用程序编程接口的缩写。接口通常指的是两个隔离且独立的环境之间的共同交汇点。编程接口是两个软件应用程序之间的接口。术语 REST API 或 RESTFul API 用于 Web 应用程序,它通过 Internet 将其资源公开给其他 Web/移动应用程序,方法是定义一个或多个端点,客户端应用程序可以访问这些端点以对主机资源执行读/写操作。

REST 架构已成为构建 API 的事实标准,开发人员更喜欢它而不是其他技术,例如 RPC(代表远程过程调用)和 SOAP(代表简单对象访问协议)。

什么是 REST 架构?

REST 代表表现层状态转移。REST 是一种众所周知的软件架构风格。它定义了 Web 应用程序的架构应如何运行。它是一种基于资源的架构,其中 REST 服务器托管的所有内容(文件、图像或数据库表中的行)都是资源,具有多种表示形式。REST 最初由 Roy Fielding 于 2000 年提出。

REST 建议某些架构约束。

  • 统一接口

  • 无状态性

  • 客户端-服务器

  • 可缓存性

  • 分层系统

  • 按需代码

以下是 REST 约束的优势:

  • 可扩展性

  • 简单性

  • 可修改性

  • 可靠性

  • 可移植性

  • 可见性

REST 服务器提供对资源的访问,而 REST 客户端使用 HTTP 协议访问和修改资源。这里每个资源都由 URI/全局 ID 标识。REST 使用各种表示形式来表示资源,例如文本、JSON、XML,但 JSON 是最流行的一种。

HTTP 方法

以下四种 HTTP 方法通常用于基于 REST 的架构。

POST 方法

HTTP 请求中的 POST 动词表示将在服务器上创建一个新的资源。它对应于 CRUD(创建、读取、更新和删除)术语中的 CREATE 操作。要创建新资源,您需要某些数据,它作为数据标头包含在请求中。

POST 请求示例:

HTTP POST http://example.com/users
HTTP POST http://example.com/users/123

GET 方法

GET 操作的目的是检索服务器上现有的资源并将其 XML/JSON 表示形式作为响应返回。它对应于 CRUD 术语中的 READ 部分。

GET 请求示例:

HTTP GET http://example.com/users
HTTP GET http://example.com/users/123 

PUT 方法

客户端使用 HTTP PUT 方法更新现有资源,对应于 CRUD 中的 UPDATE 部分)。更新所需的数据包含在请求正文中。

PUT 请求示例:

HTTP PUT http://example.com/users/123
HTTP PUT http://example.com/users/123/name/Ravi

DELETE 方法

DELETE 方法(顾名思义)用于删除服务器上的一个或多个资源。成功执行后,将发送 HTTP 响应代码 200(OK)。

DELETE 请求示例:

HTTP DELETE http://example.com/users/123
HTTP DELETE http://example.com/users/123/name/Ravi

RESTful Web 服务

基于 REST 架构的 Web 服务称为 RESTful Web 服务。这些 Web 服务使用 HTTP 方法来实现 REST 架构的概念。RESTful Web 服务通常定义一个 URI(统一资源标识符)服务,该服务提供 JSON 等资源表示形式和一组 HTTP 方法。

为图书馆创建 RESTful API

假设我们有一个基于 JSON 的用户数据库,在文件 users.json 中包含以下用户

{
   "user1" : {
      "name" : "mahesh",
      "password" : "password1",
      "profession" : "teacher",
      "id": 1
   },
   
   "user2" : {
      "name" : "suresh",
      "password" : "password2",
      "profession" : "librarian",
      "id": 2
   },
   
   "user3" : {
      "name" : "ramesh",
      "password" : "password3",
      "profession" : "clerk",
      "id": 3
   }
}

我们的 API 将公开以下端点,以便客户端对 users.json 文件执行 CRUD 操作,该文件是服务器上的资源集合。

序号 URI HTTP 方法 POST 正文 结果
1 / GET 显示所有用户的列表。
2 / POST JSON 字符串 添加新用户的详细信息。
3 /:id DELETE JSON 字符串 删除现有用户。
4 /:id GET 显示用户详细信息。
5 /:id PUT JSON 字符串 更新现有用户

列出用户

让我们在 index.js 文件中使用以下代码实现 RESTful API 中的第一个路由,以列出所有用户

var express = require('express');
var app = express();
var fs = require("fs");
app.get('/', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      res.end( data );
   });
})
var server = app.listen(5000, function () {
   console.log("Express App running at http://127.0.0.1:5000/");
})

要测试此端点,您可以使用 REST 客户端(如 Postman 或 Insomnia)。在本章中,我们将使用 Insomnia 客户端。

从命令提示符运行 index.js,然后启动 Insomnia 客户端。选择 GET 方法并输入 https://127.0.0.1:5000/ URL。users.json 中所有用户的列表将显示在右侧的响应面板中。

Insomnia Client

您还可以使用 CuRL 命令行工具发送 HTTP 请求。打开另一个终端并为上述 URL 发出 GET 请求。

C:\Users\mlath>curl https://127.0.0.1:5000/
{
   "user1" : {
      "name" : "mahesh",
      "password" : "password1",
      "profession" : "teacher",
      "id": 1
   },

   "user2" : {
      "name" : "suresh",
      "password" : "password2",
      "profession" : "librarian",
      "id": 2
   },

   "user3" : {
      "name" : "ramesh",
      "password" : "password3",
      "profession" : "clerk",
      "id": 3
   }
 }

显示详细信息

现在我们将实现一个 API 端点 /:id,该端点将使用用户 ID 调用,并将显示相应用户的详细信息。

在 index.js 文件中添加以下方法:

app.get('/:id', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      var users = JSON.parse( data );
      var user = users["user" + req.params.id] 
      res.end( JSON.stringify(user));
   });
})

在 Insomnia 界面中,输入 https://127.0.0.1:5000/2 并发送请求。

Endpoint

您也可以使用以下 CuRL 命令显示 user2 的详细信息:

C:\Users\mlath>curl https://127.0.0.1:5000/2
{"name":"suresh","password":"password2","profession":"librarian","id":2}

添加用户

以下 API 将向您展示如何在列表中添加新用户。以下是新用户的详细信息。如前所述,您必须已在应用程序文件夹中安装了 body-parser 包。

var bodyParser = require('body-parser')
app.use( bodyParser.json() );      
app.use(bodyParser.urlencoded({  extended: true }));

app.post('/', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      var users = JSON.parse( data );
      var user = req.body.user4;
      users["user"+user.id] = user
      res.end( JSON.stringify(users));
   });
})

要通过 Insomnia 发送 POST 请求,请将 BODY 选项卡设置为 JSON,并以 JSON 格式输入用户数据,如下所示

Insomnia

您将获得四个用户的 JSON 数据(三个从文件读取,一个添加)

{
	"user1": {
		"name": "mahesh",
		"password": "password1",
		"profession": "teacher",
		"id": 1
	},
	"user2": {
		"name": "suresh",
		"password": "password2",
		"profession": "librarian",
		"id": 2
	},
	"user3": {
		"name": "ramesh",
		"password": "password3",
		"profession": "clerk",
		"id": 3
	},
	"user4": {
		"name": "mohit",
		"password": "password4",
		"profession": "teacher",
    "id": 4
	}
  }

删除用户

以下函数从 URL 读取 ID 参数,从读取 users.json 文件获得的列表中找到用户,并删除相应用户。

app.delete('/:id', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      var id = "user"+req.params.id;
      var user = data[id];
      delete data[ "user"+req.params.id];
      res.end( JSON.stringify(data));
   });
})

在 Insomnia 中选择 DELETE 请求,输入 https://127.0.0.1:5000/2 并发送请求。ID=3 的用户将被删除,其余用户将在响应面板中列出

Delete Request

输出

{
	"user1": {
		"name": "mahesh",
		"password": "password1",
		"profession": "teacher",
		"id": 1
	},
	"user2": {
		"name": "suresh",
		"password": "password2",
		"profession": "librarian",
		"id": 2
	}
}

更新用户

PUT 方法使用服务器修改现有资源。以下 app.put() 方法从 URL 读取要更新的用户 ID,以及 JSON 正文中的新数据。

app.put("/:id", function(req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      
      var users = JSON.parse( data );
      var id = "user"+req.params.id;      
      users[id]=req.body;
      res.end( JSON.stringify(users));
   })
})

在 Insomnia 中,为 https://127.0.0.1:5000/2 URL 设置 PUT 方法。

Put Method

响应显示 ID=2 的用户的更新详细信息

{
	"user1": {
		"name": "mahesh",
		"password": "password1",
		"profession": "teacher",
    "id": 1
	},
	"user2": {
		"name": "suresh",
		"password": "password2",
		"profession": "Cashier",
		"id": 2
	},
	"user3": {
		"name": "ramesh",
		"password": "password3",
		"profession": "clerk",
		"id": 3
	}
}

以下是 Node.js RESTFul API 的完整代码:

var express = require('express');
var app = express();
var fs = require("fs");
var bodyParser = require('body-parser')
app.use( bodyParser.json() );      
app.use(bodyParser.urlencoded({  extended: true }));


app.get('/', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      res.end( data );
   });
})

app.get('/:id', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      var users = JSON.parse( data );
      var user = users["user" + req.params.id] 
     res.end( JSON.stringify(user));
   });
})

var bodyParser = require('body-parser')
app.use( bodyParser.json() );      
app.use(bodyParser.urlencoded({  extended: true }));

app.post('/', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      var users = JSON.parse( data );
      var user = req.body.user4;
      users["user"+user.id] = user
      res.end( JSON.stringify(users));
   });
})

app.delete('/:id', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      var id = "user"+req.params.id;
      var user = data[id];
      delete data[ "user"+req.params.id];
      res.end( JSON.stringify(data));
   });
})
app.put("/:id", function(req, res) {
      fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      
      var users = JSON.parse( data );
      var id = "user"+req.params.id;
      
      users[id]=req.body;
      res.end( JSON.stringify(users));
   })

})
var server = app.listen(5000, function () {
   console.log("Express App running at http://127.0.0.1:5000/");
})
广告