DANH MỤC TÀI LIỆU
Tổng hợp những cách tốt nhất để viết các REST API Node.js
T ng h p nh ng cách t t nh t đ vi t các REST API Node.js ể ế
Trong bài vi t này, chúng ta s cùng tìm hi u các cách t t nh t đ vi t các ế ấ ể ế
REST API Node.js, bao g m các ch đ nh đ t tên các route, xác th c, ủ ề ư ặ
test black-box và s d ng cache header đúng cách các tài nguyên.ử ụ
M t trong nh ng tr ng h p s d ng thông d ng nh t c a Node.js là vi t ườ ử ụ ế
các RESTful API. Khi chúng tôi đang h tr khách hàng b ng cách tìm các ỗ ợ
v n đ trong ng d ng c a h v i Trace (công c giám sát Node.js) thì
phát hi n ra r ng có r t nhi u các developer đang g p v n đ v i REST ề ớ
API. Do đó, tôi mong r ng các cách chúng tôi s d ng v i RisingStack s
giúp đ c b n:ượ ạ
1. S d ng ph ng th c HTTP và cácử ụ ươ API Route
Hãy t ng t ng r ng b n đang xây d ng m t RESTful API Node.js đ ưở ượ
t o, c p nh t, g i thông tin hay xóa ng i dùng. V i các tính năng đó ậ ọ ườ
HTTP đã cung c p m t b đ y đ các ph ng ộ ầ ươ
th c: POST, PUT, GET, PATCH DELETE.
Cách t i u nh t ư là các API route c a b n ch nên s d ng danh t nh ử ụ ư
là các đ nh danh tài nguyên. Các route khi đó s trông nh th này: ư ế
POST /user hay PUT /user:/id đ t o ng i dùng m i.ể ạ ườ
GET /user đ l y danh sách ng i dùng.ể ấ ườ
GET /user/:id đ l y thông tin c a m t ng i dùng.ể ấ ườ
PATCH /user/:id đ s a m t b n ghi ng i dùng đã có.ể ử ườ
DELETE /user/:id đ xóa m t ng i dùng. ộ ườ
CÁC API ROUTE C A B N CH NÊN S D NG DANH T NH Ử Ụ Ư
LÀ CÁC Đ NH DANH TÀI NGUYÊN.
2. S d ng mã status HTTP đúngử ụ
N u có gì x y ra khi server đang x lý m t request, b n c n thi t l p đúng ế ế ậ
mã status trong response tr v :ả ề
2xx, n u không có l i (thành công).ế ỗ
3xx, n u tài nguyên đã b g b .ế ị ỡ ỏ
4xx, n u request không đ c th c hi n do l i client.ế ượ ự ệ
5xx, n u có l i phía API (m t ngo i l nào đó x y ra,…).ế ỗ ở
N u b n s d ng Express, thi t l p mã status khá d ế ử ụ ế
dàng: res.status(500).send({error: 'Internal server error happened'}). V i
Restify: res.status(201).
3. S d ng các header HTTP đ g i metadata ể ử
Đ đính kèm các metadata vào payload b n s p g i, s d ng HTTP header. ử ụ
Các header s bao g m các thông tin:ẽ ồ
Phân trang.
Gi i h n t n su t truy c pớ ạ ầ
Xác th c.
N u b n c n thi t l p b t c metadata custom nào trong header, hãy thêm ế ế ậ
ti n tề ố X vào phía tr c. Ví d , n u b n đang s d ng CSRF token, cách ướ ế ử ụ
thông th ng (nh ng không chu n) là đ t tên ki uườ ư X-Csrf-Token. Tuy
nhiên, theo RFC 6648 thì s gây khó hi u. V i các API m i không nên s ể ớ
d ng các tên header d gây xung đ t v i các ng d ng khác. Ví d , ộ ớ
OpenStack s t đ ng thêm ti n t vào header v i OpenStack:
1
2
3
OpenStack-Identity-Account-ID
OpenStack-Networking-Host-Name
4
5
OpenStack-Object-Storage-Policy
Chú ý r ng các chu n HTTP không đ nh nghĩa b t c gi i h n kích c nào ấ ứ
trong header. Tuy nhiên Node.js (k t lúc vi t bài này) đã bu c object ể ừ ế
header nh n m t gi i h n kích th c là 80kB cho lý do th c t . ướ ự ế
KHÔNG CHO PHÉP KÍCH TH C T NG C A CÁC HTTP HEADER ƯỚ Ổ
(BAO G M CÁC MÃ STATUS) V T Ồ ƯỢ
QUÁ HTTP_MAX_HEADER_SIZE. ĐI U NÀY GIÚP B O V CÁC Ả Ệ
EMBEDDER KH I CÁC CU C T N CÔNG T -CH I-D CH-V , KHI Ố Ị
K T N CÔNG S G I CÁC HEADER KHÔNG-K T-THÚC CHO CÁC Ẻ Ấ
EMBEDDER L U GI BUFFERING.Ư Ữ
T NODE.JS HTTP PARSER
4. Ch n đúng framework cho REST API Node.js
Vi c ch n đúng framework phù h p v i yêu c u công vi c c a b n là t i ệ ủ
quan tr ng. Sau đây là m t s g i ý: ố ợ
Express, Koa hay Hapi
Express, Koa hay Hapi có th đ c s d ng đ t o ra các ng d ng n n ượ ụ ể ứ ụ ề
web, chúng h tr templating và rendering. N u ng d ng c a b n c n ế ứ
cung c p d ch v phía ng i dùng, hãy th dùng m t trong s chúng và t nấ ị ườ
h ng thành qu .ưở ả
Restify
m t khía c nh khác,Ở ộ Restify t p trung hoàn toàn vào vi c giúp b n xây ệ ạ
d ng các d ch v REST. Restify t n t i đ ồ ạ ể giúp b n xây d ng các d ch v ị ụ
API “chu n” đáng k , d b o trì. Restify cũng đi kèm v i công c h tr ễ ả ụ ỗ
t đ ngự ộ DTrace.
V m c đ ph sóng thì Restify đang đ c s d ng trong r t nhi u các ượ ử ụ
ng d ng, đi n hình nhứ ụ ư npm hay Netflix.
RESTIFY T N T I Đ Ạ Ể GIÚP B N XÂY D NG CÁC D CH V API Ị Ụ
“CHU N” ĐÁNG K , D B O TRÌ. Ễ Ả
5. Test black-box các REST API
M t trong nh ng cách hay nh t đ test các REST API là xem chúng nh các ấ ể ư
black-box.
Black-box test là ph ng pháp ki m thươ ể ử ch c năng c a ng d ng mà ủ ứ
không c n quan tâm đ n c u trúc bên trong c a nó hay cách nó ho t ế ấ
đ ng. Do đó, s không c n mock dependency nào, h th ng s đ c test ẽ ượ
nh m t th duy nh t.ư ộ
Đ giúp b n test các REST API theo ph ng pháp black-box này, ta s s ươ ẽ ử
d ng module supertest.
Sau đây là m t test case đ n gi n. Nó ki m tra xem thông tin ng i dùng đã ơ ả ườ
đ c tr v hay ch a, s d ng test runnerượ ả ề ư ử ụ mocha:
1
2
3
4
5
6
7
8
9
10
11
const request = require('supertest')
describe('GET /user/:id', function() {
it('returns a user', function() {
// newer mocha versions accepts promises as well
return request(app)
.get('/user')
.set('Accept', 'application/json')
.expect(200, {
id: '1',
12
13
14
15
16
name: 'John Math'
}, done)
})
})
Có l b n s th c m c: làm th nào đẽ ạ ế ph bi n ế d li u vào trong
database ph c v cho các REST API?ụ ụ
Thông th ng, test th ng đ c vi t làm sao đ chúng t o ra càng ít các ườ ườ ượ ế
gi đ nh cho trang thái h th ng càng t t. Tuy v y, trong m t vài b i c nh ả ị
b n c n bi t chính xác tr ng thái c a h th ng, b n có th t o ế ể ạ
các assertion và đ t đ c m c đ test cao h n.ạ ượ ơ
Tùy thu c vào nhu c u c a b n, b n có th ph bi n c s d li u v i các ế ơ ở
d li u test theo m t trong các cách sau:ữ ệ
Ch y k ch b n test black-box theo m t t p con đã bi t c a d ộ ậ ế
li u production.
Ph bi n database v i d li u th công tr c khi ch y các test case. ế ữ ệ ướ
Dĩ nhiên, black-box test không đ ng nghĩa v i vi c b n không c n vi t ế unit
test. Trong h u h t các tr ng h p, b n v n c n vi t unit test cho các API. ế ườ ẫ ầ ế
6. JWT – Xác th c phi tr ng tháiự ạ
Các API ph i là phi tr ng thái, b i v y xác th c cũng t ng t . JWT (Json ở ậ ươ
Web Token) chính là ý t ng. JWT g m 3 ph n:ưở ồ ầ
Header: ch a ki u c a token, thu t toán hash.ể ủ
Payload: Ch a các yêu c u.ứ ầ
Signature (JWT không mã hóa payload mà ch kí xác th c) .
Thêm xác th c lo i JWT vào ng d ng khá đ n gi n và nhanh chóng: ự ạ ơ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const koa = require('koa')
const jwt = require('koa-jwt')
const app = koa()
app.use(jwt({
secret: 'very-secret'
}))
// Protected middleware
app.use(function *(){
// content of the token will be available on this.state.user
this.body = {
secret: '42'
}
})
Sau khi thêm, endpoint API đã đ c b o v v i JWT. Đ truy c p vào các ượ ệ ớ
endpoint đ c b o v , b n c n ph i cung c p token trong tr ng ượ ệ ạ ườ
header Authorization:
thông tin tài liệu
Trong bài viết này, chúng ta sẽ cùng tìm hiểu các cách tốt nhất để viết các REST API Node.js, bao gồm các chủ đề như đặt tên các route, xác thực, test black-box và sử dụng cache header đúng cách các tài nguyên.
Mở rộng để xem thêm
từ khóa liên quan
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×