HTTP之Content-Type小结

猪小花1号2018-09-17 13:24

作者:牛小宝


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的形式解析,这样结果肯定就会出错了。



网易云产品免费体验馆无套路试用,零成本体验云计算价值。  

本文来自网易实践者社区,经作者牛小宝授权发布