HTTP请求中的Content-Type是用来指定请求或者响应的内容类型,告诉浏览器或者相关设备如何显示或处理加载的数据,此属性的值可以查看MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)的类型。
句法
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
上面列的两个Content-Type是通用的句法结构:
1)text/html,是指请求的media-type,他分为两个部分type和subtype,以“/”进行分割; 常见的type有:
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
常见的media-type有:
text/html
application/x-www-form-urlencoded
application/json
multipart/form-data
application/xml
text/plain
text/css
text/javascript
2)charset:是指定字符编码的标准,常见的有"ISO-8859-1"、"UTF-8"、"GB2312“,”ASCII“等;
3)boundary:多用于上传文件时使用,用于分割数据;
几种常见的Content-Type
application/x-www-form-urlencoded
application/x-www-form-urlencoded主要用于表单形式的POST请求中,如普通的表单提交,或者js发包,默认都是通过这种方式,可以使用Postman来发一个这种类型请求:
这是一个添加购物车的请求,如上图,在body部分我们传入form表单的Key/Value对,得到添加成功的JSON响应。
如果在如果对请求抓包可以看到request头部信息如下
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Connection:keep-alive
Content-Length:90
Content-Type:application/x-www-form-urlencoded
body的内容如下:
Form Data:number=1&goodsId=1405140&skuId=1405140-68a3e5516d7a7dc21fbe0e7ee13bfc1c&innerSource=DETAIL
application/json
application/json是POST请求以JSON的格式向服务请求发起请求或者请求返回JSON格式的响应内容,服务端接受到数据后对JSON进行解析拿到所需要的参数,同样适用Postman模拟一个请求:
上面发送一个修改购物车的请求,如上图,可以看到请求发送的body是一个JSON串,其实也就是一串字符串指定用JSON的方式去进行解析,application/json是用的比较多的请求body中的传参方式。
对上述请求抓包看到的request头部信息如下
Accept:application/json
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Connection:keep-alive
Content-Length:212
Content-Type:application/json
body的内容如下:
{"comboId":" ","goodsList":[{"goodsId":1372308,"skuId":"1372308-228f0bba1bd1b7241353429cebd7c88b","isHuanGou":0,"selected":1,"count":2,"cartGoodsType":0,"activitySchemeId":111873,"goodsActivityGiftListTemp":[]}]}
multipart/form-data
multipart/form-data是使用POST请求上传文件,如果上传照片,文件等,由于很多情况下都会有批量上传,为了区分不同的数据,multipart/form-data的类型有boundary参数进行分割,对上传文件请求抓包,request头部信息如下:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:max-age=0
Content-Length:352
Content-Type:multipart/form-data; boundary=----WebKitFormBoundary6vbO2Ze9EuGIrtTA
body内容如下:
------WebKitFormBoundary18bktajg65CSIx4j
Content-Disposition: form-data; name="files"; filename="test1.txt"
Content-Type: text/plain
this is file1;
------WebKitFormBoundary18bktajg65CSIx4j
Content-Disposition: form-data; name="files"; filename="test2.txt"
Content-Type: text/plain
this is file2;
------WebKitFormBoundary18bktajg65CSIx4j--
上面请求是上传了两个文件,分别是test1.txt和test2.txt,文件内容分别是“this is file1;”和“this is file2;”可以看到两个文件由于是文本,Content-Type为text/plain,Content-Disposition中包含name和filename属性,name是form表单提交内容里的name属性,文件之间有“------WebKitFormBoundary18bktajg65CSIx4j”这样一串字符隔开,这串字符就是boundary分割符,字符串随机生成不会与文本内容重复。
上面介绍了几个常见的Content-Type,平时在测试过程中需要写脚本模拟HTTP请求,一定要注意填充headers信息时要保证Content-Type与请求抓包时保持一致,否则就有可能出现你发送的内容是form表单,但是以JSON的形式解析,这样结果肯定就会出错了。