注意, 这是一篇摘抄文, 仅记录一些概念跟规范
HTTP介绍
我们知道, HTTP协议通过ASCII码的形式进行传输, 是建立在TCP/IP协议之上的应用层协议, HTTP/1.1协议中规定的请求方式有八种: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNET. 其中通过POST提交的表单的方式最为常见.
HTTP/1.1协议规定将一个完整的HTTP请求分为三个部分, 请求行, 请求头和请求主体, 大概框架如下:
1 | <method> <request-URL> <version> |
POST请求
协议规定POST请求的数据必须放在请求主体中, 但是并没有说明提交的数据必须用数目编码方式, 所以我们完全可以自定义编码方式. 只要格式满足以上协议的格式即可.
由于编码方式可以自定义, 在CS架构中, 服务器不可能提前知道客户端的编码方式,所以服务器可以成功解析数据的前提就是通过某个字段告诉服务端客户端发送数据时所使用的编码方式, 这个字段就是Content-Type
在POST请求中, Content-Type和body是最重要的两个数据.
POST请求编码方式
application/x-www-form-urlencoded
浏览器原生form表单, 如果不设置enctype, 最终提交数据时所用的就是这种编码方式. 这应该是最常见的编码方式了, 由于浏览器原生支持, 所以用途最广泛.
Content-Type字段被设置为application/x-www-form-urlencoded, body数据为key/value的形式, 通过URL编码后使用&符号进行连接. 大部分的服务端都可以支持这种编码方式, 好多客户端(指编程语言, 不包括浏览器)的默认编码方式也是这个.
1 | POST http://httpbin.org HTTP/1.1 |
mutipart/form-data
这个是通过浏览器上传文件时所用的编码方式, 在使用浏览器上传文件时, 须将form表单的enctype字段设置为multipart/form-data
这种编码方式的请求体比较长,因为包含了文件数据,通过 boundary 来分割不同字段的数据。
关于此类表单的详细信息可以查看 rfc1867。
application
由于 JSON 规范的流行,越来越多的人开始使用这种编码方式,这种编码方式可以提交比较复杂的结构化数据,方便各种类型的数据交互。
1 | POST http://httpbin.org HTTP/1.1 |
在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json。
data与json既可以是str类型,也可以是dict类型。
区别:
- 不管json是str还是dict,如果不指定headers中的content-type,默认为application/json
- data为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式
- data为str时,如果不指定content-type,默认为text/plain
- json为dict时,如果不指定content-type,默认为application/json
- json为str时,如果不指定content-type,默认为application/json
- 用data参数提交数据时,request.body的内容则为a=1&b=2的这种形式,用json参数提交数据时,request.body的内容则为’{“a”: 1, “b”: 2}’的这种形式