NodeJS學習筆記——HTTP模塊

作為構建web服務器的核心模塊,HTTP模塊封裝了很多底層的操作,讓我們很方便的構建一個http服務器;
下面看一個例子:

var http = require('http');

http
    .createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write('Hello world');
        res.end();
    })
    .listen(2017);

http構建一個服務器,添加回調函數,參數包含request和response,并監聽2017端口;
http可以作為服務端客戶端來使用;

作為服務端

http.createServer([requestListener])、http.Server類

返回一個新建的http.Server實例,其requestListener函數會被自動添加到request事件;
http.Server實例的request事件表示,每接收到一個請求時觸發;回調函數有兩個參數,分別是request和response,分別是http.IncomingMessagehttp.ServerResponse的實例;

http.IncomingMessage

對象由 http.Server
http.ClientRequest
創建,并作為第一個參數分別遞給 'request'
'response'
事件。 它可以用來訪問響應狀態、消息頭、以及數據。
它實現了 可讀流 接口,還有以下額外的事件、方法、以及屬性。

基本的一些屬性有

  • message.headers請求頭或響應頭的對象
  • message.method請求的方法
  • message.url請求的url字符串

http.ServerResponse

該對象在 HTTP 服務器內部被創建。 它作為第二個參數被傳入 'request'
事件。
這個類實現了(而不是繼承自)可寫流 接口。 它是一個有以下事件的 EventEmitter
:...

基本方法有:

  • response.writeHead()
  • response.write()
  • response.end([data][, encoding][, callback])
response.write(statusCode[, statusMessage][, headers])

發送一個響應頭給請求。 狀態碼是一個三位數的 HTTP 狀態碼,如 404。 最后一個參數 headers 是響應頭。 第二個參數 statusMessage 是可選的狀態描述。
例子:

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

該方法在消息中只能被調用一次,且必須在 response.end()
被調用之前調用。
如果在調用該方法之前調用 response.write()
response.end()
,則隱式的響應頭會被處理并調用該函數。

response.setHeader()
設置的響應頭會與 response.writeHead()
設置的響應頭合并,且 response.writeHead()
的優先。

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

如果該方法被調用且 response.writeHead()
沒有被調用,則它會切換到隱式響應頭模式并刷新隱式響應頭。
該方法會發送一塊響應主體。 它可被多次調用,以便提供連續的響應主體片段。
Note that in the httpmodule, the response body is omitted when the request is a HEAD request. Similarly, the 204and 304responses must not include a message body.
chunk可以是一個字符串或一個 buffer。 如果 chunk是一個字符串,則第二個參數指定如何將它編碼成一個字節流。 encoding默認為 'utf8'。當數據塊被刷新時,callback會被調用。
注意:這是原始的 HTTP 主體,且與可能被使用的高級主體編碼無關。
response.write()
首次被調用時,會發送緩沖的響應頭信息和響應主體的第一塊數據到客戶端。 response.write()
第二次被調用時,Node.js 會以流的形式處理數據,并將它們分別發送。 也就是說,響應會被緩沖到響應主體的第一個數據塊。
如果全部數據被成功刷新到內核緩沖區,則返回 true。 如果全部或部分數據還在內存中排隊,則返回 false。 當緩沖區再次空閑時,則觸發 'drain'事件。

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

該方法會通知服務器,所有響應頭和響應主體都已被發送,即服務器將其視為已完成。 每次響應都必須調用 response.end()方法。如果指定了 data,則相當于調用 response.write(data, encoding)
之后再調用 response.end(callback)。如果指定了 callback,則當響應流結束時被調用。

作為客戶端

http.ClientRequest 類

該對象在 http.request()
內部被創建并返回。 它表示著一個正在處理的請求,其請求頭已進入隊列。
要獲取響應,需為 'response'
事件添加一個監聽器到請求對象上。 當響應頭被接收到時,'response'
事件會從請求對象上被觸發 。 'response'
事件被執行時帶有一個參數,該參數是一個 http.IncomingMessage
實例。
'response'
事件期間,可以添加監聽器到響應對象上,比如監聽 'data'事件。
如果沒有添加 response事件處理函數,則響應會被整個丟棄。 如果添加了 response事件處理函數,則必須消耗完響應對象的數據,可通過調用 response.read()、或添加一個 'data'事件處理函數、或調用 .resume() 方法。 數據被消耗完時會觸發 'end'事件。 在數據被讀取完之前會消耗內存,可能會造成 'process out of memory'錯誤。
下面來看一個小爬蟲的實例:

var http = require('http');

var url = 'http://www.imooc.com';

http.get(url,function(res) {
    var html = '';

    res.on('data',function(data) {
        html += data;
    });

    res.on('end',function () {
        console.log(html);//輸出慕課網的html代碼
    })
}).on('error',function() {
    console.log('獲取錯誤');
});

注:作為客戶端的res和服務端的res參數不同,實際上,這里的res和服務端的req是同一個類型的實例,即:http.IncomingRequest

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容