亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

NodeJS學習筆記之Http模塊

2019-11-20 13:25:06
字體:
來源:轉載
供稿:網友

一,開篇分析

首先“Http”這個概念大家應該比較熟悉了,它不是基于特定語言的,是一個通用的應用層協議,不同語言有不同的實現細節,但是萬變不離其宗,思想是相同的,

NodeJS作為一個宿主運行環境,以JavaScript為宿主語言,它也有自己實現的一套標準,這篇文章我們就一起來學習一下 “Http模塊” 。但是作為前提來說,

希望大家可以先閱讀一下官網提供的api,有一個前置了解,這樣就方便多了,以下是Http部分的api概覽:

復制代碼 代碼如下:

HTTP
    http.STATUS_CODES
    http.createServer([requestListener])
    http.createClient([port], [host])
    Class: http.Server
    事件 : 'request'
    事件: 'connection'
    事件: 'close'
    Event: 'checkContinue'
    事件: 'connect'
    Event: 'upgrade'
    Event: 'clientError'
    server.listen(port, [hostname], [backlog], [callback])
    server.listen(path, [callback])
    server.listen(handle, [callback])
    server.close([callback])
    server.maxHeadersCount
    server.setTimeout(msecs, callback)
    server.timeout
    Class: http.ServerResponse
        事件: 'close'
        response.writeContinue()
        response.writeHead(statusCode, [reasonPhrase], [headers])
        response.setTimeout(msecs, callback)
        response.statusCode
        response.setHeader(name, value)
        response.headersSent
        response.sendDate
        response.getHeader(name)
        response.removeHeader(name)
        response.write(chunk, [encoding])
        response.addTrailers(headers)
        response.end([data], [encoding])
        http.request(options, callback)
        http.get(options, callback)
    Class: http.Agent
        new Agent([options])
        agent.maxSockets
        agent.maxFreeSockets
        agent.sockets
        agent.freeSockets
        agent.requests
        agent.destroy()
        agent.getName(options)
        http.globalAgent
    Class: http.ClientRequest
        Event 'response'
        Event: 'socket'
        事件: 'connect'
        Event: 'upgrade'
        Event: 'continue'
        request.write(chunk, [encoding])
        request.end([data], [encoding])
        request.abort()
        request.setTimeout(timeout, [callback])
        request.setNoDelay([noDelay])
        request.setSocketKeepAlive([enable], [initialDelay])
    http.IncomingMessage
        事件: 'close'
        message.httpVersion
        message.headers
        message.rawHeaders
        message.trailers
        message.rawTrailers
        message.setTimeout(msecs, callback)
        message.method
        message.url
        message.statusCode
        message.socket

讓我們先從一個簡單例子開始,創建一個叫server.js的文件,并寫入以下代碼:

復制代碼 代碼如下:

 var http = require('http') ;
 var server = http.createServer(function(req,res){
 res.writeHeader(200,{
     'Content-Type' : 'text/plain;charset=utf-8'  // 添加charset=utf-8
 }) ;
 res.end("Hello,大熊!") ;
 }) ;
 server.listen(8888) ;
 console.log("http server running on port 8888 ...") ;

(node server.js)以下是運行結果:

 

二,細節分析實例

具體看一下這個小例子:

(1行):通過"require"引入NodeJS自帶的"http"模塊,并且把它賦值給http變量。

(2行):調用http模塊提供的函數:"createServer" 。這個函數會返回一個新的web服務器對象。

  參數 "requestListener" 是一個函數,它將會自動加入到 "request" 事件的監聽隊列。

  當一個request到來時,Event-Loop會將這個Listener回調函數放入執行隊列, node中所有的代碼都是一個一個從執行隊列中拿出來執行的。

  這些執行都是在工作線程上(Event Loop本身可以認為在一個獨立的線程中,我們一般不提這個線程,而將node稱呼為一個單線程的執行環境),

  所有的回調都是在一個工作線程上運行。

  我們在再來看一下"requestListener"這個回調函數,它提供了兩個參數(request,response),

  每次收到一個請求時觸發。注意每個連接又可能有多個請求(在keep-alive的連接中)。

  "request"是http.IncomingMessage的一個實例。"response"是http.ServerResponse的一個實例。

  一個http request對象是可讀流,而http response對象則是可寫流。

  一個"IncomingMessage"對象是由http.Server或http.ClientRequest創建的,

  并作為第一參數分別傳遞給"request"和"response"事件。

  它也可以被用來訪問應答的狀態,頭文件和數據。

  它實現了 "Stream" 接口以及以下額外的事件,方法和屬性。(具體參考api)。

(3行):“writeHeader”,使用 "response.writeHead()"  函數發送一個Http狀態200和Http頭的內容類型(content-type)。

  向請求回復響應頭。"statusCode"是一個三位是的HTTP狀態碼,例如 404 。最后一個參數,"headers",是響應頭的內容。

  舉個栗子:

復制代碼 代碼如下:

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

 注意:Content-Length 是以字節(byte)計算,而不是以字符(character)計算。

  之前的例子原因是字符串 “Hello World !” 只包含了單字節的字符。

  如果body包含了多字節編碼的字符,就應當使用Buffer.byteLength()來確定在多字節字符編碼情況下字符串的字節數。

  需要進一步說明的是Node不檢查Content-Lenth屬性和已傳輸的body長度是否吻合。

 statusCode是一個三位是的HTTP狀態碼, 例如:"404" 。這里要說的是 "http.STATUS_CODES" ,全部標準"Http"響應狀態碼的集合和簡短描述都在里面。

 如下是源碼參考:

復制代碼 代碼如下:

var STATUS_CODES = exports.STATUS_CODES = {
  100 : 'Continue',
  101 : 'Switching Protocols',
  102 : 'Processing',                 // RFC 2518, obsoleted by RFC 4918
  200 : 'OK',
  201 : 'Created',
  202 : 'Accepted',
  203 : 'Non-Authoritative Information',
  204 : 'No Content',
  205 : 'Reset Content',
  206 : 'Partial Content',
  207 : 'Multi-Status',               // RFC 4918
  300 : 'Multiple Choices',
  301 : 'Moved Permanently',
  302 : 'Moved Temporarily',
  303 : 'See Other',
  304 : 'Not Modified',
  305 : 'Use Proxy',
  307 : 'Temporary Redirect',
  400 : 'Bad Request',
  401 : 'Unauthorized',
  402 : 'Payment Required',
  403 : 'Forbidden',
  404 : 'Not Found',
  405 : 'Method Not Allowed',
  406 : 'Not Acceptable',
  407 : 'Proxy Authentication Required',
  408 : 'Request Time-out',
  409 : 'Conflict',
  410 : 'Gone',
  411 : 'Length Required',
  412 : 'Precondition Failed',
  413 : 'Request Entity Too Large',
  414 : 'Request-URI Too Large',
  415 : 'Unsupported Media Type',
  416 : 'Requested Range Not Satisfiable',
  417 : 'Expectation Failed',
  418 : 'I/'m a teapot',              // RFC 2324
  422 : 'Unprocessable Entity',       // RFC 4918
  423 : 'Locked',                     // RFC 4918
  424 : 'Failed Dependency',          // RFC 4918
  425 : 'Unordered Collection',       // RFC 4918
  426 : 'Upgrade Required',           // RFC 2817
  500 : 'Internal Server Error',
  501 : 'Not Implemented',
  502 : 'Bad Gateway',
  503 : 'Service Unavailable',
  504 : 'Gateway Time-out',
  505 : 'HTTP Version not supported',
  506 : 'Variant Also Negotiates',    // RFC 2295
  507 : 'Insufficient Storage',       // RFC 4918
  509 : 'Bandwidth Limit Exceeded',
  510 : 'Not Extended'                // RFC 2774
};

節選自,Nodejs源碼 ”http.js“ 143行開始。

其實從客戶端應答結果也不難看出:

 

(6行):”response.end“------當所有的響應報頭和報文被發送完成時這個方法將信號發送給服務器。服務器會認為這個消息完成了。

  每次響應完成之后必須調用該方法。如果指定了參數 “data” ,就相當于先調用  “response.write(data, encoding) ” 之后再調用 “response.end()” 。

(8行):”server.listen(8888)“ ------ 服務器用指定的句柄接受連接,綁定在特定的端口。

以上就是一個比較詳細的分析過程,希望有助于加深理解,代碼雖然不多,但是重在理解一些細節機制,以便日后高效的開發NodeJS應用。

三,實例

除了可以使用"request"對象訪問請求頭數據外,還能把"request"對象當作一個只讀數據流來訪問請求體數據。

這是一個"POST"請求的例子:

復制代碼 代碼如下:

 http.createServer(function (request, response) {
     var body = [];
     console.log(request.method) ;
     console.log(request.headers) ;
     request.on('data', function (chunk) {
         body.push(chunk);
     }) ;
     request.on('end', function () {
         body = Buffer.concat(body) ;
         console.log(body.toString()) ;
     });
 }).listen(8888) ;

下是一個完整的“Http”請求數據內容。

復制代碼 代碼如下:

 POST / HTTP/1.1
 User-Agent: curl/7.26.0
 Host: localhost
 Accept: */*
 Content-Length: 11
 Content-Type: application/x-www-form-urlencoded
 Hello World

四,總結一下

(1),理解 "Http" 概念。
(2),熟練使用 "Http" 相關的api。
(3),注意細節的把控,比如:“POST,GET” 之間的處理細節。
(4),"requestListener"的理解。
(5),強調一個概念:一個http request對象是可讀流,而http response對象則是可寫流 。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品美女免费| 国产精品69av| 欧美国产日韩视频| 日韩精品中文字幕视频在线| 国产午夜精品视频免费不卡69堂| 久久综合免费视频影院| 国产精品亚洲综合天堂夜夜| 午夜精品免费视频| 久99久在线视频| 日韩激情视频在线播放| 国产美女精品视频免费观看| 欧美色视频日本版| 97婷婷涩涩精品一区| 日韩女优在线播放| 日韩精品欧美激情| 97国产精品免费视频| 国产精品主播视频| 91在线免费看网站| 中文字幕av一区二区| 色综合久综合久久综合久鬼88| 久久天天躁狠狠躁夜夜av| 亚洲天堂免费在线| 日韩av电影中文字幕| 亚洲福利视频久久| 国产成人综合精品在线| 亚洲午夜久久久影院| 在线中文字幕日韩| 国产一区二区欧美日韩| 91在线观看免费高清| 人人做人人澡人人爽欧美| 欧美激情精品久久久久久免费印度| 欧美激情a在线| 一区二区福利视频| 久久在精品线影院精品国产| 成人精品久久一区二区三区| 欧美高清视频一区二区| 国产成+人+综合+亚洲欧洲| 欧美成人三级视频网站| 久久久在线观看| 精品国偷自产在线视频99| 91精品在线播放| 亚洲精品mp4| 日韩精品视频在线观看免费| 91成人天堂久久成人| 国产www精品| 精品久久久在线观看| 久久久人成影片一区二区三区观看| 亚洲图片在区色| 精品无人国产偷自产在线| 亚洲精品一区二区三区婷婷月| 2020国产精品视频| 97视频在线观看视频免费视频| 日本久久久久久| 欧美中文字幕第一页| 久久久999精品视频| 中文字幕成人在线| www国产精品com| 91在线中文字幕| 色七七影院综合| 97视频在线观看免费高清完整版在线观看| 97精品在线视频| 欧美在线视频导航| 亚洲精品久久久久久久久久久| 欧美性高跟鞋xxxxhd| 国产精品爽黄69天堂a| 国产精品国产三级国产专播精品人| 国产精品视频成人| 成人久久精品视频| 久久久久久网站| 亚洲人成电影网站色| 久久精品精品电影网| 亚洲性生活视频| 国产91精品青草社区| 成人综合国产精品| 国产精品久久久久久久久免费看| 欧美在线性爱视频| 国产日韩欧美日韩大片| 亚洲精品白浆高清久久久久久| 国产91精品视频在线观看| 欧美老女人性生活| 亚洲美腿欧美激情另类| 亚洲精品xxx| 美女av一区二区三区| 亚洲午夜未删减在线观看| 欧美亚洲激情视频| 97免费中文视频在线观看| 色在人av网站天堂精品| 欧美成人免费大片| 欧美极品少妇与黑人| 亚洲欧美中文日韩在线v日本| 国产精品aaa| 欧美富婆性猛交| 久久精品电影网| 久久精品视频在线观看| 欧美另类高清videos| 亚洲国产另类 国产精品国产免费| 久久人人爽国产| 69久久夜色精品国产69| 欧美成人精品一区二区| 久久国产色av| 国产精品综合不卡av| 精品国产美女在线| 欧美一区二区三区艳史| 米奇精品一区二区三区在线观看| 午夜精品99久久免费| 日韩精品极品在线观看播放免费视频| 欧美刺激性大交免费视频| 国产精品专区第二| 国产一区二区日韩精品欧美精品| 欧美日韩国产一区在线| 日韩中文综合网| 国产在线拍偷自揄拍精品| 国产欧美精品一区二区| 中文字幕av一区中文字幕天堂| 亚洲资源在线看| 一区二区三区www| 国产成人精品日本亚洲| 欧美一区二区视频97| 欧美情侣性视频| 亚洲欧洲美洲在线综合| 亚洲a∨日韩av高清在线观看| 97精品久久久中文字幕免费| 最近2019年中文视频免费在线观看| 国产精品久久久久免费a∨大胸| 亚洲女成人图区| 欧美精品国产精品日韩精品| 亚洲91精品在线观看| 欧美激情久久久久| 欧美日韩免费一区| 久久99国产精品自在自在app| 羞羞色国产精品| 97视频在线观看亚洲| 色偷偷888欧美精品久久久| 97在线观看免费高清| 成人写真视频福利网| 国产精品成人在线| 欧美床上激情在线观看| 在线观看欧美日韩国产| 亚洲一区二区三区乱码aⅴ| 久久91精品国产91久久跳| 亚洲精品91美女久久久久久久| 亚洲成人性视频| 欧美激情视频网站| 在线日韩日本国产亚洲| 精品久久久av| 中文字幕在线成人| 日本中文字幕不卡免费| 亚洲自拍偷拍视频| 精品国产91久久久| 美女性感视频久久久| 色悠久久久久综合先锋影音下载| 国产精品欧美日韩一区二区| 亚洲欧美制服丝袜| 欧美劲爆第一页| 成人免费福利在线| www.亚洲成人| 欧美性猛交xxxx黑人猛交| 欧美在线观看视频| 91亚洲国产成人精品性色| 九九九久久国产免费| 亚洲亚裔videos黑人hd| 日韩免费观看高清| 日韩精品极品毛片系列视频| 亚洲欧美制服另类日韩|