/

Node HTTP 模組

Node HTTP 模組

Node.js 的 http 模組提供了有用的函式和類別來建構 HTTP 伺服器。

HTTP 核心模組是 Node 網路通訊的重要模組。

你可以透過以下方式引入此模組:

1
const http = require('http');

這個模組提供了一些屬性、方法和類別。

屬性

http.METHODS

這個屬性列出了所有支援的 HTTP 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
> require('http').METHODS
[ 'ACL',
'BIND',
'CHECKOUT',
'CONNECT',
'COPY',
'DELETE',
'GET',
'HEAD',
'LINK',
'LOCK',
'M-SEARCH',
'MERGE',
'MKACTIVITY',
'MKCALENDAR',
'MKCOL',
'MOVE',
'NOTIFY',
'OPTIONS',
'PATCH',
'POST',
'PROPFIND',
'PROPPATCH',
'PURGE',
'PUT',
'REBIND',
'REPORT',
'SEARCH',
'SUBSCRIBE',
'TRACE',
'UNBIND',
'UNLINK',
'UNLOCK',
'UNSUBSCRIBE' ]

http.STATUS_CODES

這個屬性列出了所有 HTTP 狀態碼及其描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
> require('http').STATUS_CODES
{ '100': 'Continue',
'101': 'Switching Protocols',
'102': 'Processing',
'200': 'OK',
'201': 'Created',
'202': 'Accepted',
'203': 'Non-Authoritative Information',
'204': 'No Content',
'205': 'Reset Content',
'206': 'Partial Content',
'207': 'Multi-Status',
'208': 'Already Reported',
'226': 'IM Used',
'300': 'Multiple Choices',
'301': 'Moved Permanently',
'302': 'Found',
'303': 'See Other',
'304': 'Not Modified',
'305': 'Use Proxy',
'307': 'Temporary Redirect',
'308': 'Permanent 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 Timeout',
'409': 'Conflict',
'410': 'Gone',
'411': 'Length Required',
'412': 'Precondition Failed',
'413': 'Payload Too Large',
'414': 'URI Too Long',
'415': 'Unsupported Media Type',
'416': 'Range Not Satisfiable',
'417': 'Expectation Failed',
'418': 'I\'m a teapot',
'421': 'Misdirected Request',
'422': 'Unprocessable Entity',
'423': 'Locked',
'424': 'Failed Dependency',
'425': 'Unordered Collection',
'426': 'Upgrade Required',
'428': 'Precondition Required',
'429': 'Too Many Requests',
'431': 'Request Header Fields Too Large',
'451': 'Unavailable For Legal Reasons',
'500': 'Internal Server Error',
'501': 'Not Implemented',
'502': 'Bad Gateway',
'503': 'Service Unavailable',
'504': 'Gateway Timeout',
'505': 'HTTP Version Not Supported',
'506': 'Variant Also Negotiates',
'507': 'Insufficient Storage',
'508': 'Loop Detected',
'509': 'Bandwidth Limit Exceeded',
'510': 'Not Extended',
'511': 'Network Authentication Required' }

http.globalAgent

指向 http.Agent 類別的全域實例的物件。

http.Agent 類別負責管理和重複使用 HTTP 客戶端的連線,是 Node HTTP 網路的關鍵元件。

後續將更詳細介紹 http.Agent 類別。

方法

http.createServer()

回傳一個新的 http.Server 類別的實例。

使用方式如下:

1
2
3
const server = http.createServer((req, res) => {
// 使用回呼函式處理每個請求
});

http.request()

對伺服器發起 HTTP 請求,並建立一個 http.ClientRequest 類別的實例。

http.get()

類似於 http.request(),但自動將 HTTP 方法設為 GET,並自動呼叫 req.end()

類別

HTTP 模組提供了 5 個類別:

  • http.Agent
  • http.ClientRequest
  • http.Server
  • http.ServerResponse
  • http.IncomingMessage

http.Agent

Node 建立了一個 http.Agent 類別的全域實例,負責管理和重複使用 HTTP 客戶端的連線,是 Node HTTP 網路的關鍵元件。

此物件確保每個發送至伺服器的請求都會排隊並重複使用單一個 Socket。

它同時維護著一個 Socket 池,對於效能來說非常重要。

http.ClientRequest

當執行 http.request()http.get() 時,會建立一個 http.ClientRequest 物件。

在接收到回應時,會觸發 response 事件,並將 http.IncomingMessage 類別的實例作為參數傳入。

可透過以下兩種方式讀取回應的資料:

  • 可以呼叫 response.read() 方法
  • response 事件的處理器中,可以設定一個 data 事件監聽器,以監聽串流進來的資料。

http.Server

透過 http.createServer() 建立新的伺服器時,常常會返回 http.Server 類別的實例。

一旦有伺服器物件,你就可以存取它的方法:

  • close() 停止伺服器接受新的連線
  • listen() 開啟 HTTP 伺服器並監聽連線

http.ServerResponse

http.Server 建立並作為 request 事件的第二個參數傳遞。

它在代碼中通常被稱為 res

1
2
3
const server = http.createServer((req, res) => {
// res 是一個 http.ServerResponse 物件
});

在處理程序中,你總會呼叫 end() 方法,它會關閉回應,訊息完成,伺服器可以將其發送到客戶端。每個回應都必須呼叫一次。

這些方法用於與 HTTP 標頭互動:

  • getHeaderNames() 取得已經設定的 HTTP 標頭名稱列表
  • getHeaders() 取得已經設定的 HTTP 標頭的副本
  • setHeader('headername', value) 設定 HTTP 標頭的值
  • getHeader('headername') 取得已經設定的 HTTP 標頭
  • removeHeader('headername') 移除已經設定的 HTTP 標頭
  • hasHeader('headername') 如果回應中有該標頭已經設定,則返回 true
  • headersSent() 如果標頭已經發送到客戶端,則返回 true

在處理標頭後,可以呼叫 response.writeHead() 來將標頭發送到客戶端,它接受 statusCode 作為第一個參數,可選的狀態訊息,以及標頭物件。

要將資料送到客戶端的回應主體,可以使用 write()。它會將緩衝的資料傳送到 HTTP 回應串流中。

如果尚未使用 response.writeHead() 發送標頭,它將首先發送標頭,其中包含請求中設定的狀態碼和訊息,你可以透過設定 statusCodestatusMessage 的值進行編輯:

1
2
response.statusCode = 500;
response.statusMessage = 'Internal Server Error';

http.IncomingMessage

當監聽 request 事件時,由 http.Server 建立 http.IncomingMessage 物件;當監聽 response 事件時,由 http.ClientRequest 建立。

它可用於存取回應的訊息:

  • 狀態碼,使用其 statusCodestatusMessage 方法
  • 標頭,使用其 headers 方法或 rawHeaders
  • HTTP 方法,使用其 method 方法
  • HTTP 版本,使用 httpVersion 方法
  • URL,使用 url 方法
  • 底層 socket,使用 socket 方法

資料可透過串流存取,因為 http.IncomingMessage 實作了可讀串流介面。