手把手教你用 Node 實(shí)現(xiàn) HTTP 協(xié)議(一)
在開始文章前,我們需要對一些基礎(chǔ)知識有一些了解,比如 HTTP 協(xié)議是什么,HTTP 報(bào)文的格式,HTTP 協(xié)議的基礎(chǔ)等等;
本篇文章將會(huì)使用到以下知識,希望讀者在開始閱讀前對基礎(chǔ)知識有一些掌握:
- Node 的基本用法;
- Typescript 語法的基本理解;
- Postman 的基本使用方法;
我們最終的目標(biāo)是實(shí)現(xiàn)由接口工具 Postman 發(fā)起一個(gè)請求,我們的 http 協(xié)議將請求的信息解析完成后,由我們的 http 服務(wù)端返回一個(gè)請求信息的 JSON 字符串,效果圖如下:

最終效果圖
我們的代碼最終調(diào)用效果如下:
import http from './src/Http';
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'application/json')
res.end(200, JSON.stringify(req.httpMessage));
});
server.listen(8888, () => {
console.log("server is listening in 8888...");
});
有些朋友可能覺得上面的代碼有點(diǎn)眼熟,其實(shí)上面的代碼調(diào)用看起來就像是 Node 的 http 模塊,我們這個(gè)教程的目的也可以說是實(shí)現(xiàn)一個(gè) http 模塊,可以接受 HTTP 請求,并且響應(yīng)處理結(jié)果。
現(xiàn)在我們先來了解幾個(gè)開頭提到的基礎(chǔ)知識:
HTTP 協(xié)議是什么?
- HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。
- 我們使用 HTTP 協(xié)議規(guī)范來完成客戶與服務(wù)器之間的通信,形象一點(diǎn)的說就是通信的雙方需要按照規(guī)范來進(jìn)行通信。
- 比如狀態(tài)碼就是一個(gè)規(guī)范,狀態(tài)碼規(guī)定了 1xx~5xx 代表的含義,500 通常代表服務(wù)器內(nèi)部錯(cuò)誤,然而你也可以用 500 代表服務(wù)器成功處理,但是這樣就屬于不遵守規(guī)范了。
- HTTP 協(xié)議就是由一些預(yù)定義的規(guī)范所組成的最佳實(shí)踐,實(shí)現(xiàn) HTTP 協(xié)議換個(gè)說法就是用代碼實(shí)現(xiàn)這些規(guī)范,遵循 HTTP 協(xié)議規(guī)范的雙方可以進(jìn)行通信。
HTTP 報(bào)文的格式
- 如果說 HTTP 是因特網(wǎng)的信使,那么 HTTP 報(bào)文就是它用來搬東西的包裹。
- HTTP 報(bào)文是簡單的格式化數(shù)據(jù)塊。它們由三部分組成:對報(bào)文進(jìn)行描述的起始行(start line)、包含屬性的首部(header)塊、以及可選的包含數(shù)據(jù)的主體(body)部分。
- 起步行和首部就是由行分隔的 ASCII 文本。每行都以一個(gè) 由兩個(gè)字符組成的行終止序列作為結(jié)束,其中包括一個(gè)回車符(ASCII 碼 13)和一個(gè)換行符(ASCII 碼 10)。這個(gè)行終止序列可以寫作 CRLF。
- 報(bào)文的語法
- 請求報(bào)文的格式 <method><request-URL><version> CRLF <headers> CRLF <entity-body>
- 響應(yīng)報(bào)文的格式 <version><status><reason-phrase> CRLF <headers> CRLF <entity-body>
HTTP 協(xié)議的基礎(chǔ)
- HTTP 協(xié)議遵循 TCP/IP 協(xié)議簇規(guī)范,屬于 TCP/IP 中的應(yīng)用層協(xié)議,建立在 TCP 可靠協(xié)議的基礎(chǔ)上,處理 TCP 通信中的字節(jié)流,將字節(jié)流轉(zhuǎn)換成有意義的 HTTP 協(xié)議規(guī)范。
- Node 的
net模塊用于創(chuàng)建基于流的 TCP 或 IPC 的服務(wù)器,所以我們會(huì)在net模塊的(TCP)基礎(chǔ)上實(shí)現(xiàn) HTTP 協(xié)議。
從上面的幾點(diǎn)可以看出,我們最主要的任務(wù)有兩個(gè),第一是建立 TCP 通信管道用于客戶端與服務(wù)器的全雙工通信,第二就是解析 HTTP 報(bào)文。
由于 TCP 協(xié)議已經(jīng)被 Node 的 net 模塊封裝好了,所以我們下一章重點(diǎn)講述對 HTTP 報(bào)文的解析。