上一小节中,我么已经掌握了requests发送get请求的方法,本小节我们讲解一下requests的post请求的使用方法。
首先我们需要了解一下requests.post方法的源码,代码如下:
def post(url, data=None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request("post", url, data=data, json=json, **kwargs)
上图所示post方法有4个入参,1个return函数,返回一个request方法的调用。
url:代表接口请求的url
data: 一般代表表单数据即字典格式,也可以是json/xmL等文本格式
json: 请求数据为json格式
**kwargs:代表接口请求可选参数,是一种key-value键值对参数,比如在接口请求中添加请求头信息headers="xxxx"
HTTP 协议规定 post请求提交的数据必须放在消息主体中,而post请求正文的传送方式有以下4种类型:
(1)application/x-www-form-urlencoded
(2)multipart/form-data
(3)raw
(4)binary
接下来我们针对以上四种类型,分别举例子来讲解。
(1)请求正文是application/x-www-form-urlencoded
这种类型实际上是以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可,示例如下
# 导入 requests包
import requests
url = "https://httpbin.org/post"
# 设置请求头
headers = {'Content-Type':'application/x-www-form-urlencoded'}
r = requests.post(url=url,data={'key1':'value1','key2':'value2'},headers=headers)
print(r.text)
(2)请求正文是multipart/form-data
除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data,示例如下
# 需提前安装requests_toolbelt库, pip install requests_toolbelt
from requests_toolbelt import MultipartEncoder
# 导入 requests包
import requests
# 需要上传文件,如本地的file.py文件
m = MultipartEncoder(
fields={'field0': 'value', 'field1': 'value',
'field2': ('filename', open('file.py', 'rb'), 'text/plain')}
)
r_file = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})
print(r_file.text)
# 不需要文件
m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})
r = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})
print(r.text)
(3)请求正文是raw
raw代表上传任意格式的文本,可以上传text、json、xml、html等,示例如下
import json
import requests
url = "https://httpbin.org/post"
# 设置请求头
headers = {'Content-Type': 'text/xml'}
# 传入xml格式文本
r_xml = requests.post(url=url, data='<?xml ?>', headers=headers)
print(r_xml.text)
# 传入json格式文本,有两种方法,1、使用data,2、使用json参数
# 使用data参数
r_data = requests.post(url=url,data=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})
print(r_data.text)
# 使用json参数
r_json = requests.post(url=url,json=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})
print(r_json.text)
(4)请求正文是binary
binary也常用文件上传接口,它和multipart/form-data上传文件的区别是,binary一次只能上传一个文件,multipart/form-data可以上传多个,还有binary使用的是files参数,示例如下
import requests
url = "https://httpbin.org/post"
# 设置请求头
headers = {'Content-Type': 'text/xml'}
# 比如上传本地文件file.py,使用files参数
r = requests.post(url=url, files={'file': open('file.py', 'rb')}, headers={'Content-Type': 'binary'})
print(r.text)
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!