05

http中請(qǐng)求request和響應(yīng)response信息說明

Request

http.ServerRequest 是 HTTP請(qǐng)求的信息,是后端開發(fā)者最關(guān)注的內(nèi)容茴厉。

它一般由http.Server 的 request 事件發(fā)送,作為第一個(gè)參數(shù)傳遞,

通常簡稱request 或 req恳不。

HTTP 請(qǐng)求一般可以分為兩部分:

請(qǐng)求頭(Request Header)

請(qǐng)求體(Requset Body)

以上內(nèi)容由于長度較短都可以在請(qǐng)求頭解析完成后立即讀取悍抑。

而請(qǐng)求體可能相對(duì)較長鳄炉,需要一定的時(shí)間傳輸,

因此 http.ServerRequest 提供了以下4個(gè)事件用于控制請(qǐng)求體傳輸搜骡。


事件 含義

data 當(dāng)請(qǐng)求體數(shù)據(jù)到來時(shí)拂盯,該事件被觸發(fā)。該事件提供一個(gè)參數(shù)

chunk 表示接收到的數(shù)據(jù)记靡。如果該事件沒有被監(jiān)聽谈竿,那么請(qǐng)求體將會(huì)被拋棄。該事件可能會(huì)被調(diào)用多次摸吠。

end 當(dāng)請(qǐng)求體數(shù)據(jù)傳輸完成時(shí)空凸,該事件被觸發(fā),此后將不會(huì)再有數(shù)據(jù)到來寸痢。

close 用戶當(dāng)前請(qǐng)求結(jié)束時(shí)呀洲,該事件被觸發(fā)。不同于end轿腺,如果用戶強(qiáng)制終止了傳輸两嘴,也還是調(diào)用close

ServerRequest 的屬性


事件 含義

complete 客戶端請(qǐng)求是否已經(jīng)發(fā)送完成

httpVersion HTTP 協(xié)議版本,通常是 1.0 或 1.1

method HTTP 請(qǐng)求方法族壳,如 GET憔辫、POST、PUT仿荆、DELETE 等

url 原始的請(qǐng)求路徑

headers HTTP 請(qǐng)求頭

trailers HTTP 請(qǐng)求尾(不常見)

connection 當(dāng)前 HTTP 連接套接字贰您,為 net.Socket 的實(shí)例

socket connection 屬性的別名

client client 屬性的別名

Response


http.ClientResponse 與 http.ServerRequest 相似,

提供了三個(gè)事件data拢操、end和close锦亦,

分別在數(shù)據(jù)到達(dá)、傳輸結(jié)束和連接結(jié)束時(shí)觸發(fā)令境,

其中data事件傳遞一個(gè)參數(shù)chunk杠园,表示接收到的數(shù)據(jù)。


ClientResponse 的屬性


名稱 含義

statusCode HTTP 狀態(tài)碼舔庶,如 200抛蚁、404陈醒、500

httpVersion HTTP 協(xié)議版本,通常是 1.0 或 1.1

headers HTTP 請(qǐng)求頭

trailers HTTP 請(qǐng)求尾(不常見)

Header 頭詳解


HTTP(HyperTextTransferProtocol)即超文本傳輸協(xié)議瞧甩,目前網(wǎng)頁傳輸?shù)牡耐ㄓ脜f(xié)議钉跷。

HTTP協(xié)議采用了請(qǐng)求/響應(yīng)模型,瀏覽器或其他客戶端發(fā)出請(qǐng)求肚逸,服務(wù)器給與響應(yīng)爷辙。

就整個(gè)網(wǎng)絡(luò)資源傳輸而言,包括message-header和message-body兩部分朦促。

首先傳遞message- header膝晾,即http header消息 。

http header 消息通常被分為4個(gè)部分:general ?header, request header, response header, entity header思灰。

但是這種分法就理解而言玷犹,感覺界限不太明確。

根據(jù)維基百科對(duì)http header內(nèi)容的組織形式洒疚,大體分為Request和Response兩部分歹颓。


Requests部分


Header 解釋 示例

Accept 指定客戶端能夠接收的內(nèi)容類型 Accept: text/plain, text/html

Accept-Charset 瀏覽器可以接受的字符編碼集。 Accept-Charset: iso-8859-5

Accept-Encoding 指定瀏覽器可以支持的web服務(wù)器返回內(nèi)容壓縮編碼類型油湖。 Accept-Encoding: compress, gzip

Accept-Language 瀏覽器可接受的語言 Accept-Language: en,zh

Accept-Ranges 可以請(qǐng)求網(wǎng)頁實(shí)體的一個(gè)或者多個(gè)子范圍字段 Accept-Ranges: bytes

Authorization HTTP授權(quán)的授權(quán)證書 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Cache-Control 指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制 Cache-Control: no-cache

Connection 表示是否需要持久連接巍扛。(HTTP 1.1默認(rèn)進(jìn)行持久連接) Connection: close

Cookie HTTP請(qǐng)求發(fā)送時(shí),會(huì)把保存在該請(qǐng)求域名下的所有cookie值一起發(fā)送給web服務(wù)器乏德。 Cookie: $Version=1; Skin=new;

Content-Length 請(qǐng)求的內(nèi)容長度 Content-Length: 348

Content-Type 請(qǐng)求的與實(shí)體對(duì)應(yīng)的MIME信息 Content-Type: application/x-www-form-urlencoded

Date 請(qǐng)求發(fā)送的日期和時(shí)間 Date: Tue, 15 Nov 2010 08:12:31 GMT

Expect 請(qǐng)求的特定的服務(wù)器行為 Expect: 100-continue

From 發(fā)出請(qǐng)求的用戶的Email From: user@email.com

Host 指定請(qǐng)求的服務(wù)器的域名和端口號(hào) Host: www.zcmhi.com

If-Match 只有請(qǐng)求內(nèi)容與實(shí)體相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”

If-Modified-Since 如果請(qǐng)求的部分在指定時(shí)間之后被修改則請(qǐng)求成功撤奸,未被修改則返回304代碼 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT

If-None-Match 如果內(nèi)容未改變返回304代碼,參數(shù)為服務(wù)器先前發(fā)送的Etag喊括,與服務(wù)器回應(yīng)的Etag比較判斷是否改變 If-None-Match: “737060cd8c284d8af7ad3082f209582d”

If-Range 如果實(shí)體未改變胧瓜,服務(wù)器發(fā)送客戶端丟失的部分,否則發(fā)送整個(gè)實(shí)體郑什。 參數(shù)也為Etag If-Range: “737060cd8c284d8af7ad3082f209582d”

If-Unmodified-Since 只在實(shí)體在指定時(shí)間之后未被修改才請(qǐng)求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT

Max-Forwards 限制信息通過代理和網(wǎng)關(guān)傳送的時(shí)間 Max-Forwards: 10

Pragma 用來包含實(shí)現(xiàn)特定的指令 Pragma: no-cache

Proxy-Authorization 連接到代理的授權(quán)證書 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Range 只請(qǐng)求實(shí)體的一部分府喳,指定范圍 Range: bytes=500-999

Referer 先前網(wǎng)頁的地址,當(dāng)前請(qǐng)求網(wǎng)頁緊隨其后,即來路 Referer: http://www.baidu.com

TE 客戶端愿意接受的傳輸編碼蘑拯,并通知服務(wù)器接受接受尾加頭信息 TE: trailers,deflate;q=0.5

Upgrade 向服務(wù)器指定某種傳輸協(xié)議以便服務(wù)器進(jìn)行轉(zhuǎn)換(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

User-Agent User-Agent的內(nèi)容包含發(fā)出請(qǐng)求的用戶信息 User-Agent: Mozilla/5.0 (Linux; X11)

Via 通知中間網(wǎng)關(guān)或代理服務(wù)器地址钝满,通信協(xié)議 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)

Warning 關(guān)于消息實(shí)體的警告信息 Warn: 199 Miscellaneous warning

Responses 部分


Header 解釋 示例

Accept-Ranges 表明服務(wù)器是否支持指定范圍請(qǐng)求及哪種類型的分段請(qǐng)求 Accept-Ranges: bytes

Age 從原始服務(wù)器到代理緩存形成的估算時(shí)間(以秒計(jì),非負(fù)) Age: 12

Allow 對(duì)某網(wǎng)絡(luò)資源的有效的請(qǐng)求行為申窘,不允許則返回405 Allow: GET, HEAD

Cache-Control 告訴所有的緩存機(jī)制是否可以緩存及哪種類型 Cache-Control: no-cache

Content-Encoding web服務(wù)器支持的返回內(nèi)容壓縮編碼類型弯蚜。 Content-Encoding: gzip

Content-Language 響應(yīng)體的語言 Content-Language: en,zh

Content-Length 響應(yīng)體的長度 Content-Length: 348

Content-Location 請(qǐng)求資源可替代的備用的另一地址 Content-Location: /index.htm

Content-MD5 返回資源的MD5校驗(yàn)值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==

Content-Range 在整個(gè)返回體中本部分的字節(jié)位置 Content-Range: bytes 21010-47021/47022

Content-Type 返回內(nèi)容的MIME類型 Content-Type: text/html; charset=utf-8

Date 原始服務(wù)器消息發(fā)出的時(shí)間 Date: Tue, 15 Nov 2010 08:12:31 GMT

ETag 請(qǐng)求變量的實(shí)體標(biāo)簽的當(dāng)前值 ETag: “737060cd8c284d8af7ad3082f209582d”

Expires 響應(yīng)過期的日期和時(shí)間 Expires: Thu, 01 Dec 2010 16:00:00 GMT

Last-Modified 請(qǐng)求資源的最后修改時(shí)間 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT

Location 用來重定向接收方到非請(qǐng)求URL的位置來完成請(qǐng)求或標(biāo)識(shí)新的資源 Location: http://www.zcmhi.com/archives/94.html

Pragma 包括實(shí)現(xiàn)特定的指令,它可應(yīng)用到響應(yīng)鏈上的任何接收方 Pragma: no-cache

Proxy-Authenticate 它指出認(rèn)證方案和可應(yīng)用到代理的該URL上的參數(shù) Proxy-Authenticate: Basic

refresh 應(yīng)用于重定向或一個(gè)新的資源被創(chuàng)造剃法,在5秒之后重定向(由網(wǎng)景提出碎捺,被大部分瀏覽器支持) Refresh: 5; url= http://www.zcmhi.com/archives/94.html

Retry-After 如果實(shí)體暫時(shí)不可取,通知客戶端在指定時(shí)間之后再次嘗試 Retry-After: 120

Server web服務(wù)器軟件名稱 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)

Set-Cookie 設(shè)置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

Trailer 指出頭域在分塊傳輸編碼的尾部存在 Trailer: Max-Forwards

Transfer-Encoding 文件傳輸編碼 Transfer-Encoding:chunked

Vary 告訴下游代理是使用緩存響應(yīng)還是從原始服務(wù)器請(qǐng)求 Vary: *

Via 告知代理客戶端響應(yīng)是通過哪里發(fā)送的 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)


關(guān)于HTTP部分大致分為如下的重要點(diǎn):

直接通過http對(duì)象使用的有:

http.STATUS_CODES

http.createServer

http.request(http.ClientRequest)

http.get

http.globalAgent

http.IcomingMessage

作為回調(diào)參數(shù)使用的對(duì)象有:

http.serverRequest

http.serverResponse

http.Agent

一、http.STATUS_CODES

   

眾所周知牵寺,http服務(wù)器就是一個(gè)狀態(tài)服務(wù)器悍引,可以根據(jù)狀態(tài)碼來確定服務(wù)器是處于請(qǐng)求的什么狀態(tài)。

如下列出Node.js status code的全部狀態(tài)對(duì)于的解釋帽氓。

http: {

? ?STATUS_CODES: {

? ? ? ?'100': 'Continue',

? ? ? ?'101': 'Switching Protocols',

? ? ? ?'102': 'Processing',

? ? ? ?'200': 'OK',

? ? ? ?'201': 'Created',

? ? ? ?'202': 'Accepted',

? ? ? ?'203': 'Non-Authoritative Information',

? ? ? ?'204': 'No Content',

? ? ? ?'205': 'Reset Content',

? ? ? ?'206': 'Partial Content',

? ? ? ?'207': 'Multi-Status',

? ? ? ?'300': 'Multiple Choices',

? ? ? ?'301': 'Moved Permanently',

? ? ? ?'302': 'Moved Temporarily',

? ? ? ?'303': 'See Other',

? ? ? ?'304': 'Not Modified',

? ? ? ?'305': 'Use Proxy',

? ? ? ?'307': 'Temporary Redirect',

? ? ? ?'400': 'Bad Request',

? ? ? ?'401': 'Unauthorized',

? ? ? ?'402': 'Payment Required',

? ? ? ?'403': 'Forbidden',

? ? ? ?'404': 'Not Found',

? ? ? ?'405': 'Method Not Allowed',

? ? ? ?'406': 'Not Acceptable',

? ? ? ?'407': 'Proxy Authentication Required',

? ? ? ?'408': 'Request Time-out',

? ? ? ?'409': 'Conflict',

? ? ? ?'410': 'Gone',

? ? ? ?'411': 'Length Required',

? ? ? ?'412': 'Precondition Failed',

? ? ? ?'413': 'Request Entity Too Large',

? ? ? ?'414': 'Request-URI Too Large',

? ? ? ?'415': 'Unsupported Media Type',

? ? ? ?'416': 'Requested Range Not Satisfiable',

? ? ? ?'417': 'Expectation Failed',

? ? ? ?'418': 'I\'m a teapot',

? ? ? ?'422': 'Unprocessable Entity',

? ? ? ?'423': 'Locked',

? ? ? ?'424': 'Failed Dependency',

? ? ? ?'425': 'Unordered Collection',

? ? ? ?'426': 'Upgrade Required',

? ? ? ?'428': 'Precondition Required',

? ? ? ?'429': 'Too Many Requests',

? ? ? ?'431': 'Request Header Fields Too Large',

? ? ? ?'500': 'Internal Server Error',

? ? ? ?'501': 'Not Implemented',

? ? ? ?'502': 'Bad Gateway',

? ? ? ?'503': 'Service Unavailable',

? ? ? ?'504': 'Gateway Time-out',

? ? ? ?'505': 'HTTP Version Not Supported',

? ? ? ?'506': 'Variant Also Negotiates',

? ? ? ?'507': 'Insufficient Storage',

? ? ? ?'509': 'Bandwidth Limit Exceeded',

? ? ? ?'510': 'Not Extended',

? ? ? ?'511': 'Network Authentication Required'

? ?}

}

測試用例:

var http = require('http');

http.createServer(function(req, res) {

? ?var status = req.url.substr(1);

? ?if (!http.STATUS_CODES[status]) {

? ? ? ?status = '404';

? ?}

? ?res.writeHeader(status, {

? ? ? ?'Content-Type': 'text/plain'

? ?});

? ?res.end(http.STATUS_CODES[status]);

}).listen(3000);

測試連接:http://localhost:3000/500 ?結(jié)果輸出 Internal Server Error

二、http.createServer

  

http.createServer是創(chuàng)建一臺(tái)web服務(wù)器的關(guān)鍵所在俩块,是處理請(qǐng)求和回應(yīng)的主函數(shù)出口和出口黎休。

我們把http.createServer創(chuàng)建的服務(wù)對(duì)象定義為server.代碼如下。

  

// 引入 http 模塊

var http = require('http');

/**

* 創(chuàng)建服務(wù)器的兩種寫法玉凯,第一種寫法如下

* 由于server已經(jīng)繼承了EventEmitter的事件功能势腮,所以可以使用高級(jí)函數(shù)編寫方式監(jiān)控事件

* @param {Function} request event

*/

var server = http.createServer(function(req, res) {

? ?//這里的req為http.serverRequest

? ?res.writeHeader(200, {

? ? ? ?'Content-Type': 'text/plain'

? ?});

? ?res.end('hello world');

});

/**

* 說明:創(chuàng)建服務(wù)器的第二種寫法

* 有關(guān)server對(duì)象的事件監(jiān)聽

* @param {Object} req 是http.IncomingMessag的一個(gè)實(shí)例,在keep-alive連接中支持多個(gè)請(qǐng)求

* @param {Object} res 是http.ServerResponse的一個(gè)實(shí)例

*/

var server = new http.Server();

server.on('request',

function(req, res) {

? ?res.writeHeader(200, {

? ? ? ?'Content-Type': 'text/plain'

? ?});

? ?res.end('hello world');

});

/**

* 說明:新的TCP流建立時(shí)出發(fā)漫仆。 socket是一個(gè)net.Socket對(duì)象捎拯。 通常用戶無需處理該事件。

* 特別注意盲厌,協(xié)議解析器綁定套接字時(shí)采用的方式使套接字不會(huì)出發(fā)readable事件署照。 還可以通過request.connection訪問socket。

* @param {Object} socket

*/

server.on('connection',function(socket) {});

/**

* 源API: Event: 'close'

* 說明:關(guān)閉服務(wù)器時(shí)觸發(fā)

*/

server.on('close',function() {});

/**

* 說明:每當(dāng)收到Expect: 100-continue的http請(qǐng)求時(shí)觸發(fā)吗浩。 如果未監(jiān)聽該事件建芙,服務(wù)器會(huì)酌情自動(dòng)發(fā)送100 Continue響應(yīng)。

* 處理該事件時(shí)懂扼,如果客戶端可以繼續(xù)發(fā)送請(qǐng)求主體則調(diào)用response.writeContinue禁荸, 如果不能則生成合適的HTTP響應(yīng)(例如,400 請(qǐng)求無效)

* 需要注意到, 當(dāng)這個(gè)事件觸發(fā)并且被處理后, request 事件將不再會(huì)觸發(fā).

* @param {Object} req

* @param {Object} req

*/

server.on('checkContinue',

function(req, res) {});

/**

* 說明:如果客戶端發(fā)起connect請(qǐng)求阀湿,如果服務(wù)器端沒有監(jiān)聽赶熟,那么于客戶端請(qǐng)求的該連接將會(huì)被關(guān)閉

* @param {Object} req 是該HTTP請(qǐng)求的參數(shù),與request事件中的相同陷嘴。

* @param {Object} socket 是服務(wù)端與客戶端之間的網(wǎng)絡(luò)套接字映砖。需要自己寫一個(gè)data事件監(jiān)聽數(shù)據(jù)流

* @param {Object} head 是一個(gè)Buffer實(shí)例,隧道流的第一個(gè)包罩旋,該參數(shù)可能為空啊央。

*/

server.on('connect',

function(req, socket, head) {});

/**

* 說明:這個(gè)事件主要是對(duì)HTTP協(xié)議升級(jí)為其他協(xié)議后的事件監(jiān)聽,如果服務(wù)器端沒有監(jiān)聽涨醋,那么于客戶端請(qǐng)求的該連接將會(huì)被關(guān)閉

* @param {Object} req 是該HTTP請(qǐng)求的參數(shù)瓜饥,與request事件中的相同。

* @param {Object} socket 是服務(wù)端與客戶端之間的網(wǎng)絡(luò)套接字浴骂。需要自己寫一個(gè)data事件監(jiān)聽數(shù)據(jù)流

* @param {Object} head 是一個(gè)Buffer實(shí)例乓土,升級(jí)后流的第一個(gè)包,該參數(shù)可能為空。

*/

server.on('upgrade',

function(req, socket, head) {});

/**

* 說明:如果一個(gè)客戶端連接觸發(fā)了一個(gè) 'error' 事件, 它就會(huì)轉(zhuǎn)發(fā)到這里

* @param {Object} exception

* @param {Object} socket

*/

server.on('clientError',function(exception, socket) {});

/**

* 源API:server.listen(port, [hostname], [backlog], [callback])

* 說明:監(jiān)聽一個(gè) unix socket, 需要提供一個(gè)文件名而不是端口號(hào)和主機(jī)名趣苏。

* @param {Number} port 端口

* @param {String} host 主機(jī)

* @param {Number} backlog 等待隊(duì)列的最大長度狡相,決定于操作系統(tǒng)平臺(tái),默認(rèn)是511

* @param {Function} callback 異步回調(diào)函數(shù)

*/

server.listen(3000,'localhost',100,function(){});

/**

* 源API:server.listen(path, [callback])

* 說明:啟動(dòng)一個(gè) UNIX 套接字服務(wù)器在所給路徑 path 上監(jiān)聽連接食磕。

* 可能用處:多路徑或渠道數(shù)據(jù)來源監(jiān)聽分隔

* @param {String} path

* @param {Function} callback

*/

server.listen('path',function(){})

/**

* 源API:server.listen(handle, [callback])

* 說明:Windows 不支持監(jiān)聽一個(gè)文件描述符尽棕。

* @param {Object} handle 變量可以被設(shè)置為server 或者 socket

* @param {Function} callback

*/

server.listen({},function(){});

/**

* 說明:最大請(qǐng)求頭數(shù)目限制, 默認(rèn) 1000 個(gè). 如果設(shè)置為0, 則代表不做任何限制.

* @type {number}

*/

server.maxHeadersCount = 1000;

/**

* 源API:server.setTimeout(msecs, callback)

* 說明:為套接字設(shè)定超時(shí)值。如果一個(gè)超時(shí)發(fā)生彬伦,那么Server對(duì)象上會(huì)分發(fā)一個(gè)'timeout'事件滔悉,同時(shí)將套接字作為參數(shù)傳遞。

* 設(shè)置為0將阻止之后建立的連接的一切自動(dòng)超時(shí)行為

* @param {Number} msecs

* @param

*/

server.setTimeout(1000,function() {});

/**

* 說明:一個(gè)套接字被判斷為超時(shí)之前的閑置毫秒數(shù)单绑。 默認(rèn) 120000 (2 分鐘)

* @type {number}

*/

server.timeout = 120000;

/**

* 說明:這里的主機(jī)將是本地

* @param {Number} port 端口

* @param {Function} callback 異步回調(diào)函數(shù)

*/

server.listen(3000,function() {

? ?console.log('Listen port 3000');

});

三 回官、http.request

http 模塊提供了兩個(gè)函數(shù) http.request 和 http.get,功能是作為客戶端向 HTTP服務(wù)器發(fā)起請(qǐng)求搂橙。

http.request(options, callback) 發(fā)起 HTTP 請(qǐng)求歉提。

接受兩個(gè)參數(shù),

option 是一個(gè)類似關(guān)聯(lián)數(shù)組的對(duì)象区转,表示請(qǐng)求的參數(shù)苔巨,-option常用的參數(shù)如下所示。

callback 是請(qǐng)求的回調(diào)函數(shù)蜗帜。

http.request 返回一個(gè) http.ClientRequest 的實(shí)例恋拷。

var http = require('http');

var server = http.createServer(function(req, res) {

}).listen(3000);

/**

* 參數(shù)配置

* @type {{hostname: string, ?port: number, ?method: string, ?path: string, handers: {} }}

* host:請(qǐng)求的服務(wù)器域名或者IP地址

* port:端口

* method:請(qǐng)求方式有POST,GET,INPUT,DELETE,CONNECT,默認(rèn)為GET

* path:請(qǐng)求地址厅缺,可包含查詢字符串以及可能存在的錨點(diǎn)蔬顾。例如'/index.html?page=12'

* handers: 一個(gè)包含請(qǐng)求頭的對(duì)象。

*/

var options = {

? ?hostname: 'www.google.com',

? ?port: 80,

? ?method: 'POST',

? ?path: '/upload',

? ?handers: {}

};

/**

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

* 發(fā)送'Connection: keep-alive'頭部將通知Node此連接將保持到下一次請(qǐng)求湘捎。

* 發(fā)送'Content-length'頭將使默認(rèn)的分塊編碼無效诀豁。

* 發(fā)送'Expect'頭部將引起請(qǐng)求頭部立即被發(fā)送。

* 通常情況窥妇,當(dāng)發(fā)送'Expect: 100-continue'時(shí)舷胜,你需要監(jiān)聽continue事件的同時(shí)設(shè)置超時(shí)。參見RFC2616 8.2.3章節(jié)以獲得更多的信息活翩。

*/

/**

* 說明:官方給出的例子

* 應(yīng)用場景:模擬客服端請(qǐng)求服務(wù)器烹骨,是一個(gè)HTTP 客戶端工具,用于向 HTTP 服務(wù)器發(fā)起請(qǐng)求材泄。

* @param {Object} options

* @param {Function} callback

*/

var req = http.request(options,function(res) {

? ?console.log(res);

? ?console.log('STATUS:' + res.statusCode);

? ?console.log('HEADERS:' + JSON.stringify(res.headers));

? ?res.setEncoding('utf8');

? ?res.on('data', function(chunk) {

? ? ? ?console.log('BODY' + chunk);

? ?});

});

req.on('response',function() {

});

req.on('connect',function() {

});

req.on('socket',function() {

});

req.on('upgrade',function() {

});

req.on('continue',function() {

})

//如果在請(qǐng)求過程中出現(xiàn)了錯(cuò)誤(可能是DNS解析沮焕、TCP的錯(cuò)誤、或者HTTP解析錯(cuò)誤)拉宗,返回的請(qǐng)求對(duì)象上的'error'的事件將被觸發(fā)峦树。

req.on('error', function(e) {

? ?console.log(e.message);

});

/**

* 源API:request.write(chunk, [encoding])

* 說明:發(fā)送正文中的一塊辣辫。用戶可以通過多次調(diào)用這個(gè)方法將請(qǐng)求正文以流的方式發(fā)送到服務(wù)器。此種情況建議在建立請(qǐng)求時(shí)使用['Transfer-Encoding', 'chunked']請(qǐng)求頭魁巩。

* @param {Object or String} chunk 參數(shù)chunk應(yīng)當(dāng)是一個(gè)整數(shù)數(shù)組或字符串急灭。

* @param {String} encoding 參數(shù)encoding是可選的,僅在chunk為字符串時(shí)可用谷遂。

*/

req.write('data\n');

/**

* 源API:request.end(chunk, [encoding])

* 說明:完成本次請(qǐng)求的發(fā)送葬馋。如果正文中的任何一個(gè)部分沒有來得及發(fā)送,將把他們?nèi)克⑿碌搅髦新窨H绻敬握?qǐng)求是分塊的点楼,這個(gè)函數(shù)將發(fā)出結(jié)束字符'0\r\n\r\n'。如果使用參數(shù)data白对,就等于在調(diào)用request.write(data, encoding)之后緊接著調(diào)用request.end()。

* @param {Object or String} chunk 參數(shù)chunk應(yīng)當(dāng)是一個(gè)整數(shù)數(shù)組或字符串换怖。

* @param {String} encoding 參數(shù)encoding是可選的甩恼,僅在chunk為字符串時(shí)可用。

* example: req.end(),req.end('data\n'),req.end('data','utf8'),req.end(chunk)

*/

req.end();

/**

* 阻止一個(gè)請(qǐng)求沉颂。(v0.3.8中新增的方法条摸。)

*/

req.abort();

/**

* 源API:request.setTimeout(timeout, [callback])

* 說明:一旦給這個(gè)請(qǐng)求分配的是一個(gè)socket時(shí)此函數(shù)會(huì)被調(diào)用

* @param {Number} timeout 毫秒

* @param {Function} callback 回到函數(shù)

*/

req.setTimeout(1000,function() {});

/**

* 源API :request.setNoDelay([noDelay])

* 說明:默認(rèn)有一定的延遲,設(shè)置為0表示無延遲

* @param {Number} noDelay

*/

req.setNoDelay(0)

/**

* 源API:request.setSocketKeepAlive([enable], [initialDelay])

* ? ? 類似同上

*/

四铸屉、http.get

http.get(options, callback) http 模塊還提供了一個(gè)更加簡便的方法用于處理GET請(qǐng)求:http.get钉蒲。

它是 http.request 的簡化版,唯一的區(qū)別在于http.get自動(dòng)將請(qǐng)求方法設(shè)為了 GET 請(qǐng)求彻坛,同時(shí)不需要手動(dòng)調(diào)用 req.end()顷啼。

var http = require('http');

http.createServer(function(req, res) {

}).listen(3000);

/**

* 說明:由于大部分請(qǐng)求是不包含正文的GET請(qǐng)求,Node提供了這個(gè)方便的方法昌屉。與http.request()唯一的區(qū)別是此方法將請(qǐng)求方式設(shè)置為GET钙蒙,并且自動(dòng)調(diào)用req.end()。

* 應(yīng)用:服務(wù)器端測試客服端請(qǐng)求調(diào)試等

* @param {String} url 有效地址

* @param {Function} callback

*/

http.get('http://www.baidu.com/index.html',

function(res) {

? ?console.log('get response Code :' + res.statusCode);

}).on('error', function(e) {

? ?console.log("Got error: " + e.message);

})


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末间驮,一起剝皮案震驚了整個(gè)濱河市躬厌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竞帽,老刑警劉巖扛施,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屹篓,居然都是意外死亡疙渣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門抱虐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昌阿,“玉大人,你說我怎么就攤上這事∨潮” “怎么了灶轰?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刷钢。 經(jīng)常有香客問我笋颤,道長,這世上最難降的妖魔是什么内地? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任伴澄,我火速辦了婚禮,結(jié)果婚禮上阱缓,老公的妹妹穿的比我還像新娘非凌。我一直安慰自己,他們只是感情好荆针,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布敞嗡。 她就那樣靜靜地躺著,像睡著了一般航背。 火紅的嫁衣襯著肌膚如雪喉悴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天玖媚,我揣著相機(jī)與錄音箕肃,去河邊找鬼。 笑死今魔,一個(gè)胖子當(dāng)著我的面吹牛勺像,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涡贱,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咏删,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了问词?” 一聲冷哼從身側(cè)響起督函,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎激挪,沒想到半個(gè)月后辰狡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垄分,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宛篇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄湿。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叫倍,死狀恐怖偷卧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吆倦,我是刑警寧澤听诸,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蚕泽,受9級(jí)特大地震影響晌梨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜须妻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一仔蝌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荒吏,春花似錦敛惊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至动知,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間员辩,已是汗流浹背盒粮。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奠滑,地道東北人丹皱。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像宋税,于是被迫代替她去往敵國和親摊崭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容