content-type一些疑惑

相信很初学者在使用body-parser时感到疑惑

我们先说说他的作用,其实很简单,就是把HTTP请求里的请求体传参解析出来

我们在使用接口测试工具时(例如:postman Apipost)

ApiPost

可以看到请求体传参有 content-type 分别是 multipart/form-dataapplication/x-www-form-urlencoded

multipart/form-data

  • 一般传送文件或者二进制数据,也可以传文本
  • 数据以多个part形式传输
  • 会指定一个boundary来分割不同part
1
2
3
4
5
6
7
8
9
10
Content-Type: multipart/form-data; boundary=
--------------------------460532464492192001772468
Content-Disposition: form-data; name="foo"

this is part 1.
--------------------------460532464492192001772468
Content-Disposition: form-data; name="baz"

this is part 2
--------------------------460532464492192001772468

application/x-www-form-urlencoded

  • 一般传输文本
  • 格式是key=value&key2=value2,其实和query参数一样,只是后者在请求头,前者在请求体里
  • 字符会经过URL编码
    1. 转成ASCII码
    2. 用16进制表示
    3. 每个字节前加%
    4. 如果字符不能转成ASCII码,则转成UTF-8编码,关于编码详见此处

      Eg: “中”在UTF-8编码中表示为0xE4B8AD –> %E4%B8%AD

raw

  • 一般传输图片、视频、音频
  • 表示原始未经处理的二进制数据,没有特定编码方式

body-parser

我们再说回body-parser

它支持解析urlencoded而不支持form-data

如果想要解析form-data可以使用busboy