原生node的header


首先引入http模塊

獲取http.ServerResponse對象的方式,
1.http.createServer(function(req,res){}) 其中res是http.ServerResponse對象

2.var server = http.createServer().listen(9332,'localhost')
   server.on('request',function(req,res){})    server的request對象的request事件中,res為http.ServerResponse對象

http.ServerResponse對象的方法:

1.報頭:

    1.writeHead()

    2.setHeader()

    3.getHeader(類型參數)

    4.removeHeader()

    5.addTrailers()    追加頭信息

2.報文

    1.write() 報文內容,返回值是true/false

  2.end()   結束響應,必須調用end()方法,否則是超時,沒有響應.

    3.setTimeout()    服務器沒有響應時,觸發這個事件.

http.ServerResponse對象的屬性:

    1.headerSent      當頭部已經有響應后,res.headerSent 為true 否則為false.可以通過這個屬性來判斷是否已經響應.

    2.statusCode

    3.sendDate         true/fasle   當為false時,將刪除頭部時間

http.ServerResponse監聽的事件

    1.timeout事件

    2.close事件

    3.request事件

    4.checkContinue事件

    5.connect事件

    6.clientError事件

設置頭部信息,有兩個方法:

  1.setHeader(name,value)方法可以調用多次,但真正寫入到頭部的必須調用一次writeHead()

  2.http.ServerResponse.writeHead(statusCode[,reasonPhrase][,headers]) 其中headers 為設置的頭對象

      3.設置的頭部信息的內容:

          content-type: 內容類型, [type]/[subtype]; parameter

      location: 將客戶端的請求重定向

    content-disposition: 指定一個被下載的文件名

          content-length: 服務器響應的字段數

          set-cookie:設置cookie

          Cache-Control: 開啟緩存

          Expires:緩存失效時間

          Etag:當服務器沒有變化時,不重新下載文件

(1)content-type的類型,這是幾個大類,然后后面是具體的小類:

    Text:用於標准化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的; 

    Multipart:用於連接消息體的多個部分構成一個消息,這些部分可以是不同類型的數據; 

    Application:用於傳輸應用程序數據或者二進制數據; 

    Message:用於包裝一個E-mail消息; 

    Image:用於傳輸靜態圖片數據; 

    Audio:用於傳輸音頻或者音聲數據; 

    Video:用於傳輸動態影像數據,可以是與音頻編輯在一起的視頻數據格式。 

(2)通常還有一些設置跨域的內容:

    res.setHeader("Access-Control-Allow-Origin", "*");

    res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");

    res.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");

報文信息:

在調用res.end()之前可以多次調用res.write()方法,res.write()返回一個true/fasle,

當沒有響應或者超時時(這種情況遇到很多次,進程沒有掛掉,一直處在無響應,但是客戶端一直可以請求),res.setTimeout(毫秒數,callback),當超時時,會觸發res.on(timeout,function(){}),如果沒有回調函數,則自動調用end()結束請求.

當網絡較好,數據量較少時,,將數據直接發送到上操作系統的內核緩存區,然后從內核緩存去取出數據發送給對方.返回值是true

當數據比較大,網速慢時,先將數據緩存在內存中,如果客戶端可以接收數據了,再將數據發送到內核緩存區中,最后發送給對方.返回值是false

因此在大量數據的時候,會有內存爆滿.

這是在並發情況下的用async做的控制,

當集合中元素很多,不能一次全部並行操作,又不想一個一個按順序來,可以使用forEachLimit函數。它可以設定一批處理幾個,每一批內並行執行,批與批之間順序執行。

async.forEachLimit(eles, 5000, (list, cb) => { // do something; }); 
 

獲取req的報文信息 

通過req.對象來獲取(req對象參考上面的獲取方法)

req.屬性包含以下屬性:

1.method:客戶端請求的方法

2.url:客戶端請求的url

3.headers:請求頭對象,包含cookies和瀏覽器信息(報文) 

           Connection:keep-alive

    Content-Length:874

    Content-Type:application/json; charset=utf-8

    Date:Fri, 20 Jan 2017 03:25:38 GMT

    ETag:W/"36a-yQDJ0iz/THXt81YLCAOKTg"

    Vary:X-HTTP-Method-Override

    Via:1.0 am-forward (squid/3.1.23)

    X-Cache:MISS from am-forward

    X-Cache-Lookup:MISS from am-forward:3128

    X-powered-by:www.yunshipei.com

           accept-encoding: 'gzip, deflate, sdch'                  //說明瀏覽器支持的壓縮格式

 httpVersion: http協議版本號

socket:客戶端監聽的socket對象

對於傳輸的壓縮的處理請參考:http://www.poluoluo.com/jzxy/201504/353581.html.這時不僅要判斷content-encoding還要與客戶端協商一致.

 獲取部分內容

 在頭部中設置:

      1.Range: bytes=5001-10000   //5001-10000字節

      2.Range: bytes=5001-           //5001字節以后的

      3.Range: bytes=-3000,5000-7000 //從一開始到3000字節和5000-7000字節

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM