標籤:c class code http ext a
最近正在學習Node,在圖書館借了基本關於Node的書,同時在網上查閱資料,頗有收穫,但是整體感覺對Node的理解還是停留在一個很模稜兩可的狀態。比如Node中的模組,平時練習就接觸到那麼幾個,其他的一些模組暫時只會在學習的時候接觸到,不常用便就荒廢了。正所謂好記心不如爛筆頭,多做筆記還是更有利於理解和記憶。自己做的總結也方便回頭複習,所以決定踏上漫長的修鍊之旅……
Node提供了許多API,其中一些比較重要。這些核心的API是所有Node應用的支柱,你會不停的用到他們。
HTTP伺服器
Node.js的核心功能之一就是作為web伺服器,在Node的標準庫中提供了http模組,其中封裝了一個高效的HTTP伺服器和一個簡易的HTTP用戶端。就像之前說過的:Node.js 可以作為伺服器提供服務,他跳過了類似 Apache,IIS 等 HTTP 伺服器,內建了 HTTP 伺服器支援,無需額外搭建一個 HTTP 伺服器,便可以輕而易舉地實現網站和伺服器的組合。
Node中的HTTP介面的被設計成可以支援許多HTTP協議中原本用起來很困難的特性,特別是對於很大的或者塊編碼的訊息.這些介面不會完全緩衝整個請求(request)或響應(response),這樣使用者可以在請求(request)或響應(response)中使用資料流。若想使用Node中的HTTP服務或用戶端功能,需引用此模組require(‘http‘)。
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伺服器:
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.request,http.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 服務器,遠遠不夠。當需要的時候多翻翻手冊,熟能生巧~