请求头content-type,http请求头
请求头Content-Type
这是我第9篇。
你们在使用Postman时,搞清楚下面这几个是干啥的吗
接下来介绍4个常用的类型。
上图的 form-data 就是指的 multipart/form-data
这是一个多部分多媒体类型,它是一个常见的 POST 数据提交的方式,它会生成了一个 boundary 用于分割不同的字段。它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。 既可以上传键值对,也可以上传文件。 当上传的字段是文件时,会有Content-Type来说明文件类型。
注意,当使用表单上传文件时,必须让 form 的 enctype 等于这个值。
上图的 x-www-form-urlencoded 就是指的 application/x-www-form-urlencoded
一般用于 表单提交 ,会将请求参数用 key1=val1key2=val2 的方式进行组织和编码,key 和 val 都进行了 URL 转码,并放到请求实体里面(注意如果是中文或特殊字符如"/"、","、“:" 等会自动进行URL转码)。
最常用的。使用这个类型,提交的是序列化后的 JSON 字符串,服务端/客户端会按json格式解析数据
即传递XML格式,在以前比较常用,不接触老的项目应该用不到。
上图 binary 指的是 application/octet-stream 。
Content-Type为 application/octet-stream 时,只可上传二进制数据,通常用来上传文件,没有键值,一次只能上传一个文件。
http请求中的content-type
Content-Type属性指定请求和响应的 HTTP 内容类型。如果未指定 ContentType,默认响应的内容类型为 text/html ,默认请求的内容类型为 application/x-www-form-urlencoded 。Content-Type一般只存在于Post方法中,因为Get方法是不含“body”的,它的请求参数都会被编码到url后面,所以在Get方法中加Content-type是无用的。
在 nginx 中有个配置文件 mime.types ,主要是标示 Content-Type 的文件格式。
下面是几个 常见的 Content-Type :
application/x-www-form-urlencoded 是常用的表单发包方式,普通的表单提交,或者 js 发包,默认都是通过这种方式,数据被编码为key/value格式发送到服务器。
multipart/form-data 用在 发送文件的POST包 。
Multipart/form-data的请求头必须包含一个特殊的头信息 : Content-Type , 且其值也必须规定为multipart/form-data , 同时还需要规定一个 内容分割符 即 boundary 用于分割请求体中的多个POST的内容 , 如文件内容和文本内容自然需要分割开来 , 不然接收方就无法正常解析和还原这个文件了。
text/xml 微信用的是这种数据格式发送请求的。XML-RPC(XML Remote Procedure Call)是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。
application\json HTTP通信中并不存在所谓的json,而是将string转成json罢了,也就是,application/json可以将它理解为text/plain,普通字符串。
application\xml XML数据格式
MDN Content-Type
理解HTTP之Content-Type
四种常见的POST提交数据方式
接口中的 Content-Type 介绍
接口文档中我们经常见到 content-type,这是什么呢?它有哪些值,这篇文章给大家解答。
接口发送参数、接收响应数据,都需要双方约定好使用什么格式的数据,例如 json、xml。
只有双方按照约定好的格式去解析数据才能正确的收发数据。
而 Content-Type 就是用来告诉你数据的格式,这样我们才能知道怎么解析参数。
如下图,我们可以看到接口的请求头和响应头中都有 Content-Type.
application/json :JSON数据格式,现在非常流行的格式
application/x-www-form-urlencoded :很常见的一种数据格式,post请求中通常默认是这个
multipart/form-data :上传文件时我们需要用到这个格式
application/xml :XML数据格式
text/html :HTML格式
text/plain :纯文本格式
image/png :png图片格式
这个格式会用=号连接参数名和参数值,并且会经过urlencode编码。
例如: title=testsub%5B%5D=1sub%5B%5D=2sub%5B%5D=3
我们来看下 Chrome 中的请求参数(查看时需要点击view source才能看到原始数据,否则是经过解析后的),如下图,我们传递了 username 和 password 两个参数,可以看到他们是用=拼接参数和值,用号拼接多个参数
这个格式会在多个参数之前插入一段分隔字符,如下图,我们传递了 page 和 pageSize 两个参数,他的分隔字符串在 Content-Type 中用 boundary 标明了,这样服务端解析的时候才知道怎么拆分参数。
还有更多数据格式,我们就不再举例了,有兴趣的可以直接打开浏览器的开发者工具,直接查看到他们的数据(记得要切换到view source)
HTTP 请求头中的Content-Type类型
在开发中,当前端要 POST 发送数据到后端时,通常需要注意设置请求头 header 中的 Content-Type 类型。
Content-Type 的作用是让服务器端对 post 请求中请求体 entity body 中的数据进行解码,获取到对应的数据格式。
HTTP 中的 post 请求使用最多的Content-Type 类型是: application/json。
Content-Type 的几种常见类型有:
下面将分别对他们进行讲解:
最常见的 POST 提交数据的方式,原生Form表单,如果不设置 enctype 属性,默认为application/x-www-form-urlencoded 方式提交数据。
一个常见的 POST 数据提交的方式, Form 表单的 enctype 设置为multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开。
它既可以上传键值对,也可以上传文件,甚至多个文件。当上传的字段是文件时,会有Content-Type来说明文件类型;Content-disposition,用来说明字段的一些信息。每部分都是以 –boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、文本或二进制等)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。
用来告诉服务端消息主体是序列化后的 JSON 字符串,其中一个好处就是JSON 格式支持比键值对复杂得多的结构化数据。
提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据
用来传输二进制文件类型
http请求头content-type类型常见值
通常HTML网页中这样写:meta content-type="text/html;charset=utf8"
可以看到我们经常用到请求头的媒体类型是text/html。
另外,常见媒体类型:
1、text/html: HTML格式。(返回HTML文本)
2、text/plain :纯文本格式。(返回的是纯文本) ? ? ?
3、text/xml :XML格式。(返回XML文本)
4、image/gif :gif图片格式。 (返回图片) ??
5、image/jpeg :jpg图片格式。?(返回图片)
6、image/png:png图片格式。(返回图片)
以application开头的媒体类型:
7、application/x-www-form-urlencoded : form encType=""中默认的提交数据的方式,如果省略的话就是这种方式。表单的数据会被编码为key/value格式发送到服务器。
8、multipart/form-data : 在表单中上传文件时,设置这种类型。(在表单中经常使用,它不是application开头的)。
9、application/xml:返回xml数据格式
10、application/json:返回json数据格式。
11、application/pdf: 返回pdf格式。
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"类型