NodeJS – Tạo REST Service


Được đăng vào ngày 26/09/2016 | 0 bình luận
NodeJS – Tạo REST Service
5 (100%) 1 vote

Trong bài trước chúng ta đã tìm hiểu cách tạo một gói tin HTTP, trong phần này chúng ta sẽ tìm hiểu cách tạo các truy vấn REST và cách viết một REST service.

Bản thân việc gọi các REST service đã là bất đồng bộ, tức là khi chúng ta truy vấn một hàm REST thì REST server sẽ gọi một hàm để xử lý và một hàm callback để gửi kết quả trả về, tất cả đều thông qua giao thức HTTP.

Về REST service

REST là viết tắt của REpresentational State Transfer. Đây là một chuẩn web dựa trên giao thức HTTP. Mục đích chính của REST là hỗ trợ truy cập tài nguyên thông qua giao thức HTTP. REST được giới thiệu lần đầu bởi Roy Fielding vào năm 2000.

Công việc của một REST server chỉ đơn giản là cung cấp quyền truy cập tài nguyên, một REST client sẽ dùng các quyền truy cập đó để lấy tài nguyên, tất cả đều thông qua giao thức HTTP. Các tài nguyên được xác định thông qua URI. REST sử dụng 2 định dạng dữ liệu là JSON và XML, nhưng JSON phổ biến hơn.

Nói một cách đơn giản thì giao thức HTTP ban đầu được tạo ra là để trả các website về cho trình duyệt. Sau này người ta phát minh ra chuẩn REST, HTTP không chỉ được dùng để trả về các nội dung HTML mà có thể là bất cứ thứ gì.

Ví dụ

Chúng ta sẽ viết lại server tính số fibonacci, nhưng lần này thay vì trả về một trang web HTML thì server chỉ trả về một chuỗi JSON.

Mặc dù Express ra đời với mục đích chính là để xây dựng các trang web, nhưng chúng ta cũng có thể dùng chính module Express để viết các hàm REST API. Express cho phép so sánh/tìm kiếm chuỗi trong các đường dẫn URL.

Đoạn code routing một đường dẫn URL tới một hàm xử lý cũng tương tự như khi viết một routing bình thường, ví dụ:

app.get('/user/:id', function(req, res) {
    res.send('user ' + req.params.id);
});

Trong dòng code trên, URL /user/:id có một tham số là :id, Express sẽ tách phần tham số này ra và gán vào trường req.params.id.

Bây giờ chúng ta viết lại một server để tính số fibonacci và trả về kiểu JSON, chúng ta tạo một file có tên fiboserver.js với nội dung như sau:

var math = require('./math');
var express = require('express');
var app = express();
app.get('/fibonacci/:n', function(req, res, next) {
    var result = math.fibonacciLoop(req.params.n);
    res.send({
        n: req.params.n,
        res: result
    });
});
app.listen(3002);
console.log('Fibonacci REST service is listening on port 3002');

Ở đoạn code trên chúng ta dùng 2 module là Expressmath do chúng ta viết trong các phần trước.

app.get('/fibonacci/:n', function(req, res, next) {
    ...
});

Ở đây chúng ta dùng phương thức app.get() thay vì dùng app.use() để xử lý phần routing. Tham số đầu tiên là URL, tham số thứ 2 là hàm callback dùng để gửi kết quả về client.

var result = math.fibonacciLoop(req.params.n);
res.send({
    n: req.params.n,
    res: result
});

Trong hàm callback đó chúng ta tính số fibonacci rồi lưu trong biến result, sau đó chúng ta gửi kết quả về thông qua phương thức res.send(). Tham số của phương thức res.send() là một đối tượng  được tạo theo cú pháp JSON, ở đây đối tượng này gồm có 2 tham số là nres, trong đó n chỉ đơn giản là tham số được gửi lên từ client, còn res là kết quả tính số fibonacci từ module math.

Chúng ta chạy file này, sau đó bạn có thể vào trình duyệt và gõ đường dẫn localhost:3002/fibonacci/<tham số> với tham số là một số nguyên bất kỳ, server sẽ trả về chuỗi JSON kết quả là số fibonacci cho bạn.

capture

Tuy nhiên mục đích chính của REST không phải chỉ là để trả kết quả về cho trình duyệt, bất kỳ chương trình nào có hỗ trợ giao thức HTTP đều có thể gọi các hàm REST API, kể cả smartphone, tablet, smartwatch… Chúng ta sẽ viết một client đơn giản để gửi yêu cầu đến REST service này.

Chúng ta tạo một file có tên fiboclient.js với nội dung như sau:

var http = require('http');
var util = require('util');
[
 "/fibonacci/30",
 "/fibonacci/20",
 "/fibonacci/10",
 "/fibonacci/9",
 "/fibonacci/8",
 "/fibonacci/7",
 "/fibonacci/6",
 "/fibonacci/5",
 "/fibonacci/4",
].forEach(function(path) {
    var req = http.request({
        host: "localhost",
        port: 3002,
        path: path,
        method: 'GET' 
    }, function(res) {
        res.on('data', function(chunk) {
            util.log('BODY :' + chunk);
        });
    });
    req.end();
});

Trong đoạn code trên chúng ta tạo một mảng là danh sách các đường dẫn, sau đó chúng ta lặp qua mảng này, mỗi lần lặp chúng ta gửi một yêu cầu HTTP lên server với đường dẫn tương ứng rồi in kết quả trả về.

var req = http.request({
    host: "localhost",
    port: 3002,
    path: path,
    method: 'GET' 
}, function(res) {
    res.on('data', function(chunk) {
        util.log('BODY :' + chunk);
    });
});

Chúng ta tạo một đối tượng http.ServerResponse thông qua phương thức http.request(). Trong đó chúng ta điền các thông tin cơ bản như host là địa chỉ server, port là cổng, path là đường dẫn, method là phương thức, và một hàm callback để nhận kết quả trả về từ server, hàm này nhận một tham số là res, tham số này lắng nghe sự kiện data, sự kiện này xảy ra khi có dữ liệu gửi về từ server.

Chạy đoạn code trên chúng ta được kết quả như sau:

C:\Users\PhoCode>node fiboclient.js
26 Sep 08:59:32 - BODY :{"n":"30","res":832040}
26 Sep 08:59:32 - BODY :{"n":"20","res":6765}
26 Sep 08:59:32 - BODY :{"n":"10","res":55}
26 Sep 08:59:32 - BODY :{"n":"9","res":34}
26 Sep 08:59:32 - BODY :{"n":"8","res":21}
26 Sep 08:59:32 - BODY :{"n":"7","res":13}
26 Sep 08:59:32 - BODY :{"n":"6","res":8}
26 Sep 08:59:32 - BODY :{"n":"5","res":5}
26 Sep 08:59:32 - BODY :{"n":"4","res":3}

 







Bình luận

Hãy trở thành người đầu tiên bình luận

Thông báo cho tôi qua email khi
avatar
wpDiscuz