Node.js核心模塊http客戶端

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這兩對,每對的兩個對象有着相似之處。這是因爲他們通過向另一方發送數據和接受數據。據此,我還畫了個圖,表明他們各自的位置和作用。這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章