Like Share Discussion Bookmark Smile

J.J. Huang   2020-02-10   Node.js   瀏覽次數:

Node.js | RESTful API

簡介

什麼是 REST?

REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。

表述性狀態轉移是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是RESTful。需要注意的是,REST是設計風格而不是標準。REST通常基於使用HTTPURI,和XML(標准通用標記語言下的一個子集)以及HTML(標准通用標記語言下的一個應用)這些現有的廣泛流行的協議和標準。REST通常使用JSON資料格式。

HTTP 方法

以下為REST基本架構的四個方法:

  • GET:用於獲取資料。
  • PUT:用於更新或添加資料。
  • DELETE:用於刪除資料。
  • POST:用於添加資料。

RESTful Web Services

Web service是一個平台獨立的,低耦合的,自包含的、基於可編程的web的應用程序,可使用開放的XML(標准通用標記語言下的一個子集)標準來描述、發布、發現、協調和配置這些應用程序,用於開發分佈式的互操作的應用程序。

基於REST架構的Web Services即是RESTful

由於輕量級以及通過HTTP直接傳輸資料的特性,Web服務的RESTful方法已經成為最常見的替代方法。可以使用各種語言(比如Java程序、PerlRubyPythonPHPJavascript[包括Ajax])實現客戶端。

RESTful Web服務通常可以通過自動客戶端或代表用戶的應用程序訪問。但是,這種服務的簡便性讓用戶能夠與之直接交互,使用它們的 Web 瀏覽器構建一個GET URL並讀取返回的內容。

建立 RESTful

建立一個json資料資源文件users.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"user1" : {
"name" : "morosedog",
"password" : "password1",
"profession" : "engineer",
"id": 1
},
"user2" : {
"name" : "morosecat",
"password" : "password2",
"profession" : "systemAnalyst",
"id": 2
},
"user3" : {
"name" : "morosebear",
"password" : "password3",
"profession" : "systemDesigner",
"id": 3
}
}

基於以上資料,我們建立以下RESTful API

序號 URI HTTP方法 發送內容 結果
1 listUsers GET 顯示所有用戶列表
2 addUser POST JSON 字符串 添加新用戶
3 deleteUser DELETE JSON 字符串 刪除用戶
4 :id GET 顯示用戶詳細訊息

獲取用戶列表

RESTful API listUsers,用於讀取用戶的訊息列表,server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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.setHeader('Content-Type', 'text/html; charset=utf8');
       res.end( data );
   });
})

var server = app.listen(8081, '0.0.0.0', function () {

  var host = server.address().address
  var port = server.address().port

  console.log("瀏覽地址為 http://%s:%s", host, port)

})

執行結果如下:

1
2
$ node server.js
瀏覽地址為 http://0.0.0.0:8081

開啟瀏覽器瀏覽:

1
http://0.0.0.0:8081/listUsers

顯示結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"user1" : {
"name" : "morosedog",
"password" : "password1",
"profession" : "engineer",
"id": 1
},
"user2" : {
"name" : "morosecat",
"password" : "password2",
"profession" : "systemAnalyst",
"id": 2
},
"user3" : {
"name" : "morosebear",
"password" : "password3",
"profession" : "systemDesigner",
"id": 3
}
}

新增用戶

RESTful API addUser,用於新增用戶,server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var express = require('express');
var app = express();
var fs = require("fs");

//增加的新用戶資料
var user = {
   "user4" : {
      "name" : "morosefish",
      "password" : "password4",
      "profession" : "projectManager",
      "id": 4
   }
}

app.get('/addUser', function (req, res) {
   // 讀取已存在的資料
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
       data = JSON.parse( data );
       data["user4"] = user["user4"];
       console.log( data );
       res.setHeader('Content-Type', 'text/html; charset=utf8');
       res.end( JSON.stringify(data));
   });
})

var server = app.listen(8081, '0.0.0.0', function () {

  var host = server.address().address
  var port = server.address().port

  console.log("瀏覽地址為 http://%s:%s", host, port)

})

執行結果如下:

1
2
$ node server.js
瀏覽地址為 http://0.0.0.0:8081

開啟瀏覽器瀏覽:

1
http://0.0.0.0:8081/addUsers

顯示結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
user1: {
name: 'morosedog',
password: 'password1',
profession: 'engineer',
id: 1
},
user2: {
name: 'morosecat',
password: 'password2',
profession: 'systemAnalyst',
id: 2
},
user3: {
name: 'morosebear',
password: 'password3',
profession: 'systemDesigner',
id: 3
},
user4: {
name: 'morosefish',
password: 'password4',
profession: 'projectManager',
id: 4
}
}

顯示用戶詳情

RESTful API :id,用於讀取指定用戶的詳細訊息,server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var express = require('express');
var app = express();
var fs = require("fs");

// 顯示用戶詳情
app.get('/:id', function (req, res) {
// 讀取已存在用戶
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
var user = data["user" + req.params.id]
console.log( user );
       res.setHeader('Content-Type', 'text/html; charset=utf8');
res.end( JSON.stringify(user));
});
})

var server = app.listen(8081, '0.0.0.0', function () {

  var host = server.address().address
  var port = server.address().port

  console.log("瀏覽地址為 http://%s:%s", host, port)

})

執行結果如下:

1
2
$ node server.js
瀏覽地址為 http://0.0.0.0:8081

開啟瀏覽器瀏覽:

1
http://0.0.0.0:8081/2

顯示結果:

1
2
3
4
5
6
{
name: 'morosecat',
password: 'password2',
profession: 'systemAnalyst',
id: 2
}

刪除用戶

RESTful API deleteUser,用於刪除指定用戶,範例指定id = 2server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var express = require('express');
var app = express();
var fs = require("fs");

var id = 2;

app.get('/deleteUser', function (req, res) {
// 讀取已存在用戶
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
delete data["user" + id];
console.log( data );
       res.setHeader('Content-Type', 'text/html; charset=utf8');
res.end( JSON.stringify(data));
});
})

var server = app.listen(8081, '0.0.0.0', function () {

  var host = server.address().address
  var port = server.address().port

  console.log("瀏覽地址為 http://%s:%s", host, port)

})

執行結果如下:

1
2
$ node server.js
瀏覽地址為 http://0.0.0.0:8081

開啟瀏覽器瀏覽:

1
http://0.0.0.0:8081/deleteUser

顯示結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
user1: {
name: 'morosedog',
password: 'password1',
profession: 'engineer',
id: 1
},
user3: {
name: 'morosebear',
password: 'password3',
profession: 'systemDesigner',
id: 3
}
}

完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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.setHeader('Content-Type', 'text/html; charset=utf8');
       res.end( data );
   });
})

//增加的新用戶資料
var user = {
   "user4" : {
      "name" : "morosefish",
      "password" : "password4",
      "profession" : "projectManager",
      "id": 4
   }
}

app.get('/addUser', function (req, res) {
   // 讀取已存在的資料
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
       data = JSON.parse( data );
       data["user4"] = user["user4"];
       console.log( data );
       res.setHeader('Content-Type', 'text/html; charset=utf8');
       res.end( JSON.stringify(data));
   });
})

var id = 2;

// 刪除用戶
app.get('/deleteUser', function (req, res) {
   // 讀取已存在用戶
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
       data = JSON.parse( data );
       delete data["user" + id];
       console.log( data );
       res.setHeader('Content-Type', 'text/html; charset=utf8');
       res.end( JSON.stringify(data));
   });
})

// 顯示用戶詳情
app.get('/:id', function (req, res) {
   // 讀取已存在用戶
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
       data = JSON.parse( data );
       var user = data["user" + req.params.id]
       console.log( user );
       res.setHeader('Content-Type', 'text/html; charset=utf8');
       res.end( JSON.stringify(user));
   });
})


var server = app.listen(8081, '0.0.0.0', function () {

  var host = server.address().address
  var port = server.address().port

  console.log("瀏覽地址為 http://%s:%s", host, port)

})

註:以上參考了
Node.js RESTful API