contentType可以出现几次,contenttype可以多种么
Media Type 媒体类型(MIME Type、Content Type)
媒体类型用于声明随之而来的数据的格式。又称:MIME类型、MIME Type、Content Type。 是一种用于在异构系统、分布式网络之间声明并传递信息主体格式的方法。
一般的,在文件系统中,我们会使用扩展名来表示文件类型,例如: .exe 表示可执行文件、 .txt 表示纯文本文件、 .png 表示png编码的图片、 .mp4 表示mp4视频。这种方法,在独立系统中运行的很好。但在网络传输中并不是一个好的方法。首先扩展名并不权威,不同系统之间是有歧义的。其次扩展名的惯例是采用缩写的方式,不能准确表意。为了便于在网络中准确传递内容类型,多方组织制定出媒体类型表示方法和注册规程(Media Type Specifications and Registration Procedures : rfc6838 )。 这种方法最初用于电子邮件(MIME)的,故也称之为 MIME Type。
Media Type 的类型声明由2部分组成:大类/子类。 在册大类有10个,经常用到的 大类 有6个:text、image、audio、video、application,multipart。 子类 总计有近2000+种。
multipart大类指复合类型。表示随后的数据是由多个不同media type 的块组成,每个块可以有单独的media type声明。
对子类型要注意一点,子类声明时可以附加结构说明后缀(Structured Syntax Name Suffixes, rfc6838 4.2.8 )。例如: application/soap+xml 表示W3C Web Service报文,报文采用xml语法; application/calendar+xml 表示采用xml语法承载的icalendar报文; application/calendar+json 表示用json语法承载的icalendar报文。
主要注意的是,media type 并不仅仅能表示唯一确定类型。在网络协商时,media type支持传递通配符。 */* 表示任意类型, text/* 表示文本大类。因此,在程序中不能简单对mime type进行字符串比较。你需要考虑通配符的场景。
在实际传递媒体类型时,可以在媒体类型后面附加参数: 大类/子类;参数1=值1;……;参数n=值n 。例如: text/plain;charset=utf-8;bom=no
看到这儿你会发现对于处理 http报文头中的content-type,不能简单按照字符等于来判断,也不能简单将字符串用 / 来分割成大类子类。一个完整的mime type解析要能正确识别大类、子类、语法后缀、通配符、参数。 你可以参考: org.springframework.util.MimeTypeUtils.parseMimeTypeInternal(String) 或 javax.activation.MimeType.MimeType(String)
POST请求的几种content type类型
content-type是http请求的响应头和请求头的字段。当作为响应头时,告诉客户端实际返回的内容的内容类型。作为请求头时(post或者put),客户端告诉服务器实际发送的数据类型。
在前端开发过程中,通常需要跟后端工程师对接接口的数据格式,不同的数据类型对于服务器来说有不同的处理方式,因此我们需要关注不同的conten-type类型.
1. application/x-www-form-urlencoded
浏览器原生form表单默认的提交方式(在不设置enctype的情况下)。此时请求头的格式如下:
content-type: application/x-www-form-urlencoded;charset=utf-8
form-data: key1=val1key2=val2
此时后端例如php可以通过$_POST["key1"]的方法来获取参数值。
此种情况下:非字母或数字的字符会被进行编码(编码方式 ),这也是为什么这种方式不支持二进制数据的原因。
2. multipart/form-data
与application/x-www-form-urlencoded 的区别是她支持文件的传输,并且它的传输数据放在request-payload里,并且以bounday进行分隔。
POST /test.html HTTP/1.1
Host: example.org
Content-Type: multipart/form-data;boundary="boundary"
--boundary
Content-Disposition: form-data; name="field1"
value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"
value2
3. application/json
格式是这样的:
POST HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
它用来告诉服务端消息主体是 序列化后的 JSON 字符串 ,其中一个好处就是JSON 格式支持比键值对复杂得多的结构化数据。此时php不能直接通过$_POST获取,需要先从php://input里获得原始输入流,再json_decode成对象
4.text/plain
传统的ajax请求提交
function submit2() {
? ? var xhr = new XMLHttpRequest();
? ? xhr.timeout = 3000;
? ? var obj = {a: 1, b: 2};
? ? xhr.open('POST', '/');
? ? xhr.send(obj);
}
另外,对于axios请求,不同的请求方式content-type也不同
function submit3() {
? ? var sence1 = 'name=123val=456';
? ? var sence2 = {name: 123, val: 456};
? ? axios.post('/', sence1)
}
1. 当传递的是字符串的时候
? ??
2. 当传递的是对象的时候
? ??
总结
1.传统的ajax请求时候,Content-Type默认为"文本"类型。
2.传统的form提交的时候,Content-Type默认为"Form"类型。
3.axios传递字符串的时候,Content-Type默认为"Form"类型。
4.axios传递对象的时候,Content-Type默认为"JSON"类型
HTTP请求常见的Content-Type类型
在现在ajax库已经完善的前提下,Content-Type有哪几种类型其实无所谓,按住application/json用就完了。但是,保不齐面试要考,所以还是全面了解一下为好。
最常见的 POST 提交数据的方式,原生Form表单如果不设置 enctype 属性,默认为application/x-www-form-urlencoded 方式提交数据。
首先,Content-Type被指定为 application/x-www-form-urlencoded;其次,请求体格式是 key1=val1key2=val2 的形式,其中key 和 val 都进行了 URL 转码,就好像URL传参一样。大部分服务端语言都对这种方式有很好的支持。
不支持文件上传。
jQuery的Content-Type默认值是”application/x-www-form-urlencoded;charset=utf-8”。
另一个常见的 POST 数据提交的方式,如果 Form 表单的 enctype 设置为multipart/form-data,它的请求体的格式是:将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开,比如:
解释一下:
支持文件上传。
ajax请求的话,在 window.FormData 诞生之前无法实现, window.FormData 诞生后可以实现。
出现的较晚,但越来越流行。请求体是序列化后的 JSON 字符串,最大好处就是 JSON 格式比键值对支持复杂得多的结构化数据。
Form表单只要设置enctype为application/json就可以支持,但是也要看浏览器版本,低版本 IE 不支持这个enctype值。
ajax方面,axios默认采用application/json。
不支持上传文件。
在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的。