HTTP请求常见的Content-Type类型

前言

在现在ajax库已经完善的前提下,Content-Type有哪几种类型其实无所谓,按住application/json用就完了。但是,保不齐面试要考,所以还是全面了解一下为好。

application/x-www-form-urlencoded

最常见的 POST 提交数据的方式,原生Form表单如果不设置 enctype 属性,默认为application/x-www-form-urlencoded 方式提交数据。

首先,Content-Type被指定为 application/x-www-form-urlencoded;其次,请求体格式是 key1=val1&key2=val2 的形式,其中key 和 val 都进行了 URL 转码,就好像URL传参一样。大部分服务端语言都对这种方式有很好的支持。

不支持文件上传。

jQuery的Content-Type默认值是”application/x-www-form-urlencoded;charset=utf-8”。

multipart/form-data

另一个常见的 POST 数据提交的方式,如果 Form 表单的 enctype 设置为multipart/form-data,它的请求体的格式是:将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开,比如:

POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575

---------------------------974767299852498929531610575
Content-Disposition: form-data; name="description"

some text
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt"
Content-Type: text/plain

(content of the uploaded file foo.txt)
---------------------------974767299852498929531610575--

解释一下:

  1. 首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。

  2. 然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,本次请求的 boundary 是什么内容。

  3. 消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。

  4. 如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。

支持文件上传。

ajax请求的话,在window.FormData诞生之前无法实现,window.FormData诞生后可以实现。

application/json

出现的较晚,但越来越流行。请求体是序列化后的 JSON 字符串,最大好处就是 JSON 格式比键值对支持复杂得多的结构化数据。

Form表单只要设置enctype为application/json就可以支持,但是也要看浏览器版本,低版本 IE 不支持这个enctype值。

ajax方面,axios默认采用application/json。

不支持上传文件。

application/octet-stream

在Chrome浏览器的Postman工具中,还可以看到”binary“这一类型,指的就是一些二进制文件类型。如application/pdf,指定了特定二进制文件的MIME类型。就像对于text文件类型若没有特定的子类型(subtype),就使用 text/plain。类似的,二进制文件没有特定或已知的 subtype,即使用 application/octet-stream,这是应用程序文件的默认值,一般很少直接使用 。

对于application/octet-stream,只能提交二进制数据,而且只能提交一个二进制数据,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组)。

很多web服务器使用默认的 application/octet-stream 来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。一般来说,设置正确的MIME类型很重要。

即便是只上传一个文件,实践中也通常不用application/octet-stream,毕竟现在的浏览器没有不支持form-data的。

总结

x-www-form-urlencodedform-datajsonoctet-stream
请求体键值对boundary格式字串JSON字串二进制
上传文件不支持支持不支持支持
使用场合上传简单文本文件、文本混传复杂结构文本只传文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值