在看这篇文章之前请先了解一下HTTP的消息结构关于HTTP协议的消息结构
HTTP/1.1规定HTTP请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。我们一般用POST来提交数据,POST提交数据一般有四种方式。
application/x-www-form-urlencoded 方式
这是POST方法提交数据最常用的方式,浏览器的原生<form>表单如果不设置enctype属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。这种方式的消息结构大致是这样的:
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8 //请求头中设置该属性
username=xxx&password=xxx //请求体
大部分服务器端框架支持这种结构取值,我们用jquery的ajax默认也是用这种方式提交数据。
multipart/form-data 方式
这也是post提交数据的常用方式,这种方式主要用来提交文件。我们使用浏览器原生表单上传文件时,必须在<form>表单上加上 enctype="multipart/form-data"。
看一个例子:
POST /upload HTTP/1.1
Host: mapi.meishichina.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 89a49cdc-1d28-d8c8-eada-ab9b4868d94a
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
zhangsan
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="filename"; filename="idcard.jpg"
Content-Type: image/png
------WebKitFormBoundary7MA4YWxkTrZu0gW--
这个例子中提交了一个name=zhangsan的属性和filename=idcard.jpg的文件。他们被boundary分割,然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,请求的boundary是什么。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。这也是大部分服务器端框架接收文件的取值定义。
application/json 方式
这是目前比较流行的传值方式,用来告诉服务端消息主体是序列化后的 JSON 字符串。大致是这样的:
POST /login HTTP/1.1
Content-Type: application/json;charset=utf-8
{"username":"xxx","password":"xxx"}
这种方式不同于application/x-www-form-urlencoded的,请求体是json格式。可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。
text/xml 方式
这是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:
POST /handle HTTP/1.1
Content-Type: text/xml
<?xml version="1.0"?>
<method>
<methodName>login</methodName>
<params>
<param>
<username>xxx</username>
<password>xxx</password>
</param>
</params>
</method>
这种方式定义的数据结构非常的规范和明确,很适合rpc服务。像目前的微信支付的api就是这种方式。
网友评论