Giới thiệu về Restify: Rest api framework cho JS
Rest API là gì?
Rest Api là một tập các quy tắc hướng dẫn các developer thiết kế web service thông qua giao thức HTTP. Rest Api chỉ thực sự chứng tỏ giá trị của nó khi khái niệm Software As A Service ra đời và SOAP bộc lộ sự hạn chế của nó. Nếu các service của bạn chỉ phục vụ mục đích nội bộ một tổ chức thì sẽ không bắt buộc phải thiết kế theo chuẩn Rest Api. Bạn hoàn toàn có thể dùng các cách khác để giao tiếp giữa các tiến trình, các module với nhau như : socket, queue, file hay bất cứ thứ gì khác.
Gần đây, với sự nổi lên của Single Page Application (SPA) framework (AngularJS, ReactJS, VueJs …) thì vai trò của Rest Api lại càng được củng cố. Với các trang web kiểu SPA này thì các phần nhỏ của trang web được cập nhật dựa trên data trả về từ các lời gọi Rest Api chứ không load lại hoàn toàn như phương pháp post back
thông thường. Đã có rất nhiều framework ra đời giúp việc thiết kế Rest Api trở nên đơn giản hơn: .NET có, PHP có, JAVA có, rồi Python, Go Lang … Nhưng hôm nay mình sẽ hướng dẫn các bạn một cách đơn giản sử dụng NodeJs để thiết kế Rest api.
Framework chúng tả sử dụng hôm nay đó là restify, một framework được tạo ra để hỗ trợ thiết kế Rest Api, ta có thể thấy ngay từ cái tên của nó. Có một điều thú vị là chính trình quản lý gói của chúng ta npm cũng đang sử dụng framework này.
1. Những thứ cần chuẩn bị
- Bạn cần cài đặt sẵn NodeJs (khuyến nghị >= 8.11) và Npm (khuyến nghị >= 5.6). Kiểm tra bằng lệnh
node --version
vànpm --version
- Một IDE tốt (khuyến nghị WebStorm)
- Rest client để test (khuyến nghị Advanced Rest Client) hoặc có thể là curl
- Cài git và một tài khoản GitHub vì code mẫu mình sẽ đẩy lên GitHub.
- Một chút kiến thức về các lệnh cơ bản trên linux
2. Khởi tạo dự án
Đầu tiên là tạo cấu trúc thư mục như sau:
$ mkdir restify_part1
$ cd restify_part1
$ mkdir src
Sau đó tạo file package.json
với nội dung như sau:
{
"name": "restify_tutorial_part1",
"version": "1.0.0",
"description": "Restify tutorial part1",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index.js"
},
"repository": {
"type": "git",
"url": "restify_tutorial_part1" // điền url git của bạn nếu có
},
"keywords": [
"restify"
],
"author": "GiangCoffee", // tên bạn
"license": "ISC",
"dependencies": {
"restify": "^7.2.1"
}
}
bạn có thể dùng lệnh npm init
và trả lời các câu hỏi để cuối cùng sẽ tạo ra file package.json
như trên. Có mấy điểm cần chú ý trong file ở trên đó là :
- dependencies: danh sách các gói phần mềm phụ thuộc của dự án theo cú pháp [tên gói]:[version]. Ký tự
^
có ý nghĩa là lấy phiên bản chính (major release
) mới nhất của version 7, ví dụ: 7.5.1, 7.6.0… Ký tự~
có ý nghĩa *lấy phiên bản phụ (minor release
) mới nhất củamajor release
7.2, ví dụ: 7.2.4, 7.2.8 … - scripts: định nghĩa các
shortcut
có thể chạy thông qua lệnhnpm run
hoặc chỉ đơn giản lànpm
. Ví dụ thay vì phải gõ trên consolenode index.js
ta có thể gõnpm start
. Npm sẽ tìm shortcut có tênstart
trong file config và chạy lệnhnode index.js
.
3. Hoàn thiện và chạy thử
Trong file package.json
ở trên có nhắc đến file index.js
, đây là file chạy chính của chúng ta, nơi khởi tạo server và lắng nghe các request (thường gọi là entry file
). Tạo file index.js
với nội dung sau :
"use strict";const restify = require('restify');function respond(req, res, next) {
res.send('hello ' + req.params.name);
next();
}var server = restify.createServer();server.get('/', function(req, res, next) {
res.send('This is our service!');
});server.get('/hello/:name', respond);server.listen(8080, function() {
console.log('%s listening at %s', server.name, server.url);
});
Khởi động server:
$ npm start
restify listening at http://[::]:8080
và gõ lên trình duyệt http://localhost:8080
sẽ thấy dòng chữ This is our service!.
Để ý cách tạo một route :
server.get('/', function(req, res, next) {
res.send('This is our service!');
});
.get
mang ý nghĩa là method GET
. Tham số đầu tiên sẽ là url, /
mang ý nghĩa url gốc (http://localhost:8080). Tham số thứ hai là một callback với 3 tham số con
- req: request gửi lên từ client, các thông tin chứa trong mỗi request có thể tham khảo ở đây
- res: respond gửi trả lại client, các method của response có thể tham khảo ở đây
- next: là hàm cần phải gọi để hoặc thông báo request đã được xử lý xong, hoặc trả về lỗi nếu có. Nếu hàm
next
không được gọi thì request tiếp theo sẽ không được xử lý.
Để ý cách tạo route thứ hai:
function respond(req, res, next) {
res.send('hello ' + req.params.name);
next();
}
server.get('/hello/:name', respond);
Tham số url /hello/:name
có một thành phần đặc biệt :name
. Url này sẽ khớp tất cả url có dạng bắt đầu bởi ‘/hello’, ví dụ : /hello/giang
, /hello/coffee
, /hello/restify
… Các giá trị name (giang, coffee hay restify …) có thể được lấy qua property req.params.name
. Nếu url của chúng ta có dạng /hello/:world
thì req.params.name
sẽ mang giá trị world
. Để thay đổi cổng lắng nghe ta có thể thay 8080
bằng một giá trị khác, ví dụ 3000
.
Ở phần tiếp theo mình sẽ hướng dẫn các bạn tạo service quản lý danh sách công việc sử dụng MongoDb !
Source code phần này được để ở đây