參考自
REST是設計風格而不是標準。REST通常基於使用HTTP,URI,和XML(標準通用標記語言下的一個子集)以及HTML(標準通用標記語言下的一個應用)這些現有的廣泛流行的協議和標準。REST 通常使用 JSON 數據格式。
HTTP 方法
以下爲 REST 基本架構的四個方法:
- GET - 用於獲取數據。
- PUT - 用於更新或添加數據。
- DELETE - 用於刪除數據。
- POST - 用於添加數據。
例子
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
URI | HTTP方法 | 發送內容 | 結果 |
---|---|---|---|
listUsers | GET | 空 | 顯示所有用戶列表 |
addUser | POST | JSON字符串 | 添加新用戶 |
deleteUser | DELETE | JSON字符串 | 刪除用戶 |
:id | GET | 空 | 顯示用戶纖細信息 |
實現
.
├── index.html
├── node_modules
├── package.json
├── package-lock.json
├── server.js
└── users.json
user.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}}
index.html
<html>
<body>
<p>Add A User</p>
<form action="http://127.0.0.1:8888/addUser" method="POST">
Name: <input type="text" name="name"> <br>
Password: <input type="text" name="password"> <br>
Profession: <input type="text" name="profession"><br>
ID: <input type="number" name="id" min="0"><br>
<input type="submit" value="Submit">
</form>
<p>Delete A User</p>
<form action="http://127.0.0.1:8888/deleteUser" method="POST">
ID: <input type="number" name="id" min="0"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
server.js
var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
// 創建 application/x-www-form-urlencoded 編碼解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })
app.get('/', function (req, res) {
res.sendFile(__dirname + '/' + 'index.html');
})
app.get('/listUsers', function (req, res) {
fs.readFile(__dirname + '/' + 'users.json', 'utf8', function (err, data) {
// 返回的是json
// 更多見https://www.cnblogs.com/digdeep/p/5574366.html
res.setHeader('Content-Type', 'application/json; charset=utf8');
res.end(data);
});
})
app.post('/addUser', urlencodedParser, function (req, res) {
// 輸出 JSON 格式
var newUser = {
'name' : req.body.name,
'password' : req.body.password,
'profession' : req.body.profession,
'id': parseInt(req.body.id)
};
fs.readFile(__dirname + '/' + 'users.json', 'utf8', function (err, data) {
if(err) {
console.error(err);
return;
}
data = JSON.parse(data);
data['user' + newUser['id']] = newUser;
fs.writeFile(__dirname + '/' + 'users.json', JSON.stringify(data), 'utf8', function (err) {
if(err) {
console.error(err);
return
}
res.setHeader('Content-Type', 'application/json; charset=utf8');
res.end(JSON.stringify(newUser));
});
});
})
app.post('/deleteUser', urlencodedParser, function (req, res) {
// 輸出 JSON 格式
res.setHeader('Content-Type', 'application/json; charset=utf8');
var retMessage = 'Fail to delete!';
fs.readFile(__dirname + '/' + 'users.json', 'utf8', function (err, data) {
if(err) {
console.error(err);
return;
}
data = JSON.parse(data);
var deleteUser = data['user' + parseInt(req.body.id)];
delete data['user' + parseInt(req.body.id)];
fs.writeFile(__dirname + '/' + 'users.json', JSON.stringify(data), 'utf8', function (err) {
if(err) {
console.error(err);
return
}
res.setHeader('Content-Type', 'application/json; charset=utf8');
res.end(JSON.stringify(deleteUser));
});
});
})
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]
res.setHeader('Content-Type', 'application/json; charset=utf8');
res.end( JSON.stringify(user));
});
})
var server = app.listen(8888, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Server is running in http://%s:%s', host, port);
})