05

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

Request

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

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

通常簡稱request 或 req。

HTTP 請求一般可以分為兩部分:

請求頭(Request Header)

請求體(Requset Body)

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

而請求體可能相對較長,需要一定的時(shí)間傳輸,

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


事件 含義

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

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

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

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

ServerRequest 的屬性


事件 含義

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

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

method HTTP 請求方法,如 GET、POST、PUT、DELETE 等

url 原始的請求路徑

headers HTTP 請求頭

trailers HTTP 請求尾(不常見)

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 請求頭

trailers HTTP 請求尾(不常見)

Header 頭詳解


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

HTTP協(xié)議采用了請求/響應(yīng)模型,瀏覽器或其他客戶端發(fā)出請求,服務(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ù)維基百科對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 可以請求網(wǎng)頁實(shí)體的一個(gè)或者多個(gè)子范圍字段 Accept-Ranges: bytes

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

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

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

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

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

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

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

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

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

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

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

If-Modified-Since 如果請求的部分在指定時(shí)間之后被修改則請求成功,未被修改則返回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í)間之后未被修改才請求成功 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 只請求實(shí)體的一部分,指定范圍 Range: bytes=500-999

Referer 先前網(wǎng)頁的地址,當(dā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ā)出請求的用戶信息 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ù)器是否支持指定范圍請求及哪種類型的分段請求 Accept-Ranges: bytes

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

Allow 對某網(wǎng)絡(luò)資源的有效的請求行為,不允許則返回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 請求資源可替代的備用的另一地址 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 請求變量的實(shí)體標(biāo)簽的當(dāng)前值 ETag: “737060cd8c284d8af7ad3082f209582d”

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

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

Location 用來重定向接收方到非請求URL的位置來完成請求或標(biāo)識新的資源 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ù)器請求 Vary: *

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


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

直接通過http對象使用的有:

http.STATUS_CODES

http.createServer

http.request(http.ClientRequest)

http.get

http.globalAgent

http.IcomingMessage

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

http.serverRequest

http.serverResponse

http.Agent

一、http.STATUS_CODES

   

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

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

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)鍵所在,是處理請求和回應(yīng)的主函數(shù)出口和出口。

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

  

// 引入 http 模塊

var http = require('http');

/**

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

* 由于server已經(jīng)繼承了EventEmitter的事件功能,所以可以使用高級函數(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對象的事件監(jiān)聽

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

* @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對象。 通常用戶無需處理該事件。

* 特別注意,協(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請求時(shí)觸發(fā)。 如果未監(jiān)聽該事件,服務(wù)器會(huì)酌情自動(dòng)發(fā)送100 Continue響應(yīng)。

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

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

* @param {Object} req

* @param {Object} req

*/

server.on('checkContinue',

function(req, res) {});

/**

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

* @param {Object} req 是該HTTP請求的參數(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è)事件主要是對HTTP協(xié)議升級為其他協(xié)議后的事件監(jiān)聽,如果服務(wù)器端沒有監(jiān)聽,那么于客戶端請求的該連接將會(huì)被關(guān)閉

* @param {Object} req 是該HTTP請求的參數(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('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è)文件名而不是端口號和主機(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(){});

/**

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

* @type {number}

*/

server.maxHeadersCount = 1000;

/**

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

* 說明:為套接字設(shè)定超時(shí)值。如果一個(gè)超時(shí)發(fā)生,那么Server對象上會(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ā)起請求。

http.request(options, callback) 發(fā)起 HTTP 請求。

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

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

callback 是請求的回調(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:請求的服務(wù)器域名或者IP地址

* port:端口

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

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

* handers: 一個(gè)包含請求頭的對象。

*/

var options = {

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

? ?port: 80,

? ?method: 'POST',

? ?path: '/upload',

? ?handers: {}

};

/**

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

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

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

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

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

*/

/**

* 說明:官方給出的例子

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

* @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() {

})

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

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

? ?console.log(e.message);

});

/**

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

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

* @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])

* 說明:完成本次請求的發(fā)送。如果正文中的任何一個(gè)部分沒有來得及發(fā)送,將把他們?nèi)克⑿碌搅髦?。如果本次請求是分塊的,這個(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è)請求。(v0.3.8中新增的方法。)

*/

req.abort();

/**

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

* 說明:一旦給這個(gè)請求分配的是一個(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請求:http.get。

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

var http = require('http');

http.createServer(function(req, res) {

}).listen(3000);

/**

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

* 應(yīng)用:服務(wù)器端測試客服端請求調(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容