http.Client

2018-07-11 09:47 更新

使用服務(wù)器地址作為參數(shù)來構(gòu)造一個(gè)HTTP client,其返回的句柄可用來發(fā)出一個(gè)或者多個(gè)請求。根據(jù)連接的服 務(wù)器不同,這個(gè)客戶端可以使用管道處理機(jī)制來處理請求或者每個(gè)請求重新構(gòu)建stream。當(dāng)前的實(shí)現(xiàn)方式并沒 有用管道處理機(jī)制處理請求.

Example of connecting to google.com:
var http = require('http');
var google = http.createClient(80, 'www.google.com');
var request = google.request('GET', '/',
{'host': 'www.google.com'});
request.end();
request.on('response', function (response) {
console.log('STATUS: ' + response.statusCode);
console.log('HEADERS: ' + JSON.stringify(response.headers));
response.setEncoding('utf8');
response.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});

如下消息頭應(yīng)當(dāng)注意:

Node 并不會(huì)添加'Host',但是這個(gè)屬性對于一個(gè)網(wǎng)站來說通常是必須的。

發(fā)送'Connection: keep-alive'將告知Node 和服務(wù)器之間的連接應(yīng)當(dāng)是持久連接,直到下一次請求才斷開。 發(fā)送'Content-length'標(biāo)記將禁用默認(rèn)的消息體編碼。

Event: 'upgrade'

function (request, socket, head)

當(dāng)服務(wù)器響應(yīng)upgrade 請求時(shí)觸發(fā)此事件,如果這個(gè)消息沒有被監(jiān)聽,客戶端接收到一個(gè)upgrade 頭的話會(huì)導(dǎo)致 這個(gè)連接被關(guān)閉。

可以查看http.Server 關(guān)于upgrade 事件的解釋來了解更多內(nèi)容。

http.createClient(port, host='localhost', secure=false, [credentials])

構(gòu)造一個(gè)新的HTTP 客戶端.port 和host 指明了將要連接的目標(biāo)。在發(fā)出請求之前不會(huì)建立流(establishe a stream)。 secure 是一個(gè)可選的布爾值,用來表示是否啟用HTTPS。credentials 是一個(gè)來自于crypto 模塊的可選參數(shù), credentials 中可以包含client 的私鑰,證書以及一個(gè)可信任的數(shù)字認(rèn)證中心的證書列表. 如果連接使用了secure 但是沒有把數(shù)字認(rèn)證中心證書傳給credentials,那么NODEJS 將缺省使用公開的可信任 數(shù)字認(rèn)證中心整數(shù)列表,就比如http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt

client.request(method='GET', path, [request_headers])

發(fā)出一個(gè)請求,在必須時(shí)建立一個(gè)流。該函數(shù)返回一個(gè)http.ClientRequest 對象。method 是可選項(xiàng),缺省會(huì)以 GET 方式發(fā)出請求

request_headers 是可選項(xiàng)。請求頭的額外部分一般由NODE 內(nèi)部實(shí)現(xiàn)。該函數(shù)返回一個(gè)ClientRequest 對象 如果你就想要發(fā)送一個(gè)信息體,記得要在頭信息里包含Content-Length 項(xiàng)。如果你想要將BODY 通過流的方式 傳輸發(fā)送,或許需要設(shè)置Transfer-Encoding: chunked.

譯注:大多數(shù)的站點(diǎn)相應(yīng)用戶請求時(shí)發(fā)送的HTTP Headers 中包含Content-Length 頭.此頭信息定義在HTTP1.0協(xié) 議RFC 1945 10.4章節(jié)中.該信息是用來告知用戶代理,通常意義上就是瀏覽器,服務(wù)端發(fā)送的文檔內(nèi)容長度.瀏覽 器接受到此信息后,接收完Content-Length 中定義的長度字節(jié)后開始解析頁面.如果服務(wù)端有部分?jǐn)?shù)據(jù)延遲發(fā)送,那么瀏覽器就會(huì)白屏.這樣導(dǎo)致比較糟糕的用戶體驗(yàn). 解決方法在HTTP1.1協(xié)議.RFC2616中14.41章節(jié)中定義的 Transfer-Encoding:chunked 的頭信息.chunked 編碼定義在3.6.1中.根據(jù)此定義瀏覽器不需要等到內(nèi)容字節(jié)全部下 載完成,只要接收到一個(gè)chunked 塊就可解析頁面.并且可以下載html 中定義的頁面內(nèi)容,包括js,css,image 等.

注意:這個(gè)請求并不完全。這個(gè)方法僅僅發(fā)送了頭和請求。需要發(fā)送一個(gè)request.end()來真正的完成當(dāng)前這個(gè)請 求并且接收回應(yīng)。(這聽起來有點(diǎn)繞,但是這正好就提供了用戶通過使用request.write()方法來通過流方式發(fā)送 body 到服務(wù)器端的機(jī)會(huì))

client.verifyPeer()

返回true/false 并在上下文附帶服務(wù)器定義的或者缺省數(shù)字認(rèn)證中心的有效證書列表。

client.getPeerCertificate()

返回用JSON 結(jié)構(gòu)詳盡表述的服務(wù)器方證書,其中包含證書的‘主題’,‘發(fā)布者’,'有效來源','有效目標(biāo)'('subject', 'issuer', 'valid_from' and 'valid_to')。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號