Node.js | RESTful API
簡介
什麼是 REST?
REST
即表述性狀態傳遞(英文:Representational State Transfer
,簡稱REST
)是Roy Fielding
博士在2000
年他的博士論文中提出來的一種軟件架構風格。
表述性狀態轉移是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是RESTful
。需要注意的是,REST
是設計風格而不是標準。REST
通常基於使用HTTP
,URI
,和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
程序、Perl
、Ruby
、Python
、PHP
和Javascript
[包括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 2 3 4 5 6
| { name: 'morosecat', password: 'password2', profession: 'systemAnalyst', id: 2 }
|
刪除用戶
RESTful API deleteUser
,用於刪除指定用戶,範例指定id = 2
,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
| 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