一、前置知識
在理解koa-bodyparser原理之前,首先需要了解部分HTTP相關(guān)的知識。
1、報文主體
HTTP報文主要分為請求報文和響應(yīng)報文,koa-bodyparser主要針對請求報文的處理。
請求報文主要由以下三個部分組成:
報文頭部 空行 報文主體而koa-bodyparser中的body指的就是請求報文中的報文主體部分。
2、服務(wù)器端獲取報文主體流程
HTTP底層采用TCP提供可靠的字節(jié)流服務(wù),簡單而言就是報文主體部分會被轉(zhuǎn)化為二進(jìn)制數(shù)據(jù)在網(wǎng)絡(luò)中傳輸,所以服務(wù)器端首先需要拿到二進(jìn)制流數(shù)據(jù)。
談到網(wǎng)絡(luò)傳輸,當(dāng)然會涉及到傳輸速度的優(yōu)化,而其中一種優(yōu)化方式就是對內(nèi)容進(jìn)行壓縮編碼,常用的壓縮編碼方式有:
gzip compress deflate identity(不執(zhí)行壓縮或不會變化的默認(rèn)編碼格式)服務(wù)器端會根據(jù)報文頭部信息中的Content-Encoding確認(rèn)采用何種解壓編碼。
接下來就需要將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的字符,而字符也有不同的字符編碼方式,例如對于中文字符處理差異巨大的UTF-8和GBK,UTF-8編碼漢字通常需要三個字節(jié),而GBK只需要兩個字節(jié)。所以還需要在請求報文的頭部信息中設(shè)置Content-Type使用的字符編碼信息(默認(rèn)情況下采用的是UTF-8),這樣服務(wù)器端就可以利用相應(yīng)的字符規(guī)則進(jìn)行解碼,得到正確的字符串。
拿到字符串之后,服務(wù)器端又要問了:客戶端,你這一段字符串是啥意思???
根據(jù)不同的應(yīng)用場景,客戶端會對字符串采用不同的編碼方式,常見的編碼方式有:
URL編碼方式: a=1&b=2 JSON編碼方式: {a:1,b:2}客戶端會將采用的字符串編碼方式設(shè)置在請求報文頭部信息的Content-Type屬性中,這樣服務(wù)器端根據(jù)相應(yīng)的字符串編碼規(guī)則進(jìn)行解碼,就能夠明白客戶端所傳遞的信息了。
下面一步步分析koa-bodyparser是如何處理這一系列操作,從而得到報文主體內(nèi)容。
二、獲取二進(jìn)制數(shù)據(jù)流
NodeJS中獲取請求報文主體二進(jìn)制數(shù)據(jù)流主要通過監(jiān)聽request對象的data事件完成:
// 示例一const http = require('http')http.createServer((req, res) => { const body = [] req.on('data', chunk => { body.push(chunk) }) req.on('end', () => { const chunks = Buffer.concat(body) // 接收到的二進(jìn)制數(shù)據(jù)流 // 利用res.end進(jìn)行響應(yīng)處理 res.end(chunks.toString()) })}).listen(1234)而koa-bodyparser主要是對co-body 的封裝,而【co-body】中主要是采用raw-body 模塊獲取請求報文主體的二進(jìn)制數(shù)據(jù)流,【row-body】主要是對上述示例代碼的封裝和健壯性處理。
三、內(nèi)容解碼
客戶端會將內(nèi)容編碼的方式放入請求報文頭部信息Content-Encoding屬性中,服務(wù)器端接收報文主體的二進(jìn)制數(shù)據(jù)了時,會根據(jù)該頭部信息進(jìn)行解壓操作,當(dāng)然服務(wù)器端可以在響應(yīng)報文頭部信息Accept-Encoding屬性中添加支持的解壓方式。
新聞熱點(diǎn)
疑難解答
圖片精選