深入koa-bodyparser原理解析

2020-06-17 05:39:34易采站长站整理

三、内容解码

客户端会将内容编码的方式放入请求报文头部信息Content-Encoding属性中,服务器端接收报文主体的二进制数据了时,会根据该头部信息进行解压操作,当然服务器端可以在响应报文头部信息Accept-Encoding属性中添加支持的解压方式。

而【row-body】主要采用 inflation 模块进行解压处理。

四、字符解码

一般而言,UTF-8是互联网中主流的字符编码方式,前面也提到了还有GBK编码方式,相比较UTF-8,它编码中文只需要2个字节,那么在字符解码时误用UTF-8解码GBK编码的字符,就会出现中文乱码的问题。

NodeJS主要通过Buffer处理二进制数据流,但是它并不支持GBK字符编码方式,需要通过 iconv-lite 模块进行处理。

【示例一】中的代码就存在没有正确处理字符编码的问题,那么报文主体中的字符采用GBK编码方式,必然会出现中文乱码:


const request = require('request')
const iconv = require('iconv-lite')

request.post({
url: 'http://localhost:1234/',
body: iconv.encode('中文', 'gbk'),
headers: {
'Content-Type': 'text/plain;charset=GBK'
}
}, (error, response, body) => {
console.log(body) // 发生中文乱码情况
})

NodeJS中的Buffer默认是采用UTF-8字符编码处理,这里借助【iconv-lite】模块处理不同的字符编码方式:


const chunks = Buffer.concat(body)
res.end(iconv.decode(chunks, charset)) // charset通过Content-Type得到

五、字符串解码

前面已经提到了字符串的二种编码方式,它们对应的Content-Type分别为:

URL编码 application/x-www-form-urlencoded
JSON编码 application/json

对于前端来说,URL编码并不陌生,经常会用于URL拼接操作,唯一需要注意的是不要忘记对键值对进行decodeURIComponent()处理。

当客户端发送请求主体时,需要进行编码操作:


'a=1&b=2&c=3'

服务器端再根据URL编码规则解码,得到相应的对象。


// URL编码方式 简单的解码方法实现
function decode (qs, sep = '&', eq = '=') {
const obj = {}
qs = qs.split(sep)

for (let i = 0, max = qs.length; i < max; i++) {
const item = qs[i] const index = item.indexOf(eq)

let key, value

if (~index) {
key = item.substr(0, index)
value = item.substr(index + 1)
} else {
key = item
value = ''
}

key = decodeURIComponent(key)
value = decodeURIComponent(value)

if (!obj.hasOwnProperty(key)) {
obj[key] = value
}
}
return obj