16. RESTFul API

REST代表REpresentational State Transfer。 REST是基于Web标准的体系结构,使用HTTP协议。 它围绕资源,其中每个组件都是资源,资源由使用HTTP标准方法的公共接口访问。 REST最初由Roy Fielding于2000年推出。

REST服务器只提供对资源和REST客户端访问的访问,并使用HTTP协议修改资源。 这里每个资源都由URI /全局ID标识。 REST使用各种表示来表示文本,JSON,XML等资源,但JSON是最受欢迎的。

16.1. HTTP方法

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

  • GET :用于提供对资源的只读访问。
  • PUT :用于创建新资源。
  • DELETE :用于删除资源。
  • POST :用于更新现有资源或创建新资源。

16.2. RESTFul Web服务

Web服务是用于在应用程序或系统之间交换数据的开放协议和标准的集合。 以各种编程语言编写并在各种平台上运行的软件应用程序可以使用Web服务以类似于因特网的计算机网络以类似于单个计算机上的进程间通信的方式交换数据。 这种互操作性(例如,Java和Python之间的通信,或Windows和Linux应用程序)是由于使用开放标准。

基于REST架构的Web服务称为RESTFul Web服务。 这些Web服务使用HTTP方法来实现REST体系结构的概念。 RESTFul Web服务通常定义URI,统一资源标识符和服务,它提供资源表示,例如JSON和HTTP方法集。

16.3. 为库创建RESTFul

考虑我们有一个基于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
   }
}

根据这些信息,我们将提供以下RESTFul API。

Sr.No. URI HTTP方法 POST身体 结果
1 listUsers GET empty 显示所有用户的列表。
2 addUser POST JSON字符串 添加新用户的详细信息。
3 deleteUser DELETE JSON字符串 Delete an existing user.
4 :id GET empty 显示用户的详细信息。

假设您已经知道如何使用AJAX或简单的表单数据从前端传递值以及如何使用快速Request 对象处理它们,我将以硬编码的形式保留所有示例的大部分内容。

16.4. 列出用户

让我们在server.js文件中使用以下代码实现我们的第一个RESTFul API listUsers

var express = require('express');
var app = express();
var fs = require("fs");
app.get('/listUsers', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      console.log( data );
      res.end( data );
   });
})
var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

现在尝试使用URL: http://127.0.0.1:8081/listUsers 访问已定义的API URL: http://127.0.0.1:8081/listUsersHTTP Method : GET 使用任何REST客户端在本地计算机上进行HTTP Method : GET 。 这应该产生以下结果(将解决方案放入生产环境时,可以更改给定的IP地址):

{
   "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
   }
}

16.5. 添加用户

以下API将向您展示如何在列表中添加新用户。 以下是新用户的详细信息:

user = {
   "user4" : {
      "name" : "mohit",
      "password" : "password4",
      "profession" : "teacher",
      "id": 4
   }
}

你可以使用AJAX调用以JSON的形式接受相同的输入,但是从教学的角度来看,我们在这里进行硬编码。 以下是数据库中新用户的 addUser API:

var express = require('express');
var app = express();
var fs = require("fs");
var user = {
   "user4" : {
      "name" : "mohit",
      "password" : "password4",
      "profession" : "teacher",
      "id": 4
   }
}
app.post('/addUser', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      data["user4"] = user["user4"];
      console.log( data );
      res.end( JSON.stringify(data));
   });
})
var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

现在尝试使用URL: http://127.0.0.1:8081/addUser 访问已定义的API URL: http://127.0.0.1:8081/addUserHTTP Method : POST 使用任何REST客户端在本地计算机上HTTP Method : POST 。 这应该产生以下结果:

{
   "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}
}

16.6. 查看详细

现在我们将实现一个将使用用户ID调用的API,它将显示相应用户的详细信息。

var express = require('express');
var app = express();
var fs = require("fs");
app.get('/:id', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      var users = JSON.parse( data );
      var user = users["user" + req.params.id] 
      console.log( user );
      res.end( JSON.stringify(user));
   });
})
var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

现在尝试使用URL: http://127.0.0.1:8081/2 访问已定义的API URL: http://127.0.0.1:8081/2HTTP Method : GET 使用任何REST客户端在本地计算机上进行HTTP Method : GET 。 这应该产生以下结果:

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

16.7. 删除用户

此API与addUser API非常相似,我们通过req.body接收输入数据,然后根据用户ID从数据库中删除该用户。 为了简化我们的程序,我们假设我们要删除ID为2的用户。

var express = require('express');
var app = express();
var fs = require("fs");
var id = 2;
app.delete('/deleteUser', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      delete data["user" + 2];
      console.log( data );
      res.end( JSON.stringify(data));
   });
})
var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

现在尝试使用URL: http://127.0.0.1:8081/deleteUser 访问已定义的API URL: http://127.0.0.1:8081/deleteUserHTTP Method : DELETE 使用任何REST客户端在本地计算机上进行HTTP Method : DELETE 。 这应该产生以下结果:

{"user1":{"name":"mahesh","password":"password1","profession":"teacher","id":1},
"user3":{"name":"ramesh","password":"password3","profession":"clerk","id":3}}
下一节:Node.js以单线程模式运行,但它使用事件驱动的范例来处理并发。 它还有助于创建子进程,以便在基于多核CPU的系统上利用并行处理。