首頁 web前端 js教程 NodeJS學習筆記之Http模組_node.js

NodeJS學習筆記之Http模組_node.js

May 16, 2016 pm 04:20 PM
http模組 nodejs

一,開頭分析

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

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

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

複製程式碼 程式碼如下:

HTTP
    http.STATUS_CODES
    http.createServer([requestListener])
    http.createClient([連接埠], [主機])
    類別:http.Server
    事件 : '請求'
    事件: '連結'
    事件: '關閉'
    事件:「檢查繼續」
    事件:「連結」
    事件:「升級」
    事件:「客戶端錯誤」
    server.listen(埠, [主機名稱], [積壓], [回呼])
    server.listen(路徑, [回呼])
    server.listen(句柄, [回呼])
    server.close([回呼])
    server.maxHeadersCount
    server.setTimeout(毫秒, 回呼)
    伺服器逾時
    類別:http.ServerResponse
        事件: '關閉'
        response.writeContinue()
        response.writeHead(statusCode, [reasonPhrase], [headers])
        response.setTimeout(毫秒, 回呼)
        回應.statusCode
        response.setHeader(name, 值)
        response.headersSent
        回應.sendDate
        response.getHeader(姓名)
        response.removeHeader(姓名)
        response.write(chunk, [編碼])
        response.addTrailers(題)
        response.end([資料], [編碼])
        http.request(選項, 回呼)
        http.get(選項, 回呼)
    類別:http.Agent
        新代理商([選項])
        agent.maxSockets
        agent.maxFreeSockets
        代理.sockets
        agent.freeSockets
        代理.請求
        agent.destroy()
        agent.getName(選項)
        http.globalAgent
    類別:http.ClientRequest
        事件「回應」
        事件:「插座」
        事件:「連結」
        事件:「升級」
        事件:「繼續」
        request.write(chunk, [編碼])
        request.end([資料], [編碼])
        request.abort()
        request.setTimeout(逾時, [回呼])
        request.setNoDelay([noDelay])
        request.setSocketKeepAlive([enable], [initialDelay])
    http.IncomingMessage
        事件: '關閉'
        message.httpVersion
        訊息.headers
        message.rawHeaders
        訊息.預告片
        message.rawTrailers
        message.setTimeout(毫秒, 回呼)
        訊息.方法
        訊息.url
        message.statusCode
        訊息.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 = 匯出。 STATUS_CODES = {
  100:'繼續',
  101:“切換協定”,
  102 : '處理',                 // RFC 2518,且被 RFC 4918 捨棄
  200:'好的',
  201:“已建立”,
  202:“已接受”,
  203:“非權威資訊”,
  204:“沒有內容”,
  205:“重置內容”,
  206:“部分內容”,
  207 : '多重狀態',               // RFC 4918
  300:“多項選擇”,
  301:“永久移動”,
  302:“暫時移動”,
  303:“查看其他”,
  304:“未修改”,
  305:“使用代理”,
  307:“暫時重新導向”,
  400:“錯誤請求”,
  401:'未經授權',
  402:“需要付款”,
  403:“禁止”,
  404:“未找到”,
  405:“不允許的方法”,
  406:“不可接受”,
  407:“需要代理身份驗證”,
  408:'請求超時',
  409:“衝突”,
  410:“走了”,
  411:“需要長度”,
  412:“前提條件失敗”,
  413:“請求實體太大”,
  414:“請求 URI 太大”,
  415:“不支援的媒體類型”,
  416:“請求的範圍無法滿足”,
  417:“期望失敗”,
  418:“我是茶壺”,              // RFC 2324
  422:“無法處理的實體”,       // RFC 4918
  423 : '鎖定',                     // RFC 4918
  424:“依賴失敗”,          // RFC 4918
  425 : '無序集合',       // RFC 4918
  426:“需要升級”,           // RFC 2817
  500:“內部伺服器錯誤”,
  501:“未實施”,
  502:“錯誤網關”,
  503:“服務不可用”,
  504:“網關逾時”,
  505 : '不支援 HTTP 版本',
  506:“變體也協商”,    // RFC 2295
  507:“儲存空間不足”,       // RFC 4918
  509:“超出頻寬限制”,
  510 : '未擴充'                // 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 () {
         身體 = 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物件則是可寫流 。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1243
24
nodejs和vuejs區別 nodejs和vuejs區別 Apr 21, 2024 am 04:17 AM

Node.js 是一種伺服器端 JavaScript 執行時,而 Vue.js 是一個客戶端 JavaScript 框架,用於建立互動式使用者介面。 Node.js 用於伺服器端開發,如後端服務 API 開發和資料處理,而 Vue.js 用於用戶端開發,如單一頁面應用程式和響應式使用者介面。

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs可以寫前端嗎 nodejs可以寫前端嗎 Apr 21, 2024 am 05:00 AM

是的,Node.js可用於前端開發,主要優勢包括高效能、豐富的生態系統和跨平台相容性。需要考慮的注意事項有學習曲線、工具支援和社群規模較小。

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

See all articles