筆記-Node.js中的核心API之HTTP

最近正在學習Node,在圖書館借了基本關於Node的書,同時在網上查閱資料,很有收穫,可是總體感受對Node的理解仍是停留在一個很模棱兩可的狀態。好比Node中的模塊,平時練習就接觸到那麼幾個,其餘的一些模塊暫時只會在學習的時候接觸到,不經常使用便就荒廢了。正所謂好記心不如爛筆頭,多作筆記仍是更有利於理解和記憶。本身作的總結也方便回頭複習,因此決定踏上漫長的修煉之旅……html

Node提供了許多API,其中一些比較重要。這些核心的API是全部Node應用的支柱,你會不停的用到他們。node

HTTP服務器

Node.js的核心功能之一就是做爲web服務器,在Node的標準庫中提供了http模塊,其中封裝了一個高效的HTTP服務器和一個簡易的HTTP客戶端。就像以前說過的:Node.js 能夠做爲服務器提供服務,他跳過了相似 Apache,IIS 等 HTTP 服務器,內建了 HTTP 服務器支持,無需額外搭建一個 HTTP 服務器,即可以垂手可得地實現網站和服務器的組合。web

Node中的HTTP接口的被設計成能夠支持許多HTTP協議中本來用起來很困難的特性,特別是對於很大的或者塊編碼的消息.這些接口不會徹底緩存整個請求(request)或響應(response),這樣用戶能夠在請求(request)或響應(response)中使用數據流。若想使用Node中的HTTP服務或客戶端功能,需引用此模塊require('http')api

http://nodejs.org/api/http.html#http_http緩存

In order to support the full spectrum of possible HTTP applications, Node's HTTP API is very low-level. It deals with stream handling and message parsing only. It parses a message into headers and body but it does not parse the actual headers or the body.服務器

爲了能全面地支持可能的HTTP應用程序,Node提供的HTTP API都很底層。它只處理流處理和消息解析。它把一份消息解析成報文頭和報文體,可是它不解析實際的報文頭和報文體。網絡

http.Server

先用Node來建立一個簡單的HTTP服務器:app

var http=require("http");
http.createServer(function(request,response){
    response.writeHead(200,{
        "Content-Type":"text/html"
    });
    response.write("<h1>Hello, CrispElite</h1>");
    response.end("<p>Bye bye!</p>");
}).listen(3000);

console.log("你的服務器已經啓動!");

利用 http.createServer() 建立了一個 http.Server 的實例,將一個匿名函數用了處理請求。這個函數接收兩個參數:請求對象和響應對象。createServer() 返回的仍是 http.Server 的實例,方便鏈式調用。這個例子中,在 createServer() 以後直接調用了 http.Server 的 listen() 方法,監聽3000端口。函數

http.Server 是 http 模塊中的 HTTP 服務器對象。它繼承自 EventEmitter,有用一套屬於它本身的事件。最經常使用的當屬request:當客戶端請求到來的時候,request 事件被觸發,提供兩個參數 request 和 response 給回調函數,表示請求和響應的信息。createServer(callback) 方法是Node爲 request 提供的一個快捷方法,其功能是建立一個 HTTP 服務器並將 callback 做爲 reuqest 事件的監聽函數,就想上面的例子同樣。若是要顯示的使用 request 事件來實現,其實就是這麼回事:學習

var http=require("http"),
    server=new http.Server();

server.on("request", function(request,response){
    response.writeHead(200,{
        "Content-Type":"text/html"
    });
    response.write("<h1>Hello, CrispElite</h1>");
    response.end("<p>Bye bye!</p>");
});
server.listen(3000);

console.log("你的服務器已經啓動!");

http.ServerResponse

http.ServerResponse 是服務器返回給客戶端的信息。一個由HTTP服務器內部建立的對象(不是由用戶建立)。它將做爲第二個參數傳遞到前面所說的 'request' 事件的監聽器中。

http.ServerResponse 有不少方法,具體請戳這裏,其中有幾個比較重要的成員函數。

response.writeHead(statusCode, [header])

向請求的客戶端發送響應頭。這個函數在一個請求中最多隻能調用一次,若是不調用則會自動生成一個響應頭。注意,必須在調用 end()以前調用。

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

要注意的是,Content-Length 以字節爲單位而不是字符。上面的例子可以工做,是由於字符串 'hello world' 只包含單字節字符。若是報文主體內包含高位數的編碼字符,而後就要使用Buffer.byteLength()來肯定在給定編碼格式下的字節數。原文

response.write(data, [encoding])

向請求的客戶端發送響應內容。data 能夠是一個 Buffer 或者字符串,表示要發送的內容,若是是字符串則需指定 encoding,默認是 utf-8。在 response.end() 調用以前,能夠屢次調用 write()。第一次調用 write() 時,它將發送緩衝的報頭信息和第一個報文主體到客戶端。當 write() 第二次被調用時,Node會假設你將要使用流數據,而後自動將響應內容分開發送。也就是說,響應被緩存到報文主體的第一塊中。原文

Returns true if the entire data was flushed successfully to the kernel buffer. Returns false if all or part of the data was queued in user memory. 'drain' will be emitted when the buffer is again free.

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

用於結束響應,通知客戶端全部的發送已經完成。接收兩個可選參數,意義和 write() 方法相同。這個函數在一個請求中必須被調用一次,若是不調用客戶端將永遠處於等待狀態。

http.ServerResponse 也繼承了 EventEmitter ,在官方的API文檔中,目前(2015/05/13)只提供了兩個事件:close和finish。

Event:'close'

代表在 ServerResponse 的 end 方法被調用或者刷新以前,相關的鏈接已經被終止。

Event:'finish'

當響應信息已經成功發送以後觸發 finish 事件。更具體一點來講,當響應的報文頭和報文體的最後一個分段被移交到操做系統用於網絡傳輸時被觸發。原文

HTTP客戶端

http模塊提供了兩個函數 http.requesthttp.get,其做用是做爲客戶端向HTTP服務器發起請求。

http.request(options, callback)

發起HTTP請求,接受兩個參數。options能夠是一個對象或一個字符串。若是options是一個字符串, 它將自動使用url.parse()解析;callback是請求的回調函數。
options的經常使用參數以下:

  • host:請求發送到的服務器的域名或IP地址。默認爲'localhost'。
  • hostname:用於支持url.parse()。hostname比host更好一些
  • port:遠程服務器的端口。默認值爲80。
  • method:指定HTTP請求方法的字符串。默認爲'GET'。
  • path:請求路徑。默認爲'/'。若是有查詢字符串,則須要包含。例如'/index.html?page=12'。
  • headers:包含請求頭的對象。

使用 http.request() 時,必須調用 response.end(),以此來向服務器代表請求結束,即便請求的主體中沒有任何數據。

http.get(options, callback)

由於大部分請求都是沒有主體的GET請求,因此 Node 提供了這個方便的方法。它與 http.request() 惟一的區別就是自動將請求設爲GET請求,同時自動調用 response.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.ClientRequest

http.ClientRequest 是 Node 內建的一個對象,調用 http.request() 和 http.get() 返回的就是這個對象。它表示一個已經產生而且正在進行的 HTTP 請求。它提供了一個 response 事件,當響應頭被接收的時候,會在請求的對象上觸發。http.request() 和 http.get() 第二個參數指定的回調函數的綁定對象就是它了。http.ClientRequest 和 http.ServerResponse 同樣提供了 write() 和 end() 用於向服務器發送請求體。全部的寫結束後必須調用 end() 通知服務器。更多詳細信息請戳這裏

關於 Node 中的 HTTP 模塊確定不止上面說到的這些,上面所講到的只是一些經常使用的內容,一般用來處理簡單的內容。若是想構建複雜的,全面的 Web 服務器,遠遠不夠。當須要的時候多翻翻手冊,熟能生巧~

相關文章
相關標籤/搜索