国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Node.js HTTP

2022-02-26 10:30 更新
穩(wěn)定性: 3 - 穩(wěn)定

如果要在Node.js中使用HTTP服務器或客戶端功能,則必須調用require('http')。

Node里的HTTP接口支持協(xié)議里原本比較難用的特性。特別是很大的或塊編碼的消息。這些接口不會完全緩存整個請求或響應,這樣用戶可以在請求或響應中使用數(shù)據(jù)流。

HTTP消息頭對象和下面的例子類似:

{ 'content-length': '123',
  'content-type': 'text/plain',
  'connection': 'keep-alive',
  'host': 'mysite.com',
  'accept': '*/*' }

Keys都是小寫,值不能修改。

為了能支持盡可能多的HTTP應用程序,Node提供的HTTP API接口都是底層的。僅能處理流和消息。它把消息解析成報文頭和報文體,但是不解析實際的報文頭和報文體內容。

定義報文頭的時候,多個值間可用,分隔。除了set-cookiecookie頭,因為它們表示值的數(shù)組。諸如content-length的只有一個值的報文頭,直接解析,并且只有單值可以表示成已經解析好的對象。

接收到的原始頭信息以數(shù)組([key, value, key2, value2, ...])的形式保存在rawHeaders里。例如,之前提到的消息對象會有如下的rawHeaders

[ 'ConTent-Length', '123456',
  'content-LENGTH', '123',
  'content-type', 'text/plain',
  'CONNECTION', 'keep-alive',
  'Host', 'mysite.com',
  'accepT', '*/*' ]

http.METHODS

  • {Array}

解析器支持的HTTP方法列表。

http.STATUS_CODES

  • {Object}

全部標準HTTP響應狀態(tài)碼的和描述的集合。例如,http.STATUS_CODES[404] === 'Not Found'。

http.createServer([requestListener])

返回http.Server的新實例。

requestListener函數(shù)自動加到'request'事件里。

http.createClient([port][, host])

這個函數(shù)已經被拋棄,用http.request()替換。創(chuàng)建一個新的HTTP客戶端,連接到服務器的porthost

類: http.Server

這是事件分發(fā)器EventEmitter,有以下事件:

事件: 'request'

function (request, response) { }

每當有請求的時候觸發(fā)。注意:每個連接可以有多個請求(在keep-alive連接中)。requesthttp.IncomingMessage實例,responsehttp.ServerResponse 的實例。

事件: 'connection'

function (socket) { }

當建立新的TCP流的時候。socket是一個net.Socket對象。通常用戶不會訪問這個事件。協(xié)議解析器綁定套接字時采用的方式使套接字不會出發(fā)readable事件。也能通過request.connection訪問socket。

事件: 'close'

function () { }

服務器關閉的時候觸發(fā)。

事件: 'checkContinue'

function (request, response) { }

當http收到100-continue的http請求時會觸發(fā)。如果沒有監(jiān)聽這個事件,服務器將會自動發(fā)送100 Continue的響應。

如果客戶端需要繼續(xù)發(fā)送請求主題,或者生成合適的HTTP響應(如,400請求無效),可以通過調用response.writeContinue()來處理。

注意:觸發(fā)并處理這個事件的時候,不會再觸發(fā)request事件。

事件: 'connect'

function (request, socket, head) { }

當客戶端請求http連接時觸發(fā)。如果沒有監(jiān)聽這個事件,客戶端請求連接的時候會被關閉。

  • request是http請求的參數(shù),與request事件參數(shù)相同。
  • socket是服務器和客戶端間的socket。
  • head是buffer的實例。網絡隧道的第一個包,可能為空。

這個事件觸發(fā)后,請求的socket不會有data事件監(jiān)聽器,也就是說你需要綁定一個監(jiān)聽器到data上,來處理在發(fā)送到服務器上的socket數(shù)據(jù)。

事件: 'upgrade'

function (request, socket, head) { }

當客戶端請求http upgrage時候會觸發(fā)。如果沒有監(jiān)聽這個事件,客戶端請求一個連接的時候會被關閉。

  • request是http請求的參數(shù),與request事件參數(shù)相同。
  • socket是服務器和客戶端間的socket。
  • head是buffer的實例。網絡隧道的第一個包,可能為空。

這個事件觸發(fā)后,請求的socket不會有data事件監(jiān)聽器,也就是說你需要綁定一個監(jiān)聽器到data上,來處理在發(fā)送到服務器上的socket數(shù)據(jù)。

事件: 'clientError'

function (exception, socket) { }

如果一個客戶端連接觸發(fā)了一個'error'事件,它就會轉發(fā)到這里.

socket是導致錯誤的net.Socket對象。

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

在指定的的端口和主機名上開始接收連接。如果忽略主機名,服務器將會接收指向任意的IPv4地址(INADDR_ANY)。

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

積壓量backlog為等待連接隊列的最大長度。實際的長度由你的操作系統(tǒng)的sysctl設置決定(比如linux上的tcp_max_syn_backlogsomaxconn)。默認參數(shù)值為 511 (不是512)

這是異步函數(shù)。最后一個參數(shù)callback會作為事件監(jiān)聽器添加到listening事件。參見net.Server.listen(port)。

server.listen(path[, callback])

啟動一個UNIX socket服務器所給路徑path

這是異步函數(shù)。最后一個參數(shù)callback會作為事件監(jiān)聽器添加到listening事件。參見net.Server.listen(port)

server.listen(handle[, callback])

  • handle {Object}
  • callback {Function}

    handle 對象可以是server或socket(任意以下劃線_handle開頭的成員),或者{fd: <n>}對象。

這會導致server用參數(shù)handle接收連接,前提條件是文件描述符或句柄已經連接到端口或域socket。

Windows不能監(jiān)聽文件句柄。

這是異步函數(shù)。最后一個參數(shù)callback會作為事件監(jiān)聽器添加到listening事件。參見net.Server.listen(port)

server.close([callback])

用于禁止server接收連接。參見net.Server.close().

server.maxHeadersCount

最大請求頭的數(shù)量限制,默認為1000。如果設置為0,則不做任何限制。

server.setTimeout(msecs, callback)

  • msecs{Number}
  • callback{Function}

為socket設置超時時間,單位為毫秒,如果發(fā)生超時,在server對象上觸發(fā)'timeout'事件,參數(shù)為socket。

如果在Server對象上有一個'timeout'事件監(jiān)聽器,超時的時候,將會調用它,參數(shù)為socket。

默認情況下,Server的超時為2分鐘,如果超時將會銷毀socket。如果你給Server的超時事件設置了回調函數(shù),那你就得負責處理socket超時。

server.timeout

  • {Number} Default = 120000 (2 minutes)

超時的時長,單位為毫秒。

注意,socket的超時邏輯在連接時設定,所以有新的連接時才能改變這個值。

設為0時,建立連接的自動超時將失效。

類: http.ServerResponse

這是一個由HTTP服務器(而不是用戶)內部創(chuàng)建的對象。作為第二個參數(shù)傳遞給'request'事件。

該響應實現(xiàn)了Writable Stream接口。這是一個包含下列事件的EventEmitter

事件: 'close'

function () { }

在調用response.end(),或準備flush前,底層連接結束。

事件: 'finish'

function () { }

發(fā)送完響應觸發(fā)。響應頭和響應體最后一段數(shù)據(jù)被剝離給操作系統(tǒng)后,通過網絡來傳輸時被觸發(fā)。這并不代表客戶端已經收到數(shù)據(jù)。

這個事件之后,響應對象不會再觸發(fā)任何事件。

response.writeContinue()

發(fā)送HTTP/1.1 100 Continue消息給客戶端,表示請求體可以發(fā)送??梢栽诜掌魃喜榭?a href="#http_event_checkcontinue">'checkContinue'事件。

response.writeHead(statusCode[, statusMessage][, headers])

發(fā)送一個響應頭給請求。狀態(tài)碼是3位數(shù)字,如404。最后一個參數(shù)headers是響應頭。建議第二個參數(shù)設置為可以看的懂的消息。

例如:

var body = 'hello world';
response.writeHead(200, {
  'Content-Length': body.length,
  'Content-Type': 'text/plain' });

這個方法僅能在消息中調用一次,而且必須在response.end()前調用。

如果你在這之前調用response.write()response.end(),將會計算出不穩(wěn)定的頭。

Content-Length是字節(jié)數(shù),而不是字符數(shù)。上面的例子'hello world'僅包含一個字節(jié)字符。如果body包含高級編碼的字符,則Buffer.byteLength()就必須確定指定編碼的字符數(shù)。Node不會檢查Content-Length和body的長度是否相同。

response.setTimeout(msecs, callback)

  • msecs {Number}
  • callback {Function}

設置socket超時時間,單位為毫秒。如果提供了回調函數(shù),將會在response對象的'timeout'事件上添加監(jiān)聽器。

如果沒有給請求、響應、服務器添加'timeout'監(jiān)視器,超時的時候將會銷毀socket。如果你給請求、響應、服務器加了處理函數(shù),就需要負責處理socket超時。

response.statusCode

使用默認的headers 時(沒有顯式的調用response.writeHead()),這個屬性表示將要發(fā)送給客戶端狀態(tài)碼。

例如:

response.statusCode = 404;

響應頭發(fā)送給客戶端的后,這個屬性表示狀態(tài)碼已經發(fā)送。

response.statusMessage

使用默認headers時(沒有顯式的調用response.writeHead()),這個屬性表示將要發(fā)送給客戶端狀態(tài)信息。如果這個沒有定義,將會使用狀態(tài)碼的標準消息。

例如:

response.statusMessage = 'Not found';

當響應頭發(fā)送給客戶端的時候,這個屬性表示狀態(tài)消息已經發(fā)送。

response.setHeader(name, value)

設置默認頭某個字段內容。如果這個頭即將被發(fā)送,內容會被替換。如果你想設置更多的頭, 就使用一個相同名字的字符串數(shù)組。

例如:

response.setHeader("Content-Type", "text/html");

response.setHeader("Set-Cookie", ["type=ninja", "language=javascript"]);

response.headersSent

Boolean(只讀)。如果headers發(fā)送完畢,則為true,反之為false。

response.sendDate

默認值為true。若為true,當headers里沒有Date值時,自動生成Date并發(fā)送。

只有在測試環(huán)境才能禁用,因為HTTP要求響應包含Date頭.

response.getHeader(name)

讀取一個在隊列中但是還沒有被發(fā)送至客戶端的header。名字是大小寫敏感的。僅能再頭被flushed前調用。

例如:

var contentType = response.getHeader('content-type');

response.removeHeader(name)

從即將發(fā)送的隊列里移除頭。

例如:

response.removeHeader("Content-Encoding");

response.write(chunk[, encoding][, callback])

如果調用了這個方法,且還沒有調用response.writeHead(),將會切換到默認的header,并更新這個header。

這個方法將發(fā)送響應體數(shù)據(jù)塊??赡軙啻握{用這個方法,以提供body成功的部分內容。

chunk可以是字符串或 buffer。如果chunk 是字符串,第二個參數(shù)表明如何將它編碼成字節(jié)流。encoding的默認值是'utf8'。最后一個參數(shù)在刷新這個數(shù)據(jù)塊時調用。

注意:這個是原始的HTTP body,和高級的multi-part body編碼無關。

第一次調用response.write()的時候,將會發(fā)送緩存的頭信息和第一個body給客戶端。第二次,將會調用response.write()。Node認為你將會獨立發(fā)送流數(shù)據(jù)。這意味著,響應緩存在第一個數(shù)據(jù)塊中。

如果成功的刷新全部數(shù)據(jù)到內核緩沖區(qū),返回true 。如果部分或全部數(shù)據(jù)在用戶內存中還處于排隊狀況,返回false。當緩存再次釋放的時候,將會觸發(fā) 'drain'

response.addTrailers(headers)

這個方法給響應添加HTTP的尾部header(消息末尾的header)。

只有數(shù)據(jù)塊編碼用于響應體時,才會觸發(fā)Trailers;如果不是(例如,請求是HTTP/1.0),它們將會被自動丟棄。

如果你想觸發(fā)trailers, HTTP會要求發(fā)送Trailer頭,它包含一些信息,比如:

response.writeHead(200, { 'Content-Type': 'text/plain',
                          'Trailer': 'Content-MD5' });
response.write(fileData);
response.addTrailers({'Content-MD5': "7895bf4b8828b55ceaf47747b4bca667"});
response.end();

response.end([data][, encoding][, callback])

這個方法告訴服務器,所有的響應頭和響應體已經發(fā)送;服務器可以認為消息結束。response.end()方法必須在每個響應中調用。

如果指定了參數(shù)data,將會在響應流結束的時候調用。

http.request(options[, callback])

Node維護每個服務器的連接來生成HTTP請求。這個函數(shù)讓你可以發(fā)布請求。

參數(shù)options是對象或字符串。如果options是字符串,會通過url.parse()自動解析。

options值:

  • host: 請求的服務器域名或 IP 地址,默認:'localhost'
  • hostname: 用于支持url.parse()。hostname優(yōu)于host
  • port: 遠程服務器端口。 默認為:80.
  • localAddress: 用于綁定網絡連接的本地接口
  • socketPath: Unix域socket(使用host:port或socketPath)
  • method: 指定 HTTP 請求方法。 默認: 'GET'.
  • path: 請求路徑。 默認為:'/'。如果有查詢字符串,則需要包含。例如,'/index.html?page=12'。請求路徑包含非法字符時拋出異常。目前,只有空格不行,不過在未來可能改變。
  • headers: 包含請求頭的對象
  • auth: 用于計算認證頭的基本認證,即user:password
  • agent: 控制Agent的行為。當使用了一個Agent的時候,請求將默認為Connection: keep-alive??赡艿闹禐椋?ul>
  • undefined (default): 在這個主機和端口上使用global Agent
  • Agent object: 在Agent中顯式使用passed .
  • false: 選擇性停用連接池,默認請求為:Connection: close.
  • keepAlive: {Boolean} 持資源池周圍的socket,用于未來其它請求。默認值為false。
  • keepAliveMsecs: {Integer} 使用HTTP KeepAlive的時候,通過正在保持活動的sockets發(fā)送TCP KeepAlive包的頻繁程度。默認值為1000。僅當keepAlive為true時才相關。

可選參數(shù)callback將會作為一次性的監(jiān)視器,添加給 'response' 事件。

http.request()返回一個http.ClientRequest類的實例。ClientRequest實例是一個可寫流對象。如果需要用POST請求上傳一個文件的話,就將其寫入到ClientRequest對象。

例如:

var postData = querystring.stringify({
  'msg' : 'Hello World!'
});

var options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': postData.length
  }
};

var req = http.request(options, function(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('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
req.write(postData);
req.end();

注意,例子里調用了req.end()。http.request()必須調用req.end()來表明請求已經完成,即使沒有數(shù)據(jù)寫入到請求body里。

如果在請求的時候遇到錯誤(DNS解析、TCP級別的錯誤或實際HTTP解析錯誤),在返回的請求對象時會觸發(fā)一個'error'事件。

有一些特殊的頭需要注意:

  • 發(fā)送Connection: keep-alive告訴服務器保持連接,直到下一個請求到來。

  • 發(fā)送Content-length頭將會禁用chunked編碼。

  • 發(fā)送一個Expect頭,會立即發(fā)送請求頭,一般來說,發(fā)送Expect: 100-continue,你必須設置超時,并監(jiān)聽continue事件。更多細節(jié)參見RFC2616 Section 8.2.3。

  • 發(fā)送一個授權頭,將會使用auth參數(shù)重寫,來計算基本的授權。

http.get(options[, callback])

因為多數(shù)請求是沒有報文體的GET請求,Node提供了這個簡便的方法。和http.request()唯一不同點在于,這個方法自動設置GET,并自動調用req.end()

例如:

http.get("http://www.google.com/index.html", function(res) {
  console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

類: http.Agent

HTTP Agent用于socket池,用于HTTP客戶端請求。

HTTP Agent也把客戶端請求默認為使用Connection:keep-alive 。如果沒有HTTP請求正在等著成為空閑socket的話,那么socket將關閉。這意味著,Node的資源池在負載的情況下對keep-alive有利,但是仍然不需要開發(fā)人員使用KeepAlive來手動關閉HTTP客戶端。

如果你選擇使用HTTP KeepAlive, 可以創(chuàng)建一個Agent對象,將 flag 設置為true. (參見下面的constructor options ) ,這樣Agent會把沒用到的socket放到池里,以便將來使用。他們會被顯式的標志,讓Node不運行。但是,當不再使用它的時候,需要顯式的調用destroy(),這樣socket將會被關閉。

當socket事件觸發(fā)close事件或特殊的agentRemove事件時,socket將會從agent池里移除。如果你要保持HTTP請求保持長時間打開,并且不希望他們在池里,可以參考以下代碼:

http.get(options, function(res) {
  // Do stuff
}).on("socket", function (socket) {
  socket.emit("agentRemove");
});

另外,你可以使用agent:false讓資源池停用:

http.get({
  hostname: 'localhost',
  port: 80,
  path: '/',
  agent: false  // create a new agent just for this one request
}, function (res) {
  // Do stuff with response
})

new Agent([options])

  • options {Object} agent上的設置選項集合,有以下字段內容:
    • keepAlive {Boolean} 持資源池周圍的socket,用于未來其它請求。默認值為false。
    • keepAliveMsecs {Integer} 使用HTTP KeepAlive的時候,通過正在保持活動的sockets發(fā)送TCP KeepAlive包的頻繁程度。默認值為1000。僅當 keepAlive為true時才相關。
    • maxSockets {Number}在空閑狀態(tài)下,還依然開啟的socket的最大值。僅當keepAlive設置為true的時候有效。默認值為256。

http.request使用的默認的http.globalAgent,會設置全部的值為默認。

必須在創(chuàng)建你自己的Agent對象后,才能配置這些值。

var http = require('http');
var keepAliveAgent = new http.Agent({ keepAlive: true });
options.agent = keepAliveAgent;
http.request(options, onResponseCallback);

agent.maxSockets

默認值為Infinity。決定了每臺主機上的agent可以擁有的并發(fā)socket的打開數(shù)量,主機可以是host:porthost:port:localAddress。

agent.maxFreeSockets

默認值256.對于支持HTTP KeepAlive的Agent而言,這個方法設置了空閑狀態(tài)下仍然打開的套接字數(shù)的最大值。

agent.sockets

這個對象包含了當前Agent使用中的socket數(shù)組。不要修改它。

agent.freeSockets

使用HTTP KeepAlive的時候,這個對象包含等待當前Agent使用的socket數(shù)組。不要修改它。

agent.requests

這個對象包含了還沒分配給socket的請求數(shù)組。不要修改它。

agent.destroy()

銷毀任意一個被agent使用的socket。

通常情況下不要這么做。如果你正在使用一個允許KeepAlive的agent,當你知道不在使用它的時候,最好關閉agent。否則,socket會一直保存打開狀態(tài),直到服務器關閉。

agent.getName(options)

獲取一組請求選項的唯一名,來確定某個連接是否可重用。在http agent里,它會返回host:port:localAddress。在http agent里, name包括CA,cert, ciphers, 和其他HTTPS/TLS特殊選項來決定socket是否可以重用。

http.globalAgent

Agent的全局實例,是http客戶端的默認請求。

類:http.ClientRequest

該對象在內部創(chuàng)建并從http.request()返回。他是正在處理的請求,其頭部已經在隊列中。使用setHeader(name, value),getHeader(name), removeHeader(name)API可以改變header。當關閉連接的時候,header將會和第一個數(shù)據(jù)塊一起發(fā)送。

為了獲取響應,可以給請求對象的'response'添加監(jiān)聽器。當接收到響應頭的時候將會從請求對象里觸發(fā)'response'。'response'事件執(zhí)行時有一個參數(shù),該參數(shù)為http.IncomingMessage的實例。

'response'事件期間,可以給響應對象添加監(jiān)視器,監(jiān)聽'data'事件。

如果沒有添加'response'處理函數(shù),響應將被完全忽略。如果你添加了'response'事件處理函數(shù),那你必須消費掉從響應對象獲取的數(shù)據(jù),可以在 'readable'事件里調用response.read(),或者添加一個'data'處理函數(shù),或者調用.resume()方法。如果未讀取數(shù)據(jù),它將會消耗內存,最終產生 process out of memory錯誤。

Node不會檢查Content-Length和body的長度是否相同。

該請求實現(xiàn)了Writable Stream接口。這是一個包含下列事件的EventEmitter。

事件: 'response'

function (response) { }

當接收到請求的時候會觸發(fā),僅會觸發(fā)一次。response的參數(shù)是http.IncomingMessage的實例。

Options:

  • host: 要請求的服務器域名或IP地址
  • port: 遠程服務器的端口
  • socketPath: Unix域Socket (使用host:port或socketPath之一)

事件: 'socket'

function (socket) { }

Socket附加到這個請求的時候觸發(fā)。

事件: 'connect'

function (response, socket, head) { }

每次服務器使用CONNECT方法響應一個請求時觸發(fā)。如果這個這個事件未被監(jiān)聽,接收CONNECT方法的客戶端將關閉他們的連接。

下面的例子展示了一對匹配的客戶端/服務器如何監(jiān)聽connect事件。var http = require('http');var net = require('net');var url = require('url');

// Create an HTTP tunneling proxy
var proxy = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('okay');
});
proxy.on('connect', function(req, cltSocket, head) {
  // connect to an origin server
  var srvUrl = url.parse('http://' + req.url);
  var srvSocket = net.connect(srvUrl.port, srvUrl.hostname, function() {
    cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node-Proxy\r\n' +
                    '\r\n');
    srvSocket.write(head);
    srvSocket.pipe(cltSocket);
    cltSocket.pipe(srvSocket);
  });
});

// now that proxy is running
proxy.listen(1337, '127.0.0.1', function() {

  // make a request to a tunneling proxy
  var options = {
    port: 1337,
    hostname: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  var req = http.request(options);
  req.end();

  req.on('connect', function(res, socket, head) {
    console.log('got connected!');

    // make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', function(chunk) {
      console.log(chunk.toString());
    });
    socket.on('end', function() {
      proxy.close();
    });
  });
});

事件: 'upgrade'

function (response, socket, head) { }

每當服務器響應upgrade請求時觸發(fā)。如果沒有監(jiān)聽這個事件,客戶端會收到upgrade頭后關閉連接。

下面的例子展示了一對匹配的客戶端/服務器如何監(jiān)聽upgrade事件。

var http = require('http');

// Create an HTTP server
var srv = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('okay');
});
srv.on('upgrade', function(req, socket, head) {
  socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
               'Upgrade: WebSocket\r\n' +
               'Connection: Upgrade\r\n' +
               '\r\n');

  socket.pipe(socket); // echo back
});

// now that server is running
srv.listen(1337, '127.0.0.1', function() {

  // make a request
  var options = {
    port: 1337,
    hostname: '127.0.0.1',
    headers: {
      'Connection': 'Upgrade',
      'Upgrade': 'websocket'
    }
  };

  var req = http.request(options);
  req.end();

  req.on('upgrade', function(res, socket, upgradeHead) {
    console.log('got upgraded!');
    socket.end();
    process.exit(0);
  });
});

事件: 'continue'

function () { }

當服務器發(fā)送'100 Continue' HTTP響應的時候觸發(fā),通常因為請求包含'Expect: 100-continue'。該指令表示客戶端應發(fā)送請求體。

request.flushHeaders()

刷新請求的頭。

考慮效率因素,Node.js通常會緩存請求的頭直到你調用request.end(),或寫入請求的第一個數(shù)據(jù)塊。然后,包裝請求的頭和數(shù)據(jù)到一個獨立的TCP包里。

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

發(fā)送一個請求體的數(shù)據(jù)塊。通過多次調用這個函數(shù),用戶能流式的發(fā)送請求給服務器,這種情況下,建議使用['Transfer-Encoding', 'chunked']頭。

chunk參數(shù)必須是Buffer或字符串。

回調參數(shù)可選,當這個數(shù)據(jù)塊被刷新的時候會被調用。

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

發(fā)送請求完畢。如果body的數(shù)據(jù)沒被發(fā)送,將會將他們刷新到流里。如果請求是分塊的,該方法會發(fā)送終結符0\r\n\r\n 。

如果指定了data,等同于先調用request.write(data, encoding),再調用request.end(callback)。

如果有callback,將會在請求流結束的時候調用。

request.abort()

終止一個請求. (v0.3.8開始新加入)。

request.setTimeout(timeout[, callback])

如果socket被分配給這個請求,并完成連接,將會調用socket.setTimeout() 。

request.setNoDelay([noDelay])

如果socket被分配給這個請求,并完成連接,將會調用socket.setNoDelay()。

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

如果socket被分配給這個請求,并完成連接,將會調用socket.setKeepAlive()。

http.IncomingMessage

http.Serverhttp.ClientRequest創(chuàng)建了IncomingMessage對象,作為第一個參數(shù)傳遞給'response'。它可以用來訪問應答的狀態(tài),頭文件和數(shù)據(jù)。

它實現(xiàn)了Readable Stream接口,以及以下額外的事件,方法和屬性。

事件: 'close'

function () { }

表示底層連接已經關閉。和'end'類似,這個事件每個應答只會發(fā)送一次。

message.httpVersion

客戶端向服務器發(fā)送請求時,客戶端發(fā)送的 HTTP 版本;或者服務器想客戶端返回應答時,服務器的HTTP版本。通常是'1.1''1.0'。

另外,response.httpVersionMajor是第一個整數(shù),response.httpVersionMinor是第二個整數(shù)。

message.headers

請求/響應頭對象。

只讀的頭名稱和值的映射。頭的名字是小寫,比如:

// Prints something like:
//
// { 'user-agent': 'curl/7.22.0',
//   host: '127.0.0.1:8000',
//   accept: '*/*' }
console.log(request.headers);

message.rawHeaders

接收到的請求/響應頭字段列表。

注意,鍵和值在同一個列表中。它并非一個元組列表。所以,偶數(shù)偏移量為鍵,奇數(shù)偏移量為對應的值。

頭名字不是小寫敏感,也沒用合并重復的頭。

// Prints something like:
//
// [ '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.trailers

請求/響應的尾部對象。只在'end'事件中存在。

message.rawTrailers

接收到的原始的請求/響應尾部鍵和值。僅在'end'事件中存在。

message.setTimeout(msecs, callback)

  • msecs {Number}
  • callback {Function}

調用message.connection.setTimeout(msecs, callback).

message.method

僅對從http.Server獲得的請求有效。

請求方法如果一個只讀的字符串。例如:'GET','DELETE'.

message.url

僅對從http.Server獲得的請求有效。

請求的URL字符串。它僅包含實際的HTTP請求中所提供的URL,比如請求如下:

GET /status?name=ryan HTTP/1.1\r\n
Accept: text/plain\r\n
\r\n

request.url 就是:

'/status?name=ryan'

如果你想將URL分解,可以用require('url').parse(request.url),例如:

node> require('url').parse('/status?name=ryan')
{ href: '/status?name=ryan',
  search: '?name=ryan',
  query: 'name=ryan',
  pathname: '/status' }

如果想從查詢字符串中解析出參數(shù),可以用require('querystring').parse函數(shù),或者將true作為第二個參數(shù)傳遞給require('url').parse。 例如:

node> require('url').parse('/status?name=ryan', true)
{ href: '/status?name=ryan',
  search: '?name=ryan',
  query: { name: 'ryan' },
  pathname: '/status' }

message.statusCode

僅對從http.ClientRequest獲取的響應有效。

3位數(shù)的HTTP響應狀態(tài)碼404

message.statusMessage

僅對從http.ClientRequest獲取的響應有效。

HTTP的響應消息。比如,OKInternal Server Error.

message.socket

和連接相關聯(lián)的net.Socket對象。

通過HTTPS支持,使用request.connection.verifyPeer()request.connection.getPeerCertificate()獲取客戶端的身份信息。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號