您好,登錄后才能下訂單哦!
HTTP不是基于特定語(yǔ)言的,是一個(gè)通用的應(yīng)用層協(xié)議,不同語(yǔ)言有不同的實(shí)現(xiàn)細(xì)節(jié),但是萬(wàn)變不離其宗,思想是相同的。NodeJS作為一個(gè)宿主運(yùn)行環(huán)境,以JavaScript為宿主語(yǔ)言,它也有自己實(shí)現(xiàn)的一套標(biāo)準(zhǔn),本文將詳細(xì)介紹nodeJS中的Http模塊
【new Agent([options])】
options <Object> 代理的配置選項(xiàng)。有以下字段: keepAlive <boolean> 保持 socket 可用即使沒(méi)有請(qǐng)求,以便它們可被將來(lái)的請(qǐng)求使用而無(wú)需重新建立一個(gè) TCP 連接。默認(rèn)為 false。 keepAliveMsecs <number> 當(dāng)使用了 keepAlive 選項(xiàng)時(shí),該選項(xiàng)指定 TCP Keep-Alive 數(shù)據(jù)包的 初始延遲。 當(dāng) keepAlive 選項(xiàng)為 false 或 undefined 時(shí),該選項(xiàng)無(wú)效。 默認(rèn)為 1000。 maxSockets <number> 每個(gè)主機(jī)允許的最大 socket 數(shù)量。 默認(rèn)為 Infinity。 maxFreeSockets <number> 在空閑狀態(tài)下允許打開(kāi)的最大 socket 數(shù)量。 僅當(dāng) keepAlive 為 true 時(shí)才有效。 默認(rèn)為 256
http.request() 使用的默認(rèn) http.globalAgent 的選項(xiàng)均為各自的默認(rèn)值
若要配置其中任何一個(gè),則需要?jiǎng)?chuàng)建自定義的 http.Agent 實(shí)例
【agent.createConnection(options[, callback])】
options <Object> 包含連接詳情的選項(xiàng) callback <Function> 接收被創(chuàng)建的 socket 的回調(diào)函數(shù)。callback 有 (err, stream) 參數(shù) 返回: <net.Socket>
創(chuàng)建一個(gè)用于 HTTP 請(qǐng)求的 socket 或流
默認(rèn)情況下,函數(shù)類(lèi)似于net.createConnection()。但如果期望更大的靈活性,自定義代理可重寫(xiě)該方法
socket 或流可以通過(guò)以下兩種方式獲?。簭脑摵瘮?shù)返回或傳入callback
【agent.destroy()】
銷(xiāo)毀當(dāng)前正被代理使用的任何socket
通常不需要這么做。但是如果使用的代理啟用了keepAlive,則當(dāng)確定它不再被使用時(shí),最好顯式地關(guān)閉代理。 否則,在服務(wù)器終止它們之前,socket 可能還會(huì)長(zhǎng)時(shí)間保持打開(kāi)
【agent.freeSockets】
返回一個(gè)對(duì)象,包含當(dāng)前正在等待被啟用了 keepAlive 的代理使用的 socket 數(shù)組。不要修改該屬性
【agent.getName(options)】
options <Object> 為名稱(chēng)生成程序提供信息的選項(xiàng)。 host <string> 請(qǐng)求發(fā)送至的服務(wù)器的域名或 IP 地址。 port <number> 遠(yuǎn)程服務(wù)器的端口。 localAddress <string> 當(dāng)發(fā)送請(qǐng)求時(shí),為網(wǎng)絡(luò)連接綁定的本地接口。 返回: <string>
為請(qǐng)求選項(xiàng)的集合獲取一個(gè)唯一的名稱(chēng),用來(lái)判斷一個(gè)連接是否可以被復(fù)用。 對(duì)于 HTTP 代理,返回 host:port:localAddress。 對(duì)于 HTTPS 代理,名稱(chēng)會(huì)包含 CA、證書(shū)、密碼、以及其他 HTTPS/TLS 特有的用于判斷 socket 復(fù)用性的選項(xiàng)
【agent.maxFreeSockets】
默認(rèn)為 256。 對(duì)于已啟用 keepAlive 的代理,該屬性可設(shè)置要保留的空閑 socket 的最大數(shù)量
【agent.maxSockets】
默認(rèn)為不限制。 該屬性可設(shè)置代理為每個(gè)來(lái)源打開(kāi)的并發(fā) socket 的最大數(shù)量。 來(lái)源是一個(gè) 'host:port' 或 'host:port:localAddress' 組合
【agent.requests】
返回一個(gè)對(duì)象,包含還未被分配到 socket 的請(qǐng)求隊(duì)列。 不要修改
【agent.sockets】
返回一個(gè)對(duì)象,包含當(dāng)前正被代理使用的 socket 數(shù)組。 不要修改
【http.ClientRequest】
該對(duì)象在http.request()內(nèi)部被創(chuàng)建并返回。它表示著一個(gè)正在處理的請(qǐng)求,其請(qǐng)求頭已進(jìn)入隊(duì)列。請(qǐng)求頭仍可使用setHeader(name, value)、getHeader(name) 和 removeHeader(name) API 進(jìn)行修改。實(shí)際的請(qǐng)求頭會(huì)與第一個(gè)數(shù)據(jù)塊一起發(fā)送或當(dāng)關(guān)閉連接時(shí)發(fā)送
要獲取響應(yīng),需為 'response' 事件添加一個(gè)監(jiān)聽(tīng)器到請(qǐng)求對(duì)象上。當(dāng)響應(yīng)頭被接收到時(shí),'response' 事件會(huì)從請(qǐng)求對(duì)象上被觸發(fā) 。 'response'事件被執(zhí)行時(shí)帶有一個(gè)參數(shù),該參數(shù)是一個(gè) http.IncomingMessage 實(shí)例。在 'response' 事件期間,可以添加監(jiān)聽(tīng)器到響應(yīng)對(duì)象上,比如監(jiān)聽(tīng) 'data' 事件
如果沒(méi)有添加 'response' 事件處理函數(shù),則響應(yīng)會(huì)被整個(gè)丟棄。如果添加了 'response' 事件處理函數(shù),則必須消耗完響應(yīng)對(duì)象的數(shù)據(jù),可通過(guò)調(diào)用 response.read()、或添加一個(gè) 'data' 事件處理函數(shù)、或調(diào)用.resume() 方法。數(shù)據(jù)被消耗完時(shí)會(huì)觸發(fā)'end' 事件。在數(shù)據(jù)被讀取完之前會(huì)消耗內(nèi)存,可能會(huì)造成 'process out of memory' 錯(cuò)誤
[注意]Node.js 不會(huì)檢查 Content-Length 與已傳輸?shù)恼?qǐng)求主體的長(zhǎng)度是否相等
var http = require('http');var server = http.createServer(function(req, res){ console.log(req.url );//'/' console.log(req.httpVersion );//1.1 console.log(req.method );//GET //{"host":"127.0.0.1:5000","connection":"keep-alive","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36","accept":"p_w_picpath/webp,p_w_picpath/*,*/*;q=0.8","referer":"http://127.0.0.1:5000/","accept-encoding":"gzip, deflate, sdch, br","accept-language":"zh-CN,zh;q=0.8,en;q=0.6"} console.log(JSON.stringify(req.headers) ); res.end('ok'); }); server.listen(5000);
【abort事件】
當(dāng)請(qǐng)求已被客戶端終止時(shí)觸發(fā)。 該事件僅在首次調(diào)用 abort() 時(shí)觸發(fā)
【aborted事件】
當(dāng)請(qǐng)求已被服務(wù)器終止且網(wǎng)絡(luò) socket 已關(guān)閉時(shí)觸發(fā)
【connect事件】
response <http.IncomingMessage>socket <net.Socket>head <Buffer>
當(dāng)服務(wù)器響應(yīng)CONNECT請(qǐng)求時(shí)觸發(fā)。 如果該事件未被監(jiān)聽(tīng),則接收到CONNECT方法的客戶端會(huì)關(guān)閉連接
【continue事件】
當(dāng)服務(wù)器發(fā)送了一個(gè) 100 Continue 的 HTTP 響應(yīng)時(shí)觸發(fā),通常是因?yàn)檎?qǐng)求包含 Expect: 100-continue。 這是客戶端將要發(fā)送請(qǐng)求主體的指令
【response 事件】
response <http.IncomingMessage>
當(dāng)請(qǐng)求的響應(yīng)被接收到時(shí)觸發(fā)。 該事件只觸發(fā)一次
【socket 事件】
socket <net.Socket>
當(dāng) socket 被分配到請(qǐng)求后觸發(fā)
【upgrade事件】
response <http.IncomingMessage>socket <net.Socket>head <Buffer>
每當(dāng)服務(wù)器響應(yīng) upgrade 請(qǐng)求時(shí)觸發(fā)。 如果該事件未被監(jiān)聽(tīng),則接收到 upgrade 請(qǐng)求頭的客戶端會(huì)關(guān)閉連接
【request.abort()】
標(biāo)記請(qǐng)求為終止。 調(diào)用該方法將使響應(yīng)中剩余的數(shù)據(jù)被丟棄且 socket 被銷(xiāo)毀
【request.aborted】
如果請(qǐng)求已被終止,則該屬性的值為請(qǐng)求被終止的時(shí)間,從 1 January 1970 00:00:00 UTC 到現(xiàn)在的毫秒數(shù)
【request.end([data][, encoding][, callback])】
data <string> | <Buffer>encoding <string>callback <Function>
結(jié)束發(fā)送請(qǐng)求。 如果部分請(qǐng)求主體還未被發(fā)送,則會(huì)刷新它們到流中。 如果請(qǐng)求是分塊的,則會(huì)發(fā)送終止字符 '0\r\n\r\n'。
如果指定了 data,則相當(dāng)于調(diào)用 response.write(data, encoding) 之后再調(diào)用 request.end(callback)。
如果指定了 callback,則當(dāng)請(qǐng)求流結(jié)束時(shí)會(huì)被調(diào)用
【request.flushHeaders()】
刷新請(qǐng)求頭
出于效率的考慮,Node.js 通常會(huì)緩存請(qǐng)求頭直到 request.end() 被調(diào)用或第一塊請(qǐng)求數(shù)據(jù)被寫(xiě)入。 然后 Node.js 會(huì)將請(qǐng)求頭和數(shù)據(jù)打包成一個(gè)單一的 TCP 數(shù)據(jù)包。通常那是期望的(因?yàn)樗?jié)省了 TCP 往返),除非第一個(gè)數(shù)據(jù)塊很長(zhǎng)時(shí)間之后才被發(fā)送。 request.flushHeaders() 可以繞過(guò)最優(yōu)選擇并提前開(kāi)始請(qǐng)求
【request.setNoDelay([noDelay])】
noDelay <boolean>
一旦 socket 被分配給請(qǐng)求且已連接,socket.setNoDelay() 會(huì)被調(diào)用
【request.setSocketKeepAlive([enable][, initialDelay])】
enable <boolean>initialDelay <number>
一旦 socket 被分配給請(qǐng)求且已連接,socket.setKeepAlive() 會(huì)被調(diào)用
【request.setTimeout(timeout[, callback])】
timeout <number><Function> 可選的函數(shù),當(dāng)超時(shí)發(fā)生時(shí)被調(diào)用。等同于綁定到 timeout 事件 返回 request
一旦 socket 被分配給請(qǐng)求且已連接,socket.setTimeout() 會(huì)被調(diào)用
【request.write(chunk[, encoding][, callback])】
chunk <string> | <Buffer><string> encoding 參數(shù)是可選的,僅當(dāng) chunk 是一個(gè)字符串時(shí)才有效。默認(rèn)為 'utf8'<Function> callback 參數(shù)是可選的,當(dāng)數(shù)據(jù)塊被刷新時(shí)調(diào)用 返回 request
發(fā)送請(qǐng)求主體的一個(gè)數(shù)據(jù)塊。 通過(guò)多次調(diào)用該方法,一個(gè)請(qǐng)求主體可被發(fā)送到一個(gè)服務(wù)器,在這種情況下,當(dāng)創(chuàng)建請(qǐng)求時(shí),建議使用 ['Transfer-Encoding', 'chunked'] 請(qǐng)求頭
大多數(shù)nodejs開(kāi)發(fā)者都是沖著開(kāi)發(fā)web server的目的選擇了nodejs。借助http模塊,可以幾行代碼就搞定一個(gè)超迷你的web server
【http.createServer([requestListener])】
該方法創(chuàng)建并返回一個(gè)HTTP服務(wù)器對(duì)象
requestListener表示監(jiān)聽(tīng)到客戶端連接的回調(diào)函數(shù)
var server = http.createServer(function(req,res){});
【server.listen(port[, hostname][, backlog][, callback])】
該方法在指定的的端口和主機(jī)名上開(kāi)始接收連接
port表示要監(jiān)聽(tīng)的端口,若不設(shè)置,則端口由系統(tǒng)自動(dòng)分配
若忽略主機(jī)名hostname,服務(wù)器將會(huì)接收指向任意IPv4的地址(INADDR_ANY)
若監(jiān)聽(tīng)一個(gè)unix socket,需要提供一個(gè)文件名而不是主機(jī)名和端口
若積壓量backlog為等待連接隊(duì)列的最大長(zhǎng)度,即允許多少個(gè)客戶端在隊(duì)列中存在。實(shí)際的長(zhǎng)度由操作系統(tǒng)的sysctl設(shè)置決定。默認(rèn)參數(shù)值為511
最后一個(gè)參數(shù)callback是異步函數(shù),會(huì)作為事件監(jiān)聽(tīng)器添加到listening事件
server.listen(5000);
【request事件】
當(dāng)有客戶端發(fā)送請(qǐng)求到該主機(jī)和端口的請(qǐng)求的時(shí)候觸發(fā)
參數(shù)request : http.IncomingMessage的一個(gè)實(shí)例,通過(guò)他我們可以獲取到這次請(qǐng)求的一些信息,比如頭信息,數(shù)據(jù)等
參數(shù)response : http.ServerResponse的一個(gè)實(shí)例,通過(guò)他我們可以向該次請(qǐng)求的客戶端輸出返回響應(yīng)
server.on('request',function(request,response){ console.log('收到信息'); })
由于createServer()的參數(shù)是requestListener,所以可以把request事件中的回調(diào)函數(shù)寫(xiě)為createServer()的參數(shù)
var server = http.createServer(function(req,res){ console.log('收到信息'); });
于是,利用上面幾個(gè)方法就可以創(chuàng)建一個(gè)簡(jiǎn)單的server
var http = require('http');var server = http.createServer(function(req,res){ console.log('收到信息'); }); server.listen(5000);
在瀏覽器地址欄中輸入127.0.0.1:5000,控制臺(tái)會(huì)顯示'收到信息'這4個(gè)字
【checkContinue事件】
request <http.IncomingMessage>response <http.ServerResponse>
每當(dāng)接收到一個(gè)帶有 HTTP Expect: 100-continue 請(qǐng)求頭的請(qǐng)求時(shí)觸發(fā)。 如果該事件未被監(jiān)聽(tīng),則服務(wù)器會(huì)自動(dòng)響應(yīng) 100 Continue
處理該事件時(shí),如果客戶端應(yīng)該繼續(xù)發(fā)送請(qǐng)求主體,則調(diào)用 response.writeContinue(),否則生成一個(gè)適當(dāng)?shù)?HTTP 響應(yīng)(例如 400 錯(cuò)誤請(qǐng)求)。
[注意]當(dāng)該事件被觸發(fā)且處理后,request 事件不會(huì)被觸發(fā)
【checkExpectation事件】
request <http.ClientRequest>response <http.ServerResponse>
每當(dāng)接收到一個(gè)帶有 HTTP Expect 請(qǐng)求頭(值不為 100-continue)的請(qǐng)求時(shí)觸發(fā)。 如果該事件未被監(jiān)聽(tīng),則服務(wù)器會(huì)自動(dòng)響應(yīng) 417 Expectation Failed。
[注意]當(dāng)該事件被觸發(fā)且處理后,request 事件不會(huì)被觸發(fā)
【clientError事件】
exception <Error>socket <net.Socket> socket 參數(shù)是發(fā)生錯(cuò)誤的 net.Socket 對(duì)象
如果客戶端觸發(fā)了一個(gè)error事件,則它會(huì)被傳遞到這里。該事件的監(jiān)聽(tīng)器負(fù)責(zé)關(guān)閉或銷(xiāo)毀底層的socket。例如,用戶可能希望更溫和地用HTTP '400 Bad Request'響應(yīng)關(guān)閉 socket,而不是突然地切斷連接
默認(rèn)情況下,請(qǐng)求異常時(shí)會(huì)立即銷(xiāo)毀 socket
var http = require('http');var server = http.createServer((req, res) => { res.end(); }); server.on('clientError', (err, socket) => { socket.end('HTTP/1.1 400 Bad Request\r\n\r\n'); }); server.listen(8000);
當(dāng) 'clientError' 事件發(fā)生時(shí),不會(huì)有 request 或 response 對(duì)象,所以發(fā)送的任何 HTTP 響應(yīng),包括響應(yīng)頭和內(nèi)容,必須被直接寫(xiě)入到 socket 對(duì)象。 注意,確保響應(yīng)是一個(gè)被正確格式化的 HTTP 響應(yīng)消息
【close事件】
當(dāng)服務(wù)器關(guān)閉時(shí)觸發(fā)
【connect事件】
request <http.IncomingMessage> HTTP 請(qǐng)求,同 request 事件。 socket <net.Socket> 服務(wù)器與客戶端之間的網(wǎng)絡(luò) socket。 head <Buffer> 流的第一個(gè)數(shù)據(jù)包,可能為空。
當(dāng)客戶端發(fā)送HTTP CONNECT請(qǐng)求時(shí)觸發(fā)。 如果該事件未被監(jiān)聽(tīng),則發(fā)送CONNECT請(qǐng)求的客戶端會(huì)關(guān)閉連接
當(dāng)該事件被觸發(fā)后,請(qǐng)求的 socket 上沒(méi)有 data 事件監(jiān)聽(tīng)器,這意味著需要綁定 data 事件監(jiān)聽(tīng)器,用來(lái)處理 socket 上被發(fā)送到服務(wù)器的數(shù)據(jù)
【connection 事件】
socket <net.Socket>
當(dāng)一個(gè)新的 TCP 流被建立時(shí)觸發(fā)。 socket 是一個(gè) net.Socket 類(lèi)型的對(duì)象。 通常用戶無(wú)需訪問(wèn)該事件。 注意,因?yàn)閰f(xié)議解析器綁定到 socket 的方式,socket 不會(huì)觸發(fā) 'readable' 事件。 socket 也可以通過(guò) request.connection 訪問(wèn)
【upgrade事件】
request <http.IncomingMessage> HTTP 請(qǐng)求,同 'request' 事件。 socket <net.Socket> 服務(wù)器與客戶端之間的網(wǎng)絡(luò) socket。 head <Buffer> 流的第一個(gè)數(shù)據(jù)包,可能為空。
每當(dāng)客戶端發(fā)送HTTP upgrade請(qǐng)求時(shí)觸發(fā)。 如果該事件未被監(jiān)聽(tīng),則發(fā)送upgrade請(qǐng)求的客戶端會(huì)關(guān)閉連接
當(dāng)該事件被觸發(fā)后,請(qǐng)求的 socket 上沒(méi)有 'data' 事件監(jiān)聽(tīng)器,這意味著需要綁定 'data' 事件監(jiān)聽(tīng)器,用來(lái)處理 socket 上被發(fā)送到服務(wù)器的數(shù)據(jù)
【server.close([callback])】
停止服務(wù)端接收新的連接
【server.listening】
<boolean>
返回一個(gè)布爾值,表示服務(wù)器是否正在監(jiān)聽(tīng)連接
【server.maxHeadersCount】
<number> 默認(rèn)為 2000
限制請(qǐng)求頭的最大數(shù)量,默認(rèn)為 2000。 如果設(shè)為 0,則沒(méi)有限制
【server.setTimeout([msecs][, callback])】
msecs <number> 默認(rèn)為 120000 (2<Function> 返回 server
設(shè)置socket的超時(shí)時(shí)間。 如果發(fā)生超時(shí),則觸發(fā)服務(wù)器對(duì)象的'timeout'事件,并傳入socket作為一個(gè)參數(shù)
默認(rèn)情況下,服務(wù)器的超時(shí)時(shí)間是 2 分鐘,且超時(shí)后的 socket 會(huì)被自動(dòng)銷(xiāo)毀。 但是,如果你為服務(wù)器的 'timeout' 事件分配了一個(gè)回調(diào)函數(shù),則超時(shí)必須被顯式地處理
【server.timeout】
<number> 超時(shí)時(shí)間,以毫秒為單位。默認(rèn)為 120000 (2 分鐘)
socket 被認(rèn)定為超時(shí)的空閑毫秒數(shù)。值設(shè)為 0 可禁用請(qǐng)求連接的超時(shí)行為
[注意]socket 的超時(shí)邏輯是在連接上設(shè)定的,所以改變這個(gè)值只影響服務(wù)器新建的連接,而不會(huì)影響任何已存在的連接
該對(duì)象在 HTTP 服務(wù)器內(nèi)部被創(chuàng)建。 它作為第二個(gè)參數(shù)被傳入 'request' 事件。這個(gè)類(lèi)實(shí)現(xiàn)了(而不是繼承自)可寫(xiě)流接口
var http = require('http');var server = http.createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'}); res.end('小火柴'); }); server.listen(8000);
【close事件】
當(dāng)?shù)讓舆B接在 response.end() 被調(diào)用或能夠刷新之前被終止時(shí)觸發(fā)
【finish事件】
當(dāng)響應(yīng)已被發(fā)送時(shí)觸發(fā)。 更具體地說(shuō),當(dāng)響應(yīng)頭和響應(yīng)主體的最后一部分已被交給操作系統(tǒng)通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸時(shí),觸發(fā)該事件。 這并不意味著客戶端已接收到任何東西。該事件觸發(fā)后,響應(yīng)對(duì)象上不再觸發(fā)其他事件
【response.addTrailers(headers)】
headers <Object>
該方法會(huì)添加 HTTP 尾部響應(yīng)頭(一種在消息尾部的響應(yīng)頭)到響應(yīng)。
僅當(dāng)響應(yīng)使用分塊編碼時(shí),尾部響應(yīng)頭才會(huì)被發(fā)送;否則(比如請(qǐng)求為 HTTP/1.0),尾部響應(yīng)頭會(huì)被丟棄。
[注意]發(fā)送尾部響應(yīng)頭之前,需先發(fā)送 Trailer 響應(yīng)頭,并在值里帶上尾部響應(yīng)頭字段的列表
response.writeHead(200, { 'Content-Type': 'text/plain', 'Trailer': 'Content-MD5' }); response.write(fileData); response.addTrailers({'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667'}); response.end();
如果尾部響應(yīng)頭字段的名稱(chēng)或值包含無(wú)效字符,則拋出 TypeError 錯(cuò)誤
【response.end([data][, encoding][, callback])】
data <string> | <Buffer>encoding <string> 如果指定了 data,則相當(dāng)于調(diào)用 response.write(data, encoding) 之后再調(diào)用 response.end(callback)callback <Function> 如果指定了 callback,則當(dāng)響應(yīng)流結(jié)束時(shí)被調(diào)用
該方法會(huì)通知服務(wù)器,所有響應(yīng)頭和響應(yīng)主體都已被發(fā)送,即服務(wù)器將其視為已完成。 每次響應(yīng)都必須調(diào)用 response.end() 方法
【response.finished】
<boolean>
返回一個(gè)布爾值,表示響應(yīng)是否已完成。 默認(rèn)為 false。 執(zhí)行 response.end() 之后,該值會(huì)變?yōu)?true
【response.getHeader(name)】
name <string>返回: <string>
讀取一個(gè)已入隊(duì)列但尚未發(fā)送到客戶端的響應(yīng)頭
[注意]名稱(chēng)不區(qū)分大小寫(xiě)
var contentType = response.getHeader('content-type');
【response.getHeaderNames()】
返回響應(yīng)頭名稱(chēng)的數(shù)組
response.setHeader('Foo', 'bar'); response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);var headerNames = response.getHeaderNames();// headerNames === ['foo', 'set-cookie']
【response.getHeaders()】
返回響應(yīng)頭數(shù)組
response.setHeader('Foo', 'bar'); response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);var headers = response.getHeaders();// headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] }
【response.hasHeader(name)】
是否包含當(dāng)前響應(yīng)頭
var hasContentType = response.hasHeader('content-type');
【response.headersSent】
返回一個(gè)布爾值(只讀)。 如果響應(yīng)頭已被發(fā)送則為 true,否則為 false
【response.removeHeader(name)】
從隱式發(fā)送的隊(duì)列中移除一個(gè)響應(yīng)頭
response.removeHeader('Content-Encoding');
【response.sendDate】
當(dāng)為 true 時(shí),如果響應(yīng)頭里沒(méi)有日期響應(yīng)頭,則日期響應(yīng)頭會(huì)被自動(dòng)生成并發(fā)送。默認(rèn)為 true。
該屬性只可在測(cè)試時(shí)被禁用,因?yàn)?HTTP 響應(yīng)需要包含日期響應(yīng)頭
【response.setHeader(name, value)】
name <string>value <string> | <string[]>
為一個(gè)隱式的響應(yīng)頭設(shè)置值。 如果該響應(yīng)頭已存在,則值會(huì)被覆蓋。 如果要發(fā)送多個(gè)名稱(chēng)相同的響應(yīng)頭,則使用字符串?dāng)?shù)組
response.setHeader('Content-Type', 'text/html'); response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
如果響應(yīng)頭字段的名稱(chēng)或值包含無(wú)效字符,則拋出 TypeError 錯(cuò)誤
response.setHeader()設(shè)置的響應(yīng)頭與response.writeHead()設(shè)置的響應(yīng)頭合并,response.writeHead()優(yōu)先
【response.setTimeout(msecs[, callback])】
msecs <number><Function> 返回 response
設(shè)置socket的超時(shí)時(shí)間為msecs。如果提供了回調(diào)函數(shù),它會(huì)作為監(jiān)聽(tīng)器被添加到響應(yīng)對(duì)象的'timeout'事件
如果沒(méi)有 'timeout' 監(jiān)聽(tīng)器被添加到請(qǐng)求、響應(yīng)或服務(wù)器,則 socket 會(huì)在超時(shí)后被銷(xiāo)毀。 如果在請(qǐng)求、響應(yīng)或服務(wù)器的 'timeout' 事件上分配了回調(diào)函數(shù),則超時(shí)的 socket 必須被顯式地處理
【response.statusCode】
當(dāng)使用隱式的響應(yīng)頭時(shí)(沒(méi)有顯式地調(diào)用 response.writeHead()),該屬性控制響應(yīng)頭刷新時(shí)將被發(fā)送到客戶端的狀態(tài)碼
response.statusCode = 404;
響應(yīng)頭被發(fā)送到客戶端后,該屬性表示被發(fā)出的狀態(tài)碼
【response.statusMessage】
當(dāng)使用隱式的響應(yīng)頭時(shí)(沒(méi)有顯式地調(diào)用 response.writeHead()),該屬性控制響應(yīng)頭刷新時(shí)將被發(fā)送到客戶端的狀態(tài)信息。 如果該值為 undefined,則使用狀態(tài)碼的標(biāo)準(zhǔn)信息
response.statusMessage = 'Not found';
響應(yīng)頭被發(fā)送到客戶端后,該屬性表示被發(fā)出的狀態(tài)信息
【response.write(chunk[, encoding][, callback])】
chunk <string> | <Buffer>encoding <string>callback <Function>返回: <boolean>
如果該方法被調(diào)用且 response.writeHead() 沒(méi)有被調(diào)用,則它會(huì)切換到隱式響應(yīng)頭模式并刷新隱式響應(yīng)頭。
該方法會(huì)發(fā)送一塊響應(yīng)主體。 它可被多次調(diào)用,以便提供連續(xù)的響應(yīng)主體片段
chunk 可以是一個(gè)字符串或一個(gè) buffer。 如果 chunk 是一個(gè)字符串,則第二個(gè)參數(shù)指定如何將它編碼成一個(gè)字節(jié)流。 encoding 默認(rèn)為 'utf8'。 當(dāng)數(shù)據(jù)塊被刷新時(shí),callback 會(huì)被調(diào)用。
[注意]這是原始的 HTTP 主體,且與可能被使用的高級(jí)主體編碼無(wú)關(guān)
【response.write()】
首次被調(diào)用時(shí),會(huì)發(fā)送緩沖的響應(yīng)頭信息和響應(yīng)主體的第一塊數(shù)據(jù)到客戶端。 response.write() 第二次被調(diào)用時(shí),Node.js 會(huì)以流的形式處理數(shù)據(jù),并將它們分別發(fā)送。 也就是說(shuō),響應(yīng)會(huì)被緩沖到響應(yīng)主體的第一個(gè)數(shù)據(jù)塊。
如果全部數(shù)據(jù)被成功刷新到內(nèi)核緩沖區(qū),則返回 true。 如果全部或部分?jǐn)?shù)據(jù)還在內(nèi)存中排隊(duì),則返回 false。 當(dāng)緩沖區(qū)再次空閑時(shí),則觸發(fā) 'drain' 事件
【response.writeContinue()】
發(fā)送一個(gè) HTTP/1.1 100 Continue 消息到客戶端,表示請(qǐng)求主體可以開(kāi)始發(fā)送
【response.writeHead(statusCode[, statusMessage][, headers])】
statusCode <number> 狀態(tài)碼是一個(gè)三位數(shù)的 HTTP 狀態(tài)碼,如 404statusMessage <string> statusMessage 是可選的狀態(tài)描述headers <Object> headers 是響應(yīng)頭
發(fā)送一個(gè)響應(yīng)頭給請(qǐng)求
var body = 'hello world'; response.writeHead(200, { 'Content-Length': Buffer.byteLength(body), 'Content-Type': 'text/plain' });
該方法在消息中只能被調(diào)用一次,且必須在 response.end() 被調(diào)用之前調(diào)用。
如果在調(diào)用該方法之前調(diào)用 response.write() 或 response.end(),則隱式的響應(yīng)頭會(huì)被處理并調(diào)用該函數(shù)。
response.setHeader() 設(shè)置的響應(yīng)頭會(huì)與 response.writeHead() 設(shè)置的響應(yīng)頭合并,且 response.writeHead() 的優(yōu)先
// 返回 content-type = text/plainvar server = http.createServer((req, res) => { res.setHeader('Content-Type', 'text/html'); res.setHeader('X-Foo', 'bar'); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('ok'); });
[注意]Content-Length 是以字節(jié)(而不是字符)為單位的。如果響應(yīng)主體包含高級(jí)編碼的字符,則應(yīng)使用 Buffer.byteLength() 來(lái)確定在給定編碼中的字節(jié)數(shù)。 Node.js 不會(huì)檢查 Content-Length 與已發(fā)送的響應(yīng)主體的長(zhǎng)度是否相同。
如果響應(yīng)頭字段的名稱(chēng)或值包含無(wú)效字符,則拋出 TypeError 錯(cuò)誤
IncomingMessage 對(duì)象由 http.Server 或 http.ClientRequest 創(chuàng)建,并作為第一個(gè)參數(shù)分別遞給 'request' 和 'response' 事件。 它可以用來(lái)訪問(wèn)響應(yīng)狀態(tài)、消息頭、以及數(shù)據(jù)。它實(shí)現(xiàn)了 可讀流 接口
【aborted事件】
當(dāng)請(qǐng)求已被客戶端終止且網(wǎng)絡(luò) socket 已關(guān)閉時(shí)觸發(fā)
【close事件】
當(dāng)?shù)讓舆B接被關(guān)閉時(shí)觸發(fā)。 同 end 事件一樣,該事件每個(gè)響應(yīng)只觸發(fā)一次
【message.destroy([error])】
調(diào)用接收到 IncomingMessage 的 socket 上的 destroy() 方法。 如果提供了 error,則觸發(fā) error 事件,且把 error 作為參數(shù)傳入事件的監(jiān)聽(tīng)器
【message.headers】
<Object>
請(qǐng)求頭或響應(yīng)頭的對(duì)象
頭信息的名稱(chēng)與值的鍵值對(duì)。 頭信息的名稱(chēng)為小寫(xiě)
// { 'user-agent': 'curl/7.22.0',// host: '127.0.0.1:8000',// accept: '*/*' }console.log(request.headers);
【message.httpVersion】
<string>
在服務(wù)器請(qǐng)求中,該屬性返回客戶端發(fā)送的 HTTP 版本。在客戶端響應(yīng)中,該屬性返回連接到的服務(wù)器的 HTTP 版本。 可能的值有 '1.1' 或 '1.0'
message.httpVersionMajor 返回 HTTP 版本的第一個(gè)整數(shù)值,message.httpVersionMinor 返回 HTTP 版本的第二個(gè)整數(shù)值
【message.method】
返回一個(gè)字符串,表示請(qǐng)求的方法。 該屬性只讀。 例如:'GET'、'DELETE'。
[注意]僅在 http.Server 返回的請(qǐng)求中有效。
【message.rawHeaders】
<Array>
接收到的原始的請(qǐng)求頭或響應(yīng)頭列表。
[注意]鍵和值在同一個(gè)列表中。 偶數(shù)位的是鍵,奇數(shù)位的是對(duì)應(yīng)的值。
頭信息的名稱(chēng)不會(huì)被轉(zhuǎn)換為小寫(xiě),重復(fù)的也不會(huì)被合并
// [ 'user-agent',// 'this is invalid because there can be only one',// 'User-Agent',// 'curl/7.22.0',// 'Host',// '127.0.0.1:8000',// 'ACCEPT',// '*/*' ]console.log(request.rawHeaders);
【message.rawTrailers】
<Array>
接收到的原始的 Trailer 請(qǐng)求頭或響應(yīng)頭的的鍵和值。 只在 'end' 事件時(shí)被賦值
【message.setTimeout(msecs, callback)】
msecs <number>callback <Function>返回 message
調(diào)用 message.connection.setTimeout(msecs, callback)
【message.socket】
<net.Socket>
返回與連接關(guān)聯(lián)的 net.Socket 對(duì)象。
通過(guò) HTTPS 的支持,使用 request.socket.getPeerCertificate() 獲取客戶端的認(rèn)證信息
【message.statusCode】
<number>
返回一個(gè)三位數(shù)的 HTTP 響應(yīng)狀態(tài)碼。 如 404
[注意]僅在 http.ClientRequest 返回的響應(yīng)中有效。
【message.statusMessage】
<string>
僅在 http.ClientRequest 返回的響應(yīng)中有效。
返回 HTTP 響應(yīng)狀態(tài)消息(原因描述)。 如 OK 或 Internal Server Error
【message.trailers】
<Object>
返回 Trailer 請(qǐng)求頭或響應(yīng)頭對(duì)象。 只在 'end' 事件時(shí)被賦值
【message.url】
<string>
返回請(qǐng)求的 URL 字符串。 僅包含實(shí)際 HTTP 請(qǐng)求中的 URL
[注意]僅在 http.Server 返回的請(qǐng)求中有效
【http.METHODS】
<Array>
返回解析器支持的 HTTP 方法的列表
【http.STATUS_CODES】
<Object>
返回標(biāo)準(zhǔn)的 HTTP 響應(yīng)狀態(tài)碼的集合,以及各自的簡(jiǎn)短描述
http.STATUS_CODES[404] === 'Not Found'
【http.createServer([requestListener])】
requestListener <Function> requestListener 是一個(gè)函數(shù),會(huì)被自動(dòng)添加到 'request' 事件返回: <http.Server>
返回一個(gè)新建的 http.Server 實(shí)例
【http.get(options[, callback])】
options <Object> | <string> callback <Function>返回: <http.ClientRequest>
因?yàn)榇蠖鄶?shù)請(qǐng)求都是 GET 請(qǐng)求且不帶請(qǐng)求主體,所以 Node.js 提供了該便捷方法。 該方法與 http.request() 唯一的區(qū)別是它設(shè)置請(qǐng)求方法為 GET 且自動(dòng)調(diào)用 req.end()。 注意,響應(yīng)數(shù)據(jù)必須在回調(diào)中被消耗
callback 被調(diào)用時(shí)只傳入一個(gè)參數(shù),該參數(shù)是 http.IncomingMessage 的一個(gè)實(shí)例
var http = require('http'); http.get('http://127.0.0.1:3000', function(res){ console.log(res.statusCode);//200});
【http.globalAgent】
<http.Agent>
Agent 的全局實(shí)例,作為所有 HTTP 客戶端請(qǐng)求的默認(rèn) Agent
【http.request(options[, callback])】
options <Object> | <string> options是一個(gè)對(duì)象或字符串。如果是一個(gè)字符串,它會(huì)被自動(dòng)使用url.parse()解析 protocol <string> 使用的協(xié)議。默認(rèn)為 http:。 host <string> 請(qǐng)求發(fā)送至的服務(wù)器的域名或 IP 地址。默認(rèn)為 localhost。 hostname <string> host 的別名。為了支持 url.parse(),hostname 優(yōu)于 host。 family <number> 當(dāng)解析host和hostname時(shí)使用的IP地址族。 有效值是4或6。當(dāng)未指定時(shí),則同時(shí)使用IPv4和v6 port <number> 遠(yuǎn)程服務(wù)器的端口。默認(rèn)為 80。 localAddress <string> 為網(wǎng)絡(luò)連接綁定的本地接口。 socketPath <string> Unix 域 Socket(使用 host:port 或 socketPath)。 method <string> 指定 HTTP 請(qǐng)求方法的字符串。默認(rèn)為 'GET'。 path <string> 請(qǐng)求的路徑。默認(rèn)為 '/'。 應(yīng)包括查詢字符串(如有的話)。如 '/index.html?page=12'。 當(dāng)請(qǐng)求的路徑中包含非法字符時(shí),會(huì)拋出異常。 目前只有空字符會(huì)被拒絕,但未來(lái)可能會(huì)變化。 headers <Object> 包含請(qǐng)求頭的對(duì)象。 auth <string> 基本身份驗(yàn)證,如 'user:password' 用來(lái)計(jì)算 Authorization 請(qǐng)求頭。 agent <http.Agent> | <boolean> 控制 Agent 的行為。 可能的值有: undefined (默認(rèn)): 對(duì)該主機(jī)和端口使用 http.globalAgent。 Agent 對(duì)象:顯式地使用傳入的 Agent。 false: 創(chuàng)建一個(gè)新的使用默認(rèn)值的 Agent。 createConnection <Function> 當(dāng)不使用 agent 選項(xiàng)時(shí),為請(qǐng)求創(chuàng)建一個(gè) socket 或流。 這可以用于避免僅僅創(chuàng)建一個(gè)自定義的 Agent 類(lèi)來(lái)覆蓋默認(rèn)的 createConnection 函數(shù)。詳見(jiàn) agent.createConnection()。 timeout <number>: 指定 socket 超時(shí)的毫秒數(shù)。 它設(shè)置了 socket 等待連接的超時(shí)時(shí)間。 callback <Function> 可選的 callback 參數(shù)會(huì)作為單次監(jiān)聽(tīng)器被添加到 'response' 事件
Node.js 為每臺(tái)服務(wù)器維護(hù)多個(gè)連接來(lái)進(jìn)行 HTTP 請(qǐng)求。 該函數(shù)允許顯式地發(fā)出請(qǐng)求。http.request() 返回一個(gè) http.ClientRequest 類(lèi)的實(shí)例。 ClientRequest 實(shí)例是一個(gè)可寫(xiě)流。 如果需要通過(guò) POST 請(qǐng)求上傳一個(gè)文件,則寫(xiě)入到 ClientRequest 對(duì)象
HTTPS 是 HTTP 基于 TLS/SSL 的版本。在 Node.js 中,它被實(shí)現(xiàn)為一個(gè)獨(dú)立的模塊
【server.setTimeout([msecs][, callback])】
msecs <number> Defaults to 120000 (2 minutes). callback <Function>
【server.timeout】
<number> Defaults to 120000 (2 minutes)
【server.keepAliveTimeout】
<number> Defaults to 5000 (5 seconds)
【server.close([callback])】
callback <Function>
【server.listen([port][, host][, backlog][, callback])】
port <number>hostname <string>backlog <number>callback <Function>
【https.createServer(options[, requestListener])】
options <Object>requestListener <Function>
【https.get(options[, callback])】
options <Object> | <string> options是一個(gè)對(duì)象或是字符串。如果是字符串, 它自動(dòng)被url.parse()所解析 callback <Function>
類(lèi)似 http.get(),但是用于 HTTPS
參數(shù) options 可以是一個(gè)對(duì)象或是一個(gè)字符串。 如果參數(shù) options 是一個(gè)字符串, 它自動(dòng)被 url.parse() 所解析
【https.globalAgent】
https.Agent的全局實(shí)例,用于所有HTTPS客戶端請(qǐng)求
【https.request(options[, callback])】
options <Object> | <string> protocol Defaults to https: port Defaults to 443. agent Defaults to https.globalAgent. callback <Function>
向一個(gè)安全的服務(wù)器發(fā)起一個(gè)請(qǐng)求
參數(shù)options可以是一個(gè)對(duì)象或是一個(gè)字符串。如果一個(gè)字符串,它自動(dòng)被 url.parse()所解析
【簡(jiǎn)單的GET請(qǐng)求】
var https = require('https'); https.get('https://www.cnblogs.com/', function(res){ var data = ''; res.setEncoding('utf8'); res.on('data', function(chunk){ data += chunk; }); res.on('end', function(){ console.log(data); }); });
【簡(jiǎn)單的POST請(qǐng)求】
var http = require('http');var querystring = require('querystring');var createClientPostRequest = function(){ var options = { method: 'POST', protocol: 'http:', hostname: '127.0.0.1', port: '3000', path: '/post', headers: { "connection": "keep-alive", "content-type": "application/x-www-form-urlencoded" } }; // 發(fā)送給服務(wù)端的數(shù)據(jù) var postBody = { a: '1' }; // 創(chuàng)建客戶端請(qǐng)求 var client = http.request(options, function(res){ // 最終輸出:Server got client data: nick=chyingp res.pipe(process.stdout); }); // 發(fā)送的報(bào)文主體,記得先用 querystring.stringify() 處理下 client.write( querystring.stringify(postBody) ); client.end(); };// 服務(wù)端程序,只是負(fù)責(zé)回傳客戶端數(shù)據(jù)var server = http.createServer(function(req, res){ res.write('Server got client data: '); req.pipe(res); }); server.listen(3000, createClientPostRequest);
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。