RESTful服務
REST(Representational State Transfer)的意思是表征狀態轉移,它是一種基於HTTP協議的網絡應用接口風格,充分利用HTTP的方法實現統一風格接口的服務。通過動詞(HTTP方法)+名詞(請求資源的接口路徑)的方式請求資源,賦予接口特定的含義。
REST風格定義了一系列創建HTTP服務的慣例:
- POST:創建資源
- PUT:更新資源
- GET:讀取資源
- DELETE:刪除資源
例如:
- 獲取所有書籍: GET /api/books
- 獲取id為1的書籍: GET /api/books/1
- 更新id為1的書籍:PUT /api/books/1
- 刪除id為1的書籍:DELETE /api/books/1
- 添加書籍:POST /api/books
Express構建RESTful API
Express.js是一個輕量且靈活的Node.js WEB應用框架,可以快速搭建WEB應用。其底層是對Node.js的HTTP模塊進行封裝,增加路由、中間件等特性,使得用戶能搭建應用級別的WEB服務。
處理GET請求
直接上代碼:
const express = require('express');
const app = express();
const Joi = require('joi');
app.use(express.json());
const books = [
{ id: 1, name: 'book1'},
{ id: 2, name: 'book2'},
{ id: 3, name: 'book3'},
];
app.get('/', (req, res) => {
res.end('Hello World!');
});
//獲取所有書籍
app.get('/api/books', (req, res) => {
res.json(books).end();
});
//獲取特定id的書籍
app.get('/api/books/:id', (req, res) => {
let book = books.find(b => b.id === parseInt(req.params.id));
if(!book) return res.status(404).json({msg: 'The book with the given ID not find.'});
res.json(book).end();
});
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listening on port ${port}`));
GET /api/books
GET /api/books/2
GET /api/books/5
處理POST請求
function validateBook(book){
const schema = {
name: Joi.string().min(3).required()
};
return Joi.validate(book, schema);
}
//使用POST方法添加書籍
app.post('/api/books', (req, res) => {
const {error} = validateBook(req.body);
if(error){
return res.status(400).json({msg: error.details[0].message}).end();
}
const book = {
id: books.length + 1,
name: req.body.name
};
books.push(book);
res.json(book).end();
});
POST /api/books
處理PUT請求
//使用PUT方法修改書籍
app.put('/api/books/:id', (req, res) => {
let book = books.find(b => b.id === parseInt(req.params.id));
if(!book) return res.status(404).json({msg: 'The book with the given ID not find.'});
const { error } = validateBook(req.body);
if(error) return res.status(400).json({msg: error.details[0].message}).end();
book.name = req.body.name;
res.json(book).end();
});
PUT /api/books/1
處理DELETE
//使用DELETE方法刪除書籍
app.delete('/api/books/:id', (req, res) => {
let book = books.find(b => b.id === parseInt(req.params.id));
if(!book) return res.status(404).json({msg: 'The book with the given ID not find.'});
const index = books.indexOf(book);
books.splice(index, 1);
res.json(book).end();
});
DELETE /api/books/1