HTTP协议中的Content-Type

对于HTTP协议来说,好多不是计算机网络专业的朋友来说不是很熟悉,特别是针对其中的一些语法也感觉莫名其妙,其实HTTP协议中也是有一定的语法规则的(其实就是一些硬性规定,比如我们日常生活中自然语言的一些规定:好样的的是褒义词,笨蛋是贬义词),Content-Type就是HTTP协议中用来规定一些文件类型的,传输过程中根据设置好的Content-Type就可以知道要处理的内容是什么类型...

jesen
1
2020-03-18 08:06:30
文档目录
我的书签
 

常用的Content-Type

一、application/x-www-form-urlencoded
主要用于form表单中,<form enctype=""> 中默认的enctype,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式),一般用于简单的数据(键值对的数据结构,数据被编码成以 '&' 分隔的键-值对, 同时以 '=' 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因)进行传输;很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 的Ajax,Content-Type 默认值就是 [application/x-www-form-urlencoded;charset=utf-8]
 
二、application/json
主要用于POST请求以JSON的格式向服务发起请求,或者服务器向客户端返回JSON格式的内容进行响应,服务端接收到数据后对JSON进行解析拿到所需要的数据。现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于JSON规范的流行,除了低版本IE 之外的各大浏览器都原生支持JSON.stringify,服务端语言也都有处理JSON的函数,使用 JSON已经可以一路畅通了

JSON 格式支持比键值对复杂得多的结构化数据,这一点也非常有用,当需要提交比较复杂的数据结构的时候,比如多层数据的嵌套就可以利用json很好地解决了
以下是利用jQuery的ajax来发送json请求的代码:
$.ajax({
     method:"post",
     url:"http://www.w3capi.com/test",
     contentType:"application/json;charset=utf-8",
     data:{
         'title':'test',
         'sub' : [1,2,3]
     }
});

最终发送请求的格式为:

POST http://www.w3capi.com/test HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
使用json,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口;各大浏览器如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,需要从 php://input 里获得原始输入流,再 json_decode 成对象。一些 php 框架已经开始这么做了 

三、multipart/form-data

在表单中进行文件上传时,就需要使用该格式,如下:
<form action="/Index/test" enctype="multipart/form-data" method="post">
    <input type="file" name="file_data" />
    <input type="submit" value="测试提交" />
</form>
生成的HTTP请求为:
POST http://www.w3capi.com/Index/test HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryusAwgDgO8X0WGuvH
------WebKitFormBoundaryusAwgDgO8X0WGuvH 
Content-Disposition: form-data; name="file_data"; filename="test_img.jpg" 
Content-Type: image/jpeg 

------WebKitFormBoundaryusAwgDgO8X0WGuvH--

根据请求可以看到,在Content-Type中声明了内容的类型为multipart/form-data,而后紧跟 boundary 参数的值 用于分割不同的字段,为了避免与正文内容重复,消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 ------boundary值 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 ------boundary值 结束。关于 mutipart/form-data 的详细说明,请前往 RFC1867 查看。
 

友情提示