一、前置知识
在理解koa-bodyparser原理之前,首先需要了解部分HTTP相关的知识。
1、报文主体
HTTP报文主要分为请求报文和响应报文,koa-bodyparser主要针对请求报文的处理。
请求报文主要由以下三个部分组成:
报文头部 空行 报文主体而koa-bodyparser中的body指的就是请求报文中的报文主体部分。
2、服务器端获取报文主体流程
HTTP底层采用TCP提供可靠的字节流服务,简单而言就是报文主体部分会被转化为二进制数据在网络中传输,所以服务器端首先需要拿到二进制流数据。
谈到网络传输,当然会涉及到传输速度的优化,而其中一种优化方式就是对内容进行压缩编码,常用的压缩编码方式有:
gzip compress deflate identity(不执行压缩或不会变化的默认编码格式)服务器端会根据报文头部信息中的Content-Encoding确认采用何种解压编码。
接下来就需要将二进制数据转换为相应的字符,而字符也有不同的字符编码方式,例如对于中文字符处理差异巨大的UTF-8和GBK,UTF-8编码汉字通常需要三个字节,而GBK只需要两个字节。所以还需要在请求报文的头部信息中设置Content-Type使用的字符编码信息(默认情况下采用的是UTF-8),这样服务器端就可以利用相应的字符规则进行解码,得到正确的字符串。
拿到字符串之后,服务器端又要问了:客户端,你这一段字符串是啥意思啊?
根据不同的应用场景,客户端会对字符串采用不同的编码方式,常见的编码方式有:
URL编码方式: a=1&b=2 JSON编码方式: {a:1,b:2}客户端会将采用的字符串编码方式设置在请求报文头部信息的Content-Type属性中,这样服务器端根据相应的字符串编码规则进行解码,就能够明白客户端所传递的信息了。
下面一步步分析koa-bodyparser是如何处理这一系列操作,从而得到报文主体内容。
二、获取二进制数据流
NodeJS中获取请求报文主体二进制数据流主要通过监听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) // 接收到的二进制数据流 // 利用res.end进行响应处理 res.end(chunks.toString()) })}).listen(1234)
而koa-bodyparser主要是对co-body 的封装,而【co-body】中主要是采用raw-body 模块获取请求报文主体的二进制数据流,【row-body】主要是对上述示例代码的封装和健壮性处理。
三、内容解码
客户端会将内容编码的方式放入请求报文头部信息Content-Encoding属性中,服务器端接收报文主体的二进制数据了时,会根据该头部信息进行解压操作,当然服务器端可以在响应报文头部信息Accept-Encoding属性中添加支持的解压方式。
新闻热点
疑难解答
图片精选