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);
})