前面的話

  HTTP不是基于特定語言的,是一個通用的應(yīng)用層協(xié)議,不同語言有不同的實現(xiàn)細節(jié),但是萬變不離其宗,思想是相同的。NodeJS作為一個宿主運行環(huán)境,以JavaScript為宿主語言,它也有自己實現(xiàn)的一套標準,本文將詳細介紹nodeJS中的Http模塊

 

Agent

【new Agent([options])】

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

options <Object> 代理的配置選項。有以下字段:
    keepAlive <boolean> 保持 socket 可用即使沒有請求,以便它們可被將來的請求使用而無需重新建立一個 TCP 連接。默認為 false。
    keepAliveMsecs <number> 當使用了 keepAlive 選項時,該選項指定 TCP Keep-Alive 數(shù)據(jù)包的 初始延遲。 當 keepAlive 選項為 false 或 undefined 時,該選項無效。 默認為 1000。
    maxSockets <number> 每個主機允許的最大 socket 數(shù)量。 默認為 Infinity。
    maxFreeSockets <number> 在空閑狀態(tài)下允許打開的最大 socket 數(shù)量。 僅當 keepAlive 為 true 時才有效。 默認為 256

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

  http.request() 使用的默認 http.globalAgent 的選項均為各自的默認值

  若要配置其中任何一個,則需要創(chuàng)建自定義的 http.Agent 實例

【agent.createConnection(options[, callback])】

options <Object> 包含連接詳情的選項
callback <Function> 接收被創(chuàng)建的 socket 的回調(diào)函數(shù)。callback 有 (err, stream) 參數(shù)
返回: <net.Socket>

  創(chuàng)建一個用于 HTTP 請求的 socket 或流

  默認情況下,函數(shù)類似于net.createConnection()。但如果期望更大的靈活性,自定義代理可重寫該方法

  socket 或流可以通過以下兩種方式獲?。簭脑摵瘮?shù)返回或傳入callback

【agent.destroy()】

  銷毀當前正被代理使用的任何socket

  通常不需要這么做。但是如果使用的代理啟用了keepAlive,則當確定它不再被使用時,最好顯式地關(guān)閉代理。 否則,在服務(wù)器終止它們之前,socket 可能還會長時間保持打開

【agent.freeSockets】

  返回一個對象,包含當前正在等待被啟用了 keepAlive 的代理使用的 socket 數(shù)組。不要修改該屬性

【agent.getName(options)】

options <Object> 為名稱生成程序提供信息的選項。
    host <string> 請求發(fā)送至的服務(wù)器的域名或 IP 地址。
    port <number> 遠程服務(wù)器的端口。
    localAddress <string> 當發(fā)送請求時,為網(wǎng)絡(luò)連接綁定的本地接口。
返回: <string>

  為請求選項的集合獲取一個唯一的名稱,用來判斷一個連接是否可以被復用。 對于 HTTP 代理,返回 host:port:localAddress。 對于 HTTPS 代理,名稱會包含 CA、證書、密碼、以及其他 HTTPS/TLS 特有的用于判斷 socket 復用性的選項

【agent.maxFreeSockets】

  默認為 256。 對于已啟用 keepAlive 的代理,該屬性可設(shè)置要保留的空閑 socket 的最大數(shù)量

【agent.maxSockets】

  默認為不限制。 該屬性可設(shè)置代理為每個來源打開的并發(fā) socket 的最大數(shù)量。 來源是一個 'host:port' 或 'host:port:localAddress' 組合

【agent.requests】

  返回一個對象,包含還未被分配到 socket 的請求隊列。 不要修改

【agent.sockets】

  返回一個對象,包含當前正被代理使用的 socket 數(shù)組。 不要修改

 

Request

【http.ClientRequest】

  該對象在http.request()內(nèi)部被創(chuàng)建并返回。它表示著一個正在處理的請求,其請求頭已進入隊列。請求頭仍可使用setHeader(name, value)、getHeader(name) 和 removeHeader(name) API 進行修改。實際的請求頭會與第一個數(shù)據(jù)塊一起發(fā)送或當關(guān)閉連接時發(fā)送

  要獲取響應(yīng),需為 'response' 事件添加一個監(jiān)聽器到請求對象上。當響應(yīng)頭被接收到時,'response' 事件會從請求對象上被觸發(fā) 。 'response'事件被執(zhí)行時帶有一個參數(shù),該參數(shù)是一個 http.IncomingMessage 實例。在 'response' 事件期間,可以添加監(jiān)聽器到響應(yīng)對象上,比如監(jiān)聽 'data' 事件

  如果沒有添加 'response' 事件處理函數(shù),則響應(yīng)會被整個丟棄。如果添加了 'response' 事件處理函數(shù),則必須消耗完響應(yīng)對象的數(shù)據(jù),可通過調(diào)用 response.read()、或添加一個 'data' 事件處理函數(shù)、或調(diào)用.resume() 方法。數(shù)據(jù)被消耗完時會觸發(fā)'end' 事件。在數(shù)據(jù)被讀取完之前會消耗內(nèi)存,可能會造成 'process out of memory' 錯誤

  [注意]Node.js 不會檢查 Content-Length 與已傳輸?shù)恼埱笾黧w的長度是否相等

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

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":"image/webp,image/*,*/*;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);

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

【abort事件】

  當請求已被客戶端終止時觸發(fā)。 該事件僅在首次調(diào)用 abort() 時觸發(fā)

【aborted事件】

  當請求已被服務(wù)器終止且網(wǎng)絡(luò) socket 已關(guān)閉時觸發(fā)

【connect事件】

response <http.IncomingMessage>socket <net.Socket>head <Buffer>

  當服務(wù)器響應(yīng)CONNECT請求時觸發(fā)。 如果該事件未被監(jiān)聽,則接收到CONNECT方法的客戶端會關(guān)閉連接

【continue事件】

  當服務(wù)器發(fā)送了一個 100 Continue 的 HTTP 響應(yīng)時觸發(fā),通常是因為請求包含 Expect: 100-continue。 這是客戶端將要發(fā)送請求主體的指令

【response 事件】

response <http.IncomingMessage>

  當請求的響應(yīng)被接收到時觸發(fā)。 該事件只觸發(fā)一次

【socket 事件】

socket <net.Socket>

  當 socket 被分配到請求后觸發(fā)

【upgrade事件】

response <http.IncomingMessage>socket <net.Socket>head <Buffer>

  每當服務(wù)器響應(yīng) upgrade 請求時觸發(fā)。 如果該事件未被監(jiān)聽,則接收到 upgrade 請求頭的客戶端會關(guān)閉連接

【request.abort()】

  標記請求為終止。 調(diào)用該方法將使響應(yīng)中剩余的數(shù)據(jù)被丟棄且 socket 被銷毀

【request.aborted】

  如果請求已被終止,則該屬性的值為請求被終止的時間,從 1 January 1970 00:00:00 UTC 到現(xiàn)在的毫秒數(shù)

【request.end([data][, encoding][, callback])】

data <string> | <Buffer>encoding <string>callback <Function>

  結(jié)束發(fā)送請求。 如果部分請求主體還未被發(fā)送,則會刷新它們到流中。 如果請求是分塊的,則會發(fā)送終止字符 '0\r\n\r\n'。

  如果指定了 data,則相當于調(diào)用 response.write(data, encoding) 之后再調(diào)用 request.end(callback)。

  如果指定了 callback,則當請求流結(jié)束時會被調(diào)用

【request.flushHeaders()】

  刷新請求頭

  出于效率的考慮,Node.js 通常會緩存請求頭直到 request.end() 被調(diào)用或第一塊請求數(shù)據(jù)被寫入。 然后 Node.js 會將請求頭和數(shù)據(jù)打包成一個單一的 TCP 數(shù)據(jù)包。通常那是期望的(因為它節(jié)省了 TCP 往返),除非第一個數(shù)據(jù)塊很長時間之后才被發(fā)送。 request.flushHeaders() 可以繞過最優(yōu)選擇并提前開始請求

【request.setNoDelay([noDelay])】

noDelay <boolean>

  一旦 socket 被分配給請求且已連接,socket.setNoDelay() 會被調(diào)用

【request.setSocketKeepAlive([enable][, initialDelay])】

enable <boolean>initialDelay <number>

  一旦 socket 被分配給請求且已連接,socket.setKeepAlive() 會被調(diào)用

【request.setTimeout(timeout[, callback])】

timeout <number><Function> 可選的函數(shù),當超時發(fā)生時被調(diào)用。等同于綁定到 timeout 事件
返回 request

  一旦 socket 被分配給請求且已連接,socket.setTimeout() 會被調(diào)用

【request.write(chunk[, encoding][, callback])】

chunk <string> | <Buffer><string> encoding 參數(shù)是可選的,僅當 chunk 是一個字符串時才有效。默認為 'utf8'<Function> callback 參數(shù)是可選的,當數(shù)據(jù)塊被刷新時調(diào)用
返回 request

  發(fā)送請求主體的一個數(shù)據(jù)塊。 通過多次調(diào)用該方法,一個請求主體可被發(fā)送到一個服務(wù)器,在這種情況下,當創(chuàng)建請求時,建議使用 ['Transfer-Encoding', 'chunked'] 請求頭

 

Server

  大多數(shù)nodejs開發(fā)者都是沖著開發(fā)web server的目的選擇了nodejs。借助http模塊,可以幾行代碼就搞定一個超迷你的web server

【http.createServer([requestListener])】

  該方法創(chuàng)建并返回一個HTTP服務(wù)器對象

  requestListener表示監(jiān)聽到客戶端連接的回調(diào)函數(shù)

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

【server.listen(port[, hostname][, backlog][, callback])】

  該方法在指定的的端口和主機名上開始接收連接

  port表示要監(jiān)聽的端口,若不設(shè)置,則端口由系統(tǒng)自動分配

  若忽略主機名hostname,服務(wù)器將會接收指向任意IPv4的地址(INADDR_ANY)

  若監(jiān)聽一個unix socket,需要提供一個文件名而不是主機名和端口

  若積壓量backlog為等待連接隊列的最大長度,即允許多少個客戶端在隊列中存在。實際的長度由操作系統(tǒng)的sysctl設(shè)置決定。默認參數(shù)值為511

  最后一個參數(shù)callback是異步函數(shù),會作為事件監(jiān)聽器添加到listening事件

server.listen(5000);

【request事件】

  當有客戶端發(fā)送請求到該主機和端口的請求的時候觸發(fā)

  參數(shù)request : http.IncomingMessage的一個實例,通過他我們可以獲取到這次請求的一些信息,比如頭信息,數(shù)據(jù)等

  參數(shù)response : http.ServerResponse的一個實例,通過他我們可以向該次請求的客戶端輸出返回響應(yīng)

server.on('request',function(request,response){
    console.log('收到信息');
})

  由于createServer()的參數(shù)是requestListener,所以可以把request事件中的回調(diào)函數(shù)寫為createServer()的參數(shù)

var server = http.createServer(function(req,res){
    console.log('收到信息');
});

  于是,利用上面幾個方法就可以創(chuàng)建一個簡單的server

var http = require('http');var server = http.createServer(function(req,res){
    console.log('收到信息');
});
server.listen(5000);

  在瀏覽器地址欄中輸入127.0.0.1:5000,控制臺會顯示'收到信息'這4個字

【checkContinue事件】

request <http.IncomingMessage>response <http.ServerResponse>

  每當接收到一個帶有 HTTP Expect: 100-continue 請求頭的請求時觸發(fā)。 如果該事件未被監(jiān)聽,則服務(wù)器會自動響應(yīng) 100 Continue

  處理該事件時,如果客戶端應(yīng)該繼續(xù)發(fā)送請求主體,則調(diào)用 response.writeContinue(),否則生成一個適當?shù)?HTTP 響應(yīng)(例如 400 錯誤請求)。

  [注意]當該事件被觸發(fā)且處理后,request 事件不會被觸發(fā)

【checkExpectation事件】

request <http.ClientRequest>response <http.ServerResponse>

  每當接收到一個帶有 HTTP Expect 請求頭(值不為 100-continue)的請求時觸發(fā)。 如果該事件未被監(jiān)聽,則服務(wù)器會自動響應(yīng) 417 Expectation Failed。

  [注意]當該事件被觸發(fā)且處理后,request 事件不會被觸發(fā)

【clientError事件】

exception <Error>socket <net.Socket> socket 參數(shù)是發(fā)生錯誤的 net.Socket 對象

  如果客戶端觸發(fā)了一個error事件,則它會被傳遞到這里。該事件的監(jiān)聽器負責關(guān)閉或銷毀底層的socket。例如,用戶可能希望更溫和地用HTTP '400 Bad Request'響應(yīng)關(guān)閉 socket,而不是突然地切斷連接

  默認情況下,請求異常時會立即銷毀 socket

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

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

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

  當 'clientError' 事件發(fā)生時,不會有 request 或 response 對象,所以發(fā)送的任何 HTTP 響應(yīng),包括響應(yīng)頭和內(nèi)容,必須被直接寫入到 socket 對象。 注意,確保響應(yīng)是一個被正確格式化的 HTTP 響應(yīng)消息

【close事件】

  當服務(wù)器關(guān)閉時觸發(fā)

【connect事件】

request <http.IncomingMessage> HTTP 請求,同 request 事件。
socket <net.Socket> 服務(wù)器與客戶端之間的網(wǎng)絡(luò) socket。
head <Buffer> 流的第一個數(shù)據(jù)包,可能為空。

  當客戶端發(fā)送HTTP CONNECT請求時觸發(fā)。 如果該事件未被監(jiān)聽,則發(fā)送CONNECT請求的客戶端會關(guān)閉連接

  當該事件被觸發(fā)后,請求的 socket 上沒有 data 事件監(jiān)聽器,這意味著需要綁定 data 事件監(jiān)聽器,用來處理 socket 上被發(fā)送到服務(wù)器的數(shù)據(jù)

【connection 事件】

socket <net.Socket>

  當一個新的 TCP 流被建立時觸發(fā)。 socket 是一個 net.Socket 類型的對象。 通常用戶無需訪問該事件。 注意,因為協(xié)議解析器綁定到 socket 的方式,socket 不會觸發(fā) 'readable' 事件。 socket 也可以通過 request.connection 訪問

【upgrade事件】

request <http.IncomingMessage> HTTP 請求,同 'request' 事件。
socket <net.Socket> 服務(wù)器與客戶端之間的網(wǎng)絡(luò) socket。
head <Buffer> 流的第一個數(shù)據(jù)包,可能為空。

  每當客戶端發(fā)送HTTP upgrade請求時觸發(fā)。 如果該事件未被監(jiān)聽,則發(fā)送upgrade請求的客戶端會關(guān)閉連接

  當該事件被觸發(fā)后,請求的 socket 上沒有 'data' 事件監(jiān)聽器,這意味著需要綁定 'data' 事件監(jiān)聽器,用來處理 socket 上被發(fā)送到服務(wù)器的數(shù)據(jù)

【server.close([callback])】

  停止服務(wù)端接收新的連接

【server.listening】

<boolean>

  返回一個布爾值,表示服務(wù)器是否正在監(jiān)聽連接

【server.maxHeadersCount】

<number> 默認為 2000

  限制請求頭的最大數(shù)量,默認為 2000。 如果設(shè)為 0,則沒有限制

【server.setTimeout([msecs][, callback])】

msecs <number> 默認為 120000 (2<Function>
返回 server

  設(shè)置socket的超時時間。 如果發(fā)生超時,則觸發(fā)服務(wù)器對象的'timeout'事件,并傳入socket作為一個參數(shù)

  默認情況下,服務(wù)器的超時時間是 2 分鐘,且超時后的 socket 會被自動銷毀。 但是,如果你為服務(wù)器的 'timeout' 事件分配了一個回調(diào)函數(shù),則超時必須被顯式地處理

【server.timeout】

<number> 超時時間,以毫秒為單位。默認為 120000 (2 分鐘)

  socket 被認定為超時的空閑毫秒數(shù)。值設(shè)為 0 可禁用請求連接的超時行為

  [注意]socket 的超時邏輯是在連接上設(shè)定的,所以改變這個值只影響服務(wù)器新建的連接,而不會影響任何已存在的連接

 

response

  該對象在 HTTP 服務(wù)器內(nèi)部被創(chuàng)建。 它作為第二個參數(shù)被傳入 'request' 事件。這個類實現(xiàn)了(而不是繼承自)可寫流接口

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

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

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

seo優(yōu)化培訓,網(wǎng)絡(luò)推廣培訓,網(wǎng)絡(luò)營銷培訓,SEM培訓,網(wǎng)絡(luò)優(yōu)化,在線營銷培訓

【close事件】

  當?shù)讓舆B接在 response.end() 被調(diào)用或能夠刷新之前被終止時觸發(fā)

【finish事件】

  當響應(yīng)已被發(fā)送時觸發(fā)。 更具體地說,當響應(yīng)頭和響應(yīng)主體的最后一部分已被交給操作系統(tǒng)通過網(wǎng)絡(luò)進行傳輸時,觸發(fā)該事件。 這并不意味著客戶端已接收到任何東西。該事件觸發(fā)后,響應(yīng)對象上不再觸發(fā)其他事件

【response.addTrailers(headers)】

headers <Object>

  該方法會添加 HTTP 尾部響應(yīng)頭(一種在消息尾部的響應(yīng)頭)到響應(yīng)。

  僅當響應(yīng)使用分塊編碼時,尾部響應(yīng)頭才會被發(fā)送;否則(比如請求為 HTTP/1.0),尾部響應(yīng)頭會被丟棄。

  [注意]發(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();

 http://www.cnblogs.com/xiaohuochai/p/6943598.html