Content-Type 详解

Content-Type 详解,第1张

Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于区分数据类型。最初MIME是用于电子邮件系统的,后来HTTP也采用了这一方案。

在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。

Content-Type:type/subtype parameter

例如:

Content-Type: text/html

Content-Type: application/jsoncharset:utf-8

常见的Content-Type有数百个,下面例举了一些

上面的Content-Type,我们只认得就好,但是下面有4种是需要我们清楚他们的区别及牢记在心的。

HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/"、","、“:" 等会自动进行URL转码。不支持文件,一般用于表单提交。

下面是一个例子:

与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。

下面是一个例子:

JSON 是一种轻量级的数据格式,以“键-值”对的方式组织的数据。这个使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。

与application/json类似,这里用的是xml格式的数据,text/xml的话,将忽略xml数据里的编码格式, 参考 。

一般我们在开发的过程中需要注意客户端发送请求(Request)时的Content-Type设置,特别是使用ajax的时候,如果设置得不准确,很有可能导致请求失败。比如在spring中,如果接口使用了@RequestBody,spring强大的自动解析功能,会将请求实体的内容自动转换为Bean,但前提是请求的Content-Type必须设置为application/json,否正就会返回415错误。

注:415 错误是 Unsupported media type,即不支持的媒体类型。

建议:

服务端响应(Response)的Content-Type最好也保持准确,虽然一般web开发中,前端解析响应的数据不会根据Content-Type,并且服务端一般能自动设置准确的Content-Type,但是如果乱设置某些情况下可能会有问题,比如导出文件,打开图片等。如果在spring项目里使用@ResponseBody,spring会将响应的Content-Type设置为application/jsoncharset=UTF-8,可能会导致文件无法导出,需要注意下。

response的Content-Type设置建议:

下面的一个设置response的Content-Type的例子:

参考

《HTTP 权威指南》

什么是json

常见的Content-Type

application/xml 和 text/xml的区别

postman里的Content-Type

Content type设置utf杠八,想要设置这些的话,你就必须把电脑打开,打开以后把你的页面给打开,打开以后把你的content type这个给打开,打开以后再进行一点设置,点完设置以后就可以设置utf杠八了,所以你要把你的设备打开才可以设设置utf杠八

值得一提的是 :get请求的headers中没有content-type这个字段,因为get请求不存在请求实体部分,键值对参数放置在 URL 尾部,因此请求头不需要设置 Content-Type 字段。

有的时候服务器接受不到传值,可以先确认下服务器接受的编码类型。

headers 设置 { ‘content-type’: ’application/x-www-form-urlencoded’ }:代表参数以 键值对字符串 传递。

headers 设置 { ‘content-type’: ’application/json’ }:代表参数以 序列化后的json字符串 传递(json形式的优点是它可以传递结构复杂的数据形式,比如对象里面嵌套数组这样的形式等)。

当 content-type 为 multipart/form-data 时,既可以 上传二进制数据 ( 例如图片、mp3、文件 ),也可以 上传键值对 。(因为它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开)

此时的传输数据的body必须是FormData的实例,然后通过append方法添加参数。

let formData = new FormData()

formData.append("parameter", "value")

额外提一个小点

默认情况下,axios将JavaScript对象序列化为JSON,所以要以application / x-www-form-urlencoded格式发送数据时,可以引入qs库编码数据( CDN )。

JSON.stringfy() 和 qs.stringfy() 的区别:

再提一个与内容无关的点:

关于跨域,现在基本上不会由前端用jsonp去解决,因为jsonp很明显的弊端是只能get请求,不能进行较为复杂的post和其它请求。现在基本都是服务器实现CORS接口来解决。(可以看下阮一峰的 跨域资源共享 CORS 详解 )


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11005740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存