天天學點node系列-http

任何可使用JavaScript來編寫的應用,最終會由JavaScript編寫。--Atwood's Lawnode

http模塊概覽

http模塊主要用於建立http server服務,而且web

  • 支持更多特性
  • 不緩衝請求和響應
  • 可以流式傳輸數據

藉助http模塊,能夠幾行代碼就搞定一個超迷你的web server:服務器

var http=require("http")
http.createServer(function(req, res){
    res.writeHead(200,{
        "content-type":"text/plain"
    })
    res.write("hello nodejs")
    res.end()
}).listen(3000)

http服務器

像上面同樣使用的createServer方法返回了一個http.Server對象,這實際上是一個建立http服務的捷徑,若是咱們用如下代碼來實現的話,也將同樣可行異步

var http = require("http")
var server = new http.Server()
server.on("request", function(req, res){
        res.writeHead(200, {
        "content-type":"text/plain"
    })
    res.write("hello nodejs")
    res.end()
})
server.listen(3000)

以上代碼是經過直接建立一個http.Server對象,而後爲其添加request事件監聽,其實也就說createServer方法其實本質上也是爲http.Server對象添加了一個request事件監聽。socket

http.Server的事件

http.Server繼承自 net.Server,http.Server提供的事件以下:函數

  • request:當客戶端請求到來時,該事件被觸發,提供兩個參數req和res,表示請求和響應信息,是最經常使用的事件
  • connection:當TCP鏈接創建時,該事件被觸發,提供一個參數socket,是net.Socket的實例
  • close:當服務器關閉時,觸發事件(注意不是在用戶斷開鏈接時)

正如上面咱們所看到的request事件是最經常使用的,而參數req和res分別是http.IncomingMessage和http.ServerResponse的實例,那麼咱們來看看這兩個類ui

http.IncomingMessage

在server端:獲取請求發送方的信息,好比請求方法、路徑、傳遞的數據等。
在client端:獲取 server 端發送過來的信息,好比請求方法、路徑、傳遞的數據等。編碼

http.IncomingMessage實例 有三個屬性須要注意:method、statusCode、statusMessage。url

  • method:只在 server 端的實例有(也就是 serverReq.method)
  • statusCode/statusMessage:只在 client 端 的實例有(也就是 clientRes.method)

而且其提供了3個事件,以下code

  • data:當請求體數據到來時,該事件被觸發,該事件提供一個參數chunk,表示接受的數據,若是該事件沒有被監聽,則請求體會被拋棄,該事件可能會被調用屢次(這與nodejs是異步的有關係)
  • end:當請求體數據傳輸完畢時,該事件會被觸發,此後不會再有數據
  • close:用戶當前請求結束時,該事件被觸發,不一樣於end,若是用戶強制終止了傳輸,也是用close

http.ServerResponse

http.ServerResponse 的做用很明確,服務端經過http.ServerResponse 實例,來個請求方發送數據。包括髮送響應表頭,發送響應主體等。它決定了用戶最終看到的內容,通常也由http.Server的request事件發送,並做爲第二個參數傳遞,它有三個重要的成員函數,用於返回響應頭、響應內容以及結束請求

  • res.writeHead(statusCode,[heasers]):向請求的客戶端發送響應頭,該函數在一個請求中最多調用一次,若是不調用,則會自動生成一個響應頭
  • res.write(data,[encoding]):想請求的客戶端發送相應內容,data是一個buffer或者字符串,若是data是字符串,則須要制定編碼方式,默認爲utf-8,在res.end調用以前能夠屢次調用
  • res.end([data],[encoding]):結束響應,告知客戶端全部發送已經結束,當全部要返回的內容發送完畢時,該函數必需被調用一次,兩個可選參數與res.write()相同。若是不調用這個函數,客戶端將用於處於等待狀態。

http客戶端

http模塊提供了兩個函數http.request和http.get,功能是做爲客戶端向http服務器發起請求。

var http = require('http')

// http server
var server = http.createServer(function(req, res){
    var url = req.url
    res.end( '您訪問的地址是:' + url )
})

server.listen(3000)

// http client
var client = http.get('http://127.0.0.1:3000', function(res){
    res.setEncoding("utf-8")
    res.on("data",function(chunk){
        console.log(chunk.toString()) 
    })
    console.log(res.statusCode);
})

client.on("error",function(err){ 
    console.log(err.message)
})
client.end()

http.ClientRequest

此對象由 http.request() 內部建立並返回。 它表示正在進行的請求,且其請求頭已進入隊列。 請求頭仍然可使用 setHeader(name, value)getHeader(name)removeHeader(name) 改變。 實際的請求頭將與第一個數據塊一塊兒發送,或者當調用 request.end() 時發送。
要得到響應,則爲請求對象添加 'response' 事件監聽器。 當接收到響應頭時,將、則會從請求對象觸發 'response' 事件。 'response' 事件執行時有一個參數,該參數是 http.IncomingMessage 的實例。

'response' 事件期間,能夠添加監聽器到響應對象,好比監聽 'data' 事件。

若是沒有添加 'response' 事件處理函數,則響應將被徹底丟棄。 若是添加了 'response' 事件處理函數,則必須消費完響應對象中的數據,每當有 'readable' 事件時調用 response.read()、或添加 'data' 事件處理函數、或經過調用 .resume() 方法。 在消費完數據以前,不會觸發 'end' 事件。 此外,在讀取數據以前,它將佔用內存,最終可能致使進程內存不足的錯誤。

Node.js 不檢查 Content-Length 和已傳輸的主體的長度是否相等。

請求繼承自流,且額外實現如下內容:

  • 'abort': 當請求被客戶端停止時觸發。 此事件僅在第一次調用 abort() 時觸發。
  • 'timeout':當底層套接字因不活動而超時時觸發。 這隻會通知套接字已空閒。 必須手動停止請求。
  • ...
相關文章
相關標籤/搜索