• 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://:5000/ URL。users.json 中所有使用者的列表將顯示在右側的響應面板中。

Insomnia Client

您還可以使用 CuRL 命令列工具傳送 HTTP 請求。開啟另一個終端併為上述 URL 發出 GET 請求。

C:\Users\mlath>curl https://: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://:5000/2 併發送請求。

Endpoint

您也可以使用以下 CuRL 命令顯示 user2 的詳細資訊:

C:\Users\mlath>curl https://: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://: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://: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/");
})
廣告