最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NodeJS學習筆記之Http模塊

 更新時間:2015年01月13日 10:56:53   投稿:hebedich  
這里只是熟悉nodejs中的http模塊的API,一般在開發(fā)過程中使用的是第三方的框架,比如說Express。其中封裝了更為簡單的構(gòu)建http服務(wù)器的API。

一,開篇分析

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

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

希望大家可以先閱讀一下官網(wǎng)提供的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

讓我們先從一個簡單例子開始,創(chuàng)建一個叫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)以下是運行結(jié)果:

 

二,細節(jié)分析實例

具體看一下這個小例子:

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

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

  參數(shù) "requestListener" 是一個函數(shù),它將會自動加入到 "request" 事件的監(jiān)聽隊列。

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

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

  所有的回調(diào)都是在一個工作線程上運行。

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

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

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

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

  一個"IncomingMessage"對象是由http.Server或http.ClientRequest創(chuàng)建的,

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

  它也可以被用來訪問應答的狀態(tài),頭文件和數(shù)據(jù)。

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

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

  向請求回復響應頭。"statusCode"是一個三位是的HTTP狀態(tài)碼,例如 404 。最后一個參數(shù),"headers",是響應頭的內(nèi)容。

  舉個栗子:

復制代碼 代碼如下:

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

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

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

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

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

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

 如下是源碼參考:

復制代碼 代碼如下:

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
};

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

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

 

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

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

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

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

三,實例

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

這是一個"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”請求數(shù)據(jù)內(nèi)容。

復制代碼 代碼如下:

 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

四,總結(jié)一下

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

相關(guān)文章

  • Node.js多進程的方法與參數(shù)實例說明

    Node.js多進程的方法與參數(shù)實例說明

    這篇文章主要介紹了Node.js多進程的方法與參數(shù)實例說明,Node.js 是以單線程的模式運行的,但它使用的是事件驅(qū)動來處理并發(fā),這樣有助于我們在多核 cpu 的系統(tǒng)上創(chuàng)建多個子進程,從而提高性能,需要的朋友可以參考下
    2023-05-05
  • 從reflect?metadata理解Nest實現(xiàn)原理

    從reflect?metadata理解Nest實現(xiàn)原理

    這篇文章主要為大家介紹了從reflect?metadata理解Nest實現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 一步步教你利用Docker設(shè)置Node.js

    一步步教你利用Docker設(shè)置Node.js

    這篇文章主要介紹了利用Docker設(shè)置Node.js的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • nodejs入門教程六:express模塊用法示例

    nodejs入門教程六:express模塊用法示例

    這篇文章主要介紹了nodejs入門教程之express模塊用法,結(jié)合實例形式分析了express模塊的功能、創(chuàng)建、路由相關(guān)使用技巧,需要的朋友可以參考下
    2017-04-04
  • nodejs和php實現(xiàn)圖片訪問實時處理

    nodejs和php實現(xiàn)圖片訪問實時處理

    這篇文章主要為大家詳細介紹了nodejs和php分別實現(xiàn)圖片訪問實時處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 詳解nodejs微信公眾號開發(fā)——2.自動回復

    詳解nodejs微信公眾號開發(fā)——2.自動回復

    這篇文章主要介紹了詳解nodejs微信公眾號開發(fā)——2.自動回復,非常具有實用價值,需要的朋友可以參考下
    2017-04-04
  • mac下徹底卸載node和npm方法步驟

    mac下徹底卸載node和npm方法步驟

    我們經(jīng)常在卸載軟件的時候會遇到有殘留,這樣就很難去重新下載,本篇文章就來介紹mac下徹底卸載node和npm及重新安裝的方法,有需要的朋友可以借鑒參考下
    2021-09-09
  • 詳解node.js的http模塊實例演示

    詳解node.js的http模塊實例演示

    這篇文章主要介紹了詳解node.js的http模塊實例演示,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 關(guān)于node使用multer進行文件的上傳與下載

    關(guān)于node使用multer進行文件的上傳與下載

    這篇文章主要介紹了關(guān)于node使用multer進行文件的上傳與下載,Multer是一個Node.js中間件,用于處理表單數(shù)據(jù)中的multipart/form-data類型,需要的朋友可以參考下
    2023-04-04
  • nodejs 提示‘xxx’ 不是內(nèi)部或外部命令解決方法

    nodejs 提示‘xxx’ 不是內(nèi)部或外部命令解決方法

    本文介紹了node.js包管理工具npm安裝模塊后,無法通過命令行執(zhí)行命令,提示‘xxx’ 不是內(nèi)部或外部命令的解決方法,給需要的小伙伴參考下。
    2014-11-11

最新評論

十堰市| 唐河县| 卢湾区| 丘北县| 开封市| 龙里县| 奎屯市| 太保市| 平遥县| 麟游县| 威宁| 枝江市| 洛宁县| 南城县| 微山县| 周宁县| 阿克陶县| 民乐县| 从江县| 扶绥县| 勃利县| 曲松县| 电白县| 诸城市| 东台市| 张掖市| 芜湖市| 剑阁县| 建昌县| 黄梅县| 宜兰市| 随州市| 阜康市| 杨浦区| 始兴县| 崇明县| 阳信县| 泾源县| 新河县| 新邵县| 定结县|