contenttype默认类型,contenttype响应类型
文档的内容类型(ContentType)
文/桂浮云,2020年2月12日
参考文献: ECMA 376(第五版)
Office Open XML格式的.docx文档,可以理解为一个Zip压缩包。最小的文档压缩包之中,应当至少包含3部分内容:1.ContentType定义;2.关系定义;3.主文档内容定义。
既然文档是一个压缩包(Package),我们就应该知道其中必然包含了若干被压缩的文件,这些被压缩的文件可以称之为为文档包的片段(part)。
在这些片段(或者说被压缩的文件之中),有一个定义包中其他文件内容类型(ContentType)的文件很关键,物理上,它是存储于文档压缩包(Package)内根目录的[Content_Types].xml的片段文件。
既然扩展名是.xml,所以,它是以XML语言编写的,需要通过相关的Xml库进行读写。从文件内容来看,它以Types为根节点,主要包含Default和Override两种子节点。
用于定义默认内容类型,定义了与文件扩展名对应的内容类型。XML格式为Default Extension="扩展名" ContentType="内容类型" /。注意,这里的扩展名不带英文小数点(.)。
用于定义与具体片段文件对应的内容类型。XML格式为:Override PartName="片段文件物理存储路径" ContentType="内容类型" /。
[Content_Types].xml片段文件内容,必须至少指定 两类ContentType 。 其一,用于指定存储主文档内容的片段文件 , 其二,用于指定各种包与片段、片段与片段的关系 。
此种ContentType作用比较容易理解,主要是为了通过指定的ContentType,方便查找存储实际文档内容的片段文件。通过ECMA376的示例与实际情况对比来看,有ContentType相同,主文档片段文件物理存储位置不同的情况。
主文档片段的ContentType通常为 application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml,没有发现不同;但在包(Package)中的物理存储路径有位置不同的情况,有的放在了包(Package)的根目录,有的放在了word目录之下。所以建议由ContentType确定主文档片段文件的存放位置。
此种ContentType,通过Override节点获取对应的信息,形式大致如下:
Override PartName =" word/document.xml " ContentType =" application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml " /
再次提醒, 主文档片段文件的PartName可能存在变化,ContentType相同 。或参考ECMA-376的相关说明。
无论是哪种关系,这种关系同样以包(Package)内片段(part)文件的形式存在,关系文件的扩展名通常为rels。其中,包与片段之间的关系,我们可以称之为 包级关系 ,对于整个docx文件而言,是必须的;片段与片段之间的关系,称之为 片段级关系 ,根据实际需要确定,所以,不一定存在。
根据上面的描述,我们可以猜想到,在实际的文档打包中,并关系文件不唯一。因此,关系文件的ContentType通常由Default子节点定义,或者更应该说,关系文件的扩展名通常由特定的ContentType指定。形式大致如下:
Default Extension =" rels " ContentType =" application/vnd.openxmlformats-package.relationships+xml " /
不过,包级关系文件的位置是固定的,为/_rels/.rels,实际是以Relations为根节点的XML文件。包级关系文件必须隐含指定包与存储主文档片段文件的 关系 ,以及视需要而存在的与原始数字签名、文件属性片段文件、缩略图等之间的 关系 。
(续见: 文档的关系定义
)
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的。
content-type的类型是什么?
Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。
类型:
ContentType的
".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"