HTTP 协议规定 POST 提交的数据必须放在主体(entity-body)中,但协议并没有规定数据必须利用什么编码办法。

浏览器行为:Form表单提交1、form表单常用属性

1 action:url 地址,做事器吸收表单数据的地址2 method:提交做事器的http方法,一样平常为post和get3 name:最好好吃name属性的唯一性4 enctype: 表单数据提交时利用的编码类型,默认利用"pplication/x-www-form-urlencoded",如果是利用POST要求,则要求头中的content-type指定值便是该值。
如果表单中有上传文件,编码类型须要利用"multipart/form-data",类型,才能完成通报文件数据。

enctype为form表单数据的编码格式,Content-type为Http传输的数据的编码格式。
分清两者

2、浏览器提交表单时,会实行如下步骤

1 识别出表单中表单元素的有效项,作为提交项2 构建一个表单数据集3 根据form表单中的enctype属性的值作为content-type对数据进行编码4 根据form表单中的action属性和method属性向指定的地址发送数据3、提交办法

1 get:表单数据会被encodeURIComponent后以参数的形式:name1=value1&name2=value2 附带在url?后面,再发送给做事器,并在url中显示出来。
2 post:enctype 默认"application/x-www-form-urlencoded"对表单数据进行编码,数据以键值对在http要求体重发送给做事器;如果enctype 属性为"multipart/form-data",则以的形式发送给做事器。

Http协议行为:Http1.1协议

php并发post传递数据python接口主动化十post要求四种传送正文方法详解 Python

我们知道,HTTP 协议因此 ASCII 码传输,建立在 TCP/IP 协议之上的运用层规范。
规范把 HTTP 要求分为三个部分:状态行、要求头、主体。
类似于下面这样:

1 <method> <request-URL> <version> <headers> <entity-body>  

  协议规定 POST 提交的数据必须放在主体(entity-body)中,但协议并没有规定数据必须利用什么编码办法。
实际上,开拓者完备可以自己决定主体的格式,只要末了发送的 HTTP 要求知足上面的格式就可以。

但是,数据发送出去,还要做事端解析成功才故意义。
一样平常做事端措辞如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。
做事端常日是根据要求头(headers)中的 Content-Type 字段来获知要求中的主

体是用何种办法编码,再对主体进行解析。

以是说到 POST 提交数据方案,包含了 Content-Type 和主体编码办法两部分

常见的四种编码办法如下: 1、application/x-www-form-urlencoded

  这该当是最常见的 POST 提交数据的办法了。
浏览器的原生 form 表单,如果不设置 enctype 属性,那么终极就会以 application/x-www-form-urlencoded 办法提交数据。
要求类似于下面这样(无关的要求头在本文中都省略掉了):

POST http://www.example.com HTTP/1.1 Content-Type:application/x-www-form-urlencoded;charset=utf-8title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

  首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的办法进行编码,key 和 val 都进行了 URL 转码。
大部分做事端措辞都对这种办法有很好的支持。
例如 PHP 中,

$_POST[&#39;title'] 可以获取到 title 的值,$_POST['sub'] 可以得到 sub 数组。

  很多时候,我们用 Ajax 提交数据时,也是利用这种办法。
例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

2、multipart/form-data

  除了传统的application/x-www-form-urlencoded表单,我们另一个常常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。

  这又是一个常见的 POST 数据提交的办法。
我们利用表单上传文件时,必须让 form 的 enctyped 即是这个值,下面是示例

form表单:

1 <form action="/upload" enctype="multipart/form-data" method="post">2 Username: <input type="text" name="username">3 Password: <input type="password" name="password">4 File: <input type="file" name="file">5 <input type="submit">6 </form>

Http协议要求:

POST http://www.example.com HTTP/1.1Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="text"title------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="file"; filename="chrome.png"Content-Type: image/pngPNG ... content of chrome.png ...------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

  这个例子轻微繁芜点。
首先天生了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很繁芜。
然后 Content-Type 里指明了数据因此 multipart/form-data 来编码,本次要求的 boundary 是什么内容。
主体里

按照字段个数又分为多个构造类似的部分,每部分都因此 --boundary 开始,紧接着是内容描述信息,然后是回车,末了是字段详细内容(文本或二进制)。
如果传输的是文件,还要包含文件名和文件类型信息。
主体末了以 --boundary-

- 标示结束。
关于 multipart/form-data 的详细定义,请前往 rfc1867 查看。

这种办法一样平常用来上传文件,各大做事端措辞对它也有着良好的支持。

  上面提到的这两种 POST 数据的办法,都是浏览器原生支持的,而且现阶段标准中原生 <form> 表单也只支持这两种办法(通过 <form> 元素的 enctype 属性指定,默认为 application/x-www-form-urlencoded。
实在 enctype 还支

持 text/plain,不过用得非常少)。

  随着越来越多的 Web 站点,尤其是 WebApp,全部利用 Ajax 进行数据交互之后,我们完备可以定义新的数据提交办法,给开拓带来更多便利。

3、application/json

  application/json 这个 Content-Type 作为相应头大家肯定不陌生。
实际上,现在越来越多的人把它作为要求头,用来见告做事端主体是序列化后的 JSON 字符串。
由于 JSON 规范的盛行,除了低版本 IE 之外的各大浏览器都原生支持

JSON.stringify,做事端措辞也都有处理 JSON 的函数,利用 JSON 不会遇上什么麻烦。

  JSON 格式支持比键值对繁芜得多的构造化数据,这一点也很有用。
记得我几年前做一个项目时,须要提交的数据层次非常深,我便是把数据 JSON 序列化之后来提交的。
不过当时我是把 JSON 字符串作为 val,仍旧放在键值对里,以 x-

www-form-urlencoded 办法提交。

  Google 的 AngularJS 中的 Ajax 功能,默认便是提交 JSON 字符串。
例如下面这段代码

1 var data = {'title':'test', 'sub' : [1,2,3]};2 $http.post(url, data).success(function(result) {3 ...4 });

终极发送的要求是:

1 POST http://www.example.com HTTP/1.12 Content-Type: application/json;charset=utf-83 4 {"title":"test","sub":[1,2,3]}

这种方案,可以方便的提交繁芜的构造化数据,特殊适宜 RESTful 的接口。
各大抓包工具如 Chrome 自带的开拓者工具、Firebug、Fiddler,都会以树形构造展示 JSON 数据,非常友好。
但也有些做事端措辞还没有支持这种办法,例如 php 就无法通过 $_POST 工具从上面的要求中得到内容。
这时候,须要自己动手处理下:在要求头中 Content-Type 为 application/json 时,从

php://input里得到原始输入流,再json_decode成工具。
一些 php 框架已经开始这么做了。

  当然 AngularJS 也可以配置为利用 x-www-form-urlencoded 办法提交数据。
如有须要,可以参考这篇文章。

4、text/xml

  它是一种利用 HTTP 作为传输协议,XML 作为编码办法的远程调用规范。
范例的 XML-RPC 要求是这样的:

1 POST http://www.example.com HTTP/1.1 2 Content-Type: text/xml 3 4 <?xml version="1.0"?> 5 <methodCall> 6 <methodName>examples.getStateName</methodName> 7 <params> 8 <param> 9 <value><i4>41</i4></value>10 </param>11 </params>12 </methodCall>

  XML-RPC 协议大略、功能够用,各种措辞的实现都有。
它的利用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 做事等等。
JavaScript 中,也有现成的库支持以这种办法进行数据交互,能很好的支持已有的 XML-RPC 服

务。
不过,我个人以为 XML 构造还是过于臃肿,一样平常场景用 JSON 会更灵巧方便。

  比较之下,get办法的数据提交办法(编码办法)只有一种,便是application/x-www-form-urlencoding

post要求四种传送正文办法:

  (1)要求正文是application/x-www-form-urlencoded

  (2)要求正文是multipart/form-data

  (3)要求正文是raw

  (4)要求正文是binary

(1)要求正文是application/x-www-form-urlencoded

形式:

1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'application/x-www-form-urlencoded'})

  Reqeusts支持以form表单形式发送post要求,只须要将要求的参数布局成一个字典,然后传给requests.post()的data参数即可。

  可以看到,要求头中的Content-Type字段已设置为application/x-www-form-urlencoded,且d = {'key1': 'value1', 'key2': 'value2'}以form表单的形式提交到做事端,做事端返回的form字段即是提交的数据。

(2)要求正文是multipart/form-data

  除了传统的application/x-www-form-urlencoded表单,我们另一个常常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。

形式:

1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'multipart/form-data'})

  发送文件中的数据须要(安装requests_toolbelt)

from requests_toolbelt import MultipartEncoderimport requestsm = MultipartEncoder( fields={'field0': 'value', 'field1': 'value', 'field2': ('filename', open('file.py', 'rb'), 'text/plain')} )r = requests.post('http://httpbin.org/post', data=m, headers={'Content-Type': m.content_type})

  不须要文件

from requests_toolbelt import MultipartEncoderimport requestsm = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})r = requests.post('http://httpbin.org/post', data=m, headers={'Content-Type': m.content_type})

(3)要求正文是raw

形式:

♦传入xml格式文本

1 requests.post(url='',data='<?xml ?>',headers={'Content-Type':'text/xml'})

♦传入json格式文本

1 requests.post(url='',data=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})

或者:

1 requests.post(url='',json={{'key1':'value1','key2':'value2'}},headers={'Content-Type':'application/json'})

  可以将一json串传给requests.post()的data参数,

(4)要求正文是binary

形式:

1 requests.post(url='',files={'file':open('test.xls','rb')},headers={'Content-Type':'binary'})

  Requests也支持以multipart形式发送post要求,只需将一文件传给requests.post()的files参数即可。

输入:

url = 'http://httpbin.org/post'files = {'file': open('report.txt', 'rb')}r = requests.post(url, files=files)print r.text

输出:

{ “args”: {}, “data”: “”, “files”: { “file”: “Hello world!” }, “form”: {}, “headers”: {…… “Content-Type”: “multipart/form-data; boundary=467e443f4c3d403c8559e2ebd009bf4a”, …… }, “json”: null, …… }

  文本文件report.txt的内容只有一行:Hello world!,从要求的相应结果可以看到数据已上传到做事端中。
把稳:一定要把稳headers的类型。

为了方便大家在移动端也能看到我分享的博文,现已注册个人微信"大众年夜众号,扫描左下方二维码即可,欢迎大家关注,有韶光会及时分享干系技能博文。
为了方便大家互动谈论干系技能问题,现已组建专门的微信群,由于微信群满100,请您扫描右下方宏哥个人微信二维码拉你进群(请务必备注:已关注"大众号进群),欢迎大家加入这个大家庭,我们一起畅游知识的海洋。
感谢您花韶光阅读此篇文章,如果您以为这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您以为阅读本文对您有帮助,请点一下左下角“推举”按钮,您的“推举”将是我最大的写作动力!
其余您也可以选择【关注我】,可以很方便找到我!
本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/du-hong 欢迎各位转载,但是未经作者本人赞许,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留深究法律任务的权利!