Trong Node có lớp http.ClientRequest
dùng để lưu những thông tin về một gói tin HTTP được gửi đến các webserver, chúng ta có thể tạo ra hầu như tất cả mọi yêu cầu HTTP, các lớp kiểu này thường được dùng để gửi các yêu cầu tự động. Trong bài này chúng ta sẽ tìm hiểu cách tạo một yêu cầu HTTP từ client, trong bài sau chúng ta sẽ tìm hiểu và xây dựng REST server và dùng các yêu cầu HTTP này để test server đó.
Nếu bạn đã từng dùng các hệ điều hành Linux thì có lẽ bạn sẽ biết đến các trình gửi yêu cầu HTTP là wget hoặc curl. Chúng ta sẽ viết đoạn code mô phỏng trình wget.
Chúng ta tạo một file có tên wget.js
với nội dung như sau:
var http = require('http'); var url = require('url'); var util = require('util'); var argUrl = process.argv[2]; var parsedUrl = url.parse(argUrl, true); var options = { host: null, port: -1, path: null, method: 'GET' }; options.host = parsedUrl.hostname; options.port = parsedUrl.port; options.path = parsedUrl.pathname; if(parsedUrl.search) options.path += "?" + parsedUrl.search; var req = http.request(options, function(res) { util.log('STATUS: ' + res.statusCode); util.log('HEADERS: ' + util.inspect(res.headers)); res.setEncoding('utf8'); res.on('data', function(chunk) { util.log('BODY: ' + chunk); }); res.on('error', function(err) { util.log('RESPONSE ERROR: ' + err); }); }); req.on('error', function(err) { util.log('REQUEST ERROR: ' + err); }); req.end();
Sau đó chúng ta có thể chạy đoạn code trên như sau: node wget.js http://www.google.com
Chúng ta sẽ nhận về được một gói tin trả lời từ server của google. Trong đó dòng đầu tiên là mã trạng thái STATUS, ở đây chúng ta nhận được mã là 302, mã này là mã redirect, nghĩa là chúng ta sẽ được chuyển tới một đường dẫn khác, trong trường HEADERS chúng ta có một vài thông tin khác, trong đó location
là đường dẫn mà chúng ta sẽ được chuyển tới, ở đây là http://www.google.com.vn/?gfe_rd=cr&ei=WpDkV-CjEKzY8gf-n4uICw, nếu bạn mở trình duyệt web lên rồi truy cập http://www.google.com thì bạn cũng sẽ được chuyển tới đường dẫn như trên. Phần BODY
là nội dung HTML trả về, nếu chúng ta dùng trình duyệt để gửi thì đoạn code HTML này sẽ được “vẽ” trên trình duyệt.
var argUrl = process.argv[2]; var parsedUrl = url.parse(argUrl, true);
Trong đoạn code trên, chúng ta tạo một đối tượng thuộc lớp URL
từ phương thức url.parse()
là parsedUrl,
phương thức này nhận vào đường dẫn mà chúng ta đã nhập (ở trên là http://www.google.com), tham số thứ hai cho biết các tham số đi kèm trong đường dẫn có được mã hóa hay không.
var options = { host: null, port: -1, path: null, method: 'GET' }; options.host = parsedUrl.hostname; options.port = parsedUrl.port; options.path = parsedUrl.pathname;
Đối tượng options
sẽ lưu một số thông tin trong gói tin yêu cầu được gửi đi, như host
là đường dẫn website, port
là cổng, pathname
là đường dẫn phía sau hostname,
ví dụ www.google.com/ thì pathname
là '/', method
là phương thức gửi lên như GET, PUT, POST
…
if(parsedUrl.search) options.path += "?" + parsedUrl.search;
Nếu chúng ta đưa vào đường dẫn có tham số, chẳng hạn http://www.google.com/?query=germany, thì đoạn ?query=germany sẽ được lưu trong thuộc tính search
của đối tượng parsedUrl,
ở đây chúng ta chèn vào sau thuộc tính path
của đối tượng options.
var req = http.request(options, function(res) { util.log('STATUS: ' + res.statusCode); util.log('HEADERS: ' + util.inspect(res.headers)); res.setEncoding('utf8'); res.on('data', function(chunk) { util.log('BODY: ' + chunk); }); res.on('error', function(err) { util.log('RESPONSE ERROR: ' + err); }); });
Phương thức http.request()
nhận vào đối tượng options
và một hàm callback, hàm này sẽ được gọi khi có gói tin trả về từ server, trong hàm này chúng ta chỉ đơn giản là in nội dung gói tin đó ra màn hình. Tham số res
trong hàm callback là một đối tượng thuộc lớp EventEmitter,
đối tượng này lắng nghe sự kiện data
và error
, sự kiện data
xảy ra khi có dữ liệu được trả về, sự kiện error
xảy ra khi có lỗi trả về.
req.on('error', function(err) { util.log('REQUEST ERROR: ' + err); });
Phương thức http.request()
trả về một đối tượng lớp http.ClientRequest.
Bản thân đối tượng này kế thừa từ lớp EventEmitter
và sẽ tạo ra sự kiện error
và data.
Sự kiện data
xảy ra khi có dữ liệu đến, còn sự kiện error
xảy ra khi có lỗi xảy ra. Ở đây chúng ta chỉ bắt sự kiện error,
bạn có thể chạy lại đoạn code trên và đưa vào tham số là www.google.com (bỏ phần http://)
thì sẽ có lỗi.