国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

深入koa-bodyparser原理解析

2024-05-06 15:43:13
字體:
供稿:網(wǎng)友

一、前置知識

在理解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屬性中添加支持的解壓方式。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 盈江县| 兰西县| 金昌市| 兴业县| 普格县| 睢宁县| 外汇| 山阳县| 克东县| 郑州市| 巴塘县| 家居| 武功县| 龙里县| 永宁县| 日喀则市| 会宁县| 铜川市| 抚顺县| 宁化县| 石景山区| 盐津县| 育儿| 班玛县| 临江市| 南雄市| 天水市| 永登县| 马尔康县| 阿克苏市| 商丘市| 罗山县| 靖边县| 成武县| 常州市| 周口市| 汉川市| 迭部县| 晋中市| 北宁市| 健康|