HTTP客戶端
http模塊提供了兩個函數http.request和http.get,功能是作爲客戶端想HTTP服務器發送請求。
- http.request(options,callback)發起HTTP請求。接受兩個參數,option是一個類似關聯數組的對象,表示請求的參數,callback是請求的回調函數。option常用的參數如下所示。
名稱 | 含義 |
---|---|
host | 請求網站的域名或IP地址 |
port | 請求的網站的端口,默認80 |
method | 請求方法,默認是GET |
path | 請求的相對於根的路徑,默認是“/”。QueryString應該包含在其中。例如/search?query=byvoid |
headers | 一個關聯數組對象,爲請求頭的內容 |
callback傳遞一個參數,爲http.ClientResponse的實例。
http.request返回一個http.ClientRequest的實例。
下面是通過http.request發送POST請求的代碼
//httprequest.js
var http = require('http');
var querystring = require('querystring');
var contents = querystring.stringify({
name: 'byvoid',
email: '[email protected]',
address: 'Zijing 2#, Tsinghua University',
});
var options = {
host: 'www.byvoid.com',
path: '/application/node/post.php',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urleccoded',
'Content-Length': contents.length
}
};
var req = http.request(options, function(res){
res.setEncoding('utf-8');
res.on('data', function(data){
console.log(data);
});
});
req.write(contents);
req.end();
- http.get(options,callback)http模塊還提供了一個更加簡便的方法用於處理GET請求:http.get。它是http.request的簡化版,唯一的區別在http.get自動將請求方法設爲了GET請求,同時不需要手動調用req.end()。
//httpget.js
var http = require('http');
http.get({host: 'www.byvoid.com'}, function(res){
res.setEncoding('utf-8');
res.on('data', function(data){
console.log(data);
});
});
1.http.clientRequest
http.ClientRequest是由http.request或http.get返回產生的對象,表示一個已經產生而且正在進行中的HTTP請求。它提供了一個response事件,即http.request或http.get第二個參數指定的回調函數的綁定對象。我們也可以顯示地綁定這個事件的監聽函數:
//httpresponse.js
var http = require('http');
var req = http.get({host: 'www.byvoid.com'});
req.on('response', function(res){
res.setEncoding('utf-8');
res.on('data', function(data){
console.log(data);
});
});
http.ClientRequest像http.ServerResponse一樣也提供了write和end函數,用於向服務器發送請求體,通常用於POST、PUT等操作。所有寫結束以後必須調用end函數以通知服務器,否則請求無效。http.ClientRequest還提供了以下函數。
- request.abort():終止正在發送的請求。
- request.setTimeout(timeout, [callback]):設置請求超時時間,timeout爲毫秒數。當請求超時以後,callback將會被調用。
此外,還有其他函數,具體內容參見Node.js文檔。
2.http.ClientResponse
http.ClientResponse與http.ServerRequest相似,提供了三個時間data、end、和close,分別在數據到達、傳輸結束和連接結束時出發,其中data時間傳遞一個參數chunk,表示接收到的數據。
http.ClientResponse也提供了一些屬性,用於表示請求的結果狀態,如下表。
名稱 | 含義 |
---|---|
statusCode | HTTP狀態碼,如200,404,500 |
httpVersion | HTTP協議版本,通常是1.0或1.1 |
headers | HTTP請求 |
trailers | HTTP請求尾(不常見) |
http.ClientResponse還提供了一下幾個特殊的函數。
- response.setEncoding([encoding]):設置默認的編碼,當data事件被觸發時,數據將以encoding編碼。默認值是null,即不編碼,以Buffe的形式存儲。常用編碼爲utf-8.
- response.pause():暫停接受數據和發送事件,方便實現下載功能。
- response.resume():從暫停的狀態中恢復。
總結
當學習完Node.js的服務器端和客戶端後,發現node.js的服務器端-客戶端模式和以前學習的java框架有些類似,也有些不同。不同之處在於,node.js明確地將客戶端和服務器端分別換分出request、response兩個對象,即客戶端包含了http.ClientRequest,http.ClientResponse對象;服務器端包含了http.ServerRequest,http.ServerResponse對象。而以前學習時request對象就表示了客戶端,response就表示了服務器端。
服務器端產生ServerRequest和ServerResponse對象的方法時,出發Server對象的request事件,在回調函數中第一個參數表示ServerRequest對象,第二個參數表示ServerResponse對象。客戶端產生ClientRequest對象的方法時通過調用http.request或http.get方法。ClientResponse對象是在其回調函數中唯一的參數。
似乎ClientRequest和ServerReponse,ServerRequest和ClientResponse這兩對,每對的兩個對象有着相似之處。這是因爲他們通過向另一方發送數據和接受數據。據此,我還畫了個圖,表明他們各自的位置和作用。