Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
使用requests我们可以方便的进行发送网络请求。
requests 是Python的一个第三方工具包、需要进行自行下载才能使用。它的底层其实就是urllib、requests是urllib的高级封装版本。
官方文档
http://cn.python-requests.org/zh_CN/latest/
安装
pip install requests
检查安装
pip show requests

基础方法
请求方式

方法 | 描述 | 示例 |
requests.get() | 用于发送get请求 | 发送的是查询 |
requests.post() | 用于发送post请求 | 用于创建数据 |
requests.delete() | 用于发送delete请求 | 用于删除数据 |
requests.patch() | 用于发送patch请求 | 用于部分修改数据 |
requests.put() | 用于发送put请求 | 用于修改数据 |
requests.head() | 用于·发送head请求 | 不常用 |
requests.options() | 用于发送options请求 | 不常用 |
get()
我们使用cms端的查询用户列表接口来进行演示:
import requests
url = "http://127.0.0.1:8000/api/cms/get/userList"
# url进行传入需要发起http请求的资源路径
resp = requests.get(url=url)
print(resp)
# 输出的是一个requests的实例对象
#>>> <Response [200]>
我们可以使用它的实例对象进行一些如下操作:
response
方法 | 描述 | 示例 |
resp.url | 获取响应的url | |
resp.status_code | 获取请求的响应状态码 | |
resp.headers | 获取响应header | |
resp.elapsed | 获取请求的响应时间 | |
resp.encoding | 获取响应的编码格式 | |
resp.is_redirect | 是否为重定向 | |
resp.is_permanent_redirect | 是否为永久重定向 | |
resp.ok | 是否响应成功 | |
resp.text | 获取响应文本 | 字符串 |
resp.content | 获取响应内容 | 字节类型 |
resp.json() | 获取响应数据以反序列化形式返回 | 字典类型 dict |
import requests
url = "http://127.0.0.1:8000/api/cms/get/userList"
# url进行传入需要发起http请求的资源路径
resp = requests.get(url=url)
print("url===>",resp.url)
print("status_code===>",resp.status_code)
print("headers===>",resp.headers)
print("elapsed===>",resp.elapsed)
print("encoding===>",resp.encoding)
print("is_redirect===>",resp.is_redirect)
print("is_permanent_redirect===>",resp.is_permanent_redirect)
print("ok===>",resp.ok)
print("text===>",resp.text)
print("content===>",resp.content)
print("json===>",resp.json())
url===> http://127.0.0.1:8000/api/cms/get/userList
status_code===> 200
headers===> {'Date': 'Wed, 11 Aug 2021 10:14:55 GMT', 'Server': 'WSGIServer/0.2 CPython/3.9.2', 'Content-Type': 'application/json', 'Allow': 'GET, HEAD, OPTIONS', 'X-Frame-Options': 'DENY', 'Content-Length': '59', 'Vary': 'Cookie', 'X-Content-Type-Options': 'nosniff', 'Referrer-Policy': 'same-origin'}
elapsed===> 0:00:00.002756
encoding===> utf-8
is_redirect===> False
is_permanent_redirect===> False
ok===> True
text===> {"code":1,"message":"Token不能为空","messageCode":2005}
content===> b'{"code":1,"message":"Token\xe4\xb8\x8d\xe8\x83\xbd\xe4\xb8\xba\xe7\xa9\xba","messageCode":2005}'
json===> {'code': 1, 'message': 'Token不能为空', 'messageCode': 2005}
request
方法 | 描述 | 示例 |
resp.request.url | 获取请求的url | |
resp.request.headers | 获取请求的headers | |
resp.request.body | 获取请求的body | |
resp.request.method | 获取请求的方法 |
import requests
url = "http://127.0.0.1:8000/api/cms/get/userList"
# url进行传入需要发起http请求的资源路径
resp = requests.get(url=url)
print("url===>",resp.request.url)
print("headers===>",resp.request.headers)
print("body===>",resp.request.body)
print("method===>",resp.request.method)
url===> http://127.0.0.1:8000/api/cms/get/userList
headers===> {'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body===> None
method===> GET
请求参数
我们请求用户查询接口时返回给我们的是我们需要传入一个token参数

我们可以使用 params 参数进行传递参数给接口、需要有key=val
import requests
url = "http://127.0.0.1:8000/api/cms/get/userList"
# url进行传入需要发起http请求的资源路径
data = {"token":""}
resp = requests.get(url=url,params=data)
print(resp.json())
我们已经看到后台终端已经接收到了一个请求参数为token的响应、但没有值我们传递的时候本身就是没有给值所以这是正常的、token需要进行登录我们下面讲解post请求使用在进行登录接口演示

post()
请求与响应与get方法一样
这里我们使用登录接口进行演示
post 传递的参数都是在body里面因此我们需要使用 data参数进行做post请求的数据传递
import requests
url = "http://127.0.0.1:8000/api/cms/login/"
# url进行传入需要发起http请求的资源路径
data = {
"username":"admin",
"password":"admin"
}
resp = requests.post(url=url,data=data)
print(resp.json())
{
'code': 0,
'data': {
'id': '1',
'token': 'MTYyODY5NTg3NC4zNjMzNzc6NTExODk2NmQzZGU4NzM2M2I1ZjczZDM2MzE1MmI0YmZjMzQyODg2OQ==',
'userInfo': [
{
'username': 'admin',
'nickname': '1',
'sex': 0,
'age': 0,
'phone': '123456',
'role': 'admin',
'introduce': None,
'signin': None,
'email': None,
'tag': None,
'createTime': None,
'updateTime': None,
'deleteTime': None,
'recentlyLoginTime': '1628677874',
'recentlyLoginSite': None,
'ip': '26.26.26.1',
'status': None,
'isDelete': None,
'isShow': None,
'create_by': None,
'picturePath': None
}
]
},
'messageCode': 2000
}
好我们拿到了登录的数据、进行对数据处理我们要拿到token的值
import requests
# url = "http://127.0.0.1:8000/api/cms/get/userList"
url = "http://127.0.0.1:8000/api/cms/login/"
# url进行传入需要发起http请求的资源路径
data = {
"username":"admin",
"password":"123456"
}
resp = requests.post(url=url,data=data).json()
# 因为已经反序列化了无需去处理json数据格式转换
print(resp["data"]["token"])
>>> MTYyODY5NjE3My45MDIyNDI6MDMyMThkM2ViNmE2Y2ZlZDY3MTEwYWY5NmI3Y2YwNjc1NzcxYjc1Yw==
拿到token了我们继续回到get请求方法、查询用户列表接口
url = "http://127.0.0.1:8000/api/cms/get/userList"
data = {
"Token":resp["data"]["token"]
}
resp = requests.get(url=url,params=data).json()
print(resp)
>>> {'code': 1, 'message': 'Token不能为空', 'messageCode': 2005}
我们已经看到其实已经传递token给后端接口了、为什么还是提示我们token为空?

其实我们可以去看看接口token的参数类型就知道了、发现是个header、需要是请求header那我们看到不能使用参数的形式给后台了。

需要使用 headers参数将数据传递进去
url = "http://127.0.0.1:8000/api/cms/get/userList"
data = {
"Token":resp["data"]["token"]
}
resp = requests.get(url=url,headers=data).json()
print(resp)
请求正常了

cookies 操作
方法 | 描述 | 示例 |
response.cookies.get() | 获取一个cookie值 | |
response.cookies.keys() | 获取所有cookie的name | |
response.cookies.values() | 获取所有cookie的name对应的value | |
response.cookies.get_dict() | 获取一个完整的cookie键值字典 | |
RequestsCookieJar.set_cookie() | 写入一个cookie |
由于我们的接口没有涉及到cookie、我们首先来写入一个cookie
resp = requests.post(url=url,data=data)
print(resp.cookies.set("app",1168))
print(resp.cookies.get("app"))
>>> <Cookie app=1168 for />
>>> 1168
# 获取所有键
print(resp.cookies.keys())
>>> ['app']
# get 按照key获取对应的值
print(resp.cookies.get("app"))
>>> {'app': 1168}
# get_dict 获取字典类型
print(resp.cookies.set("app",1168))
print(resp.cookies.set("data","接口自动化测试"))
print(resp.cookies.values())
>>> [1168, '接口自动化测试']
Session 对象
Session 是一个线程安全的连接池, 它的作用是维护一个cookie集合, 帮你保留你所有请求痕迹(即所有服务器set-cookie的数据), 通过这种方式可以让你无间断地进行数据交互(而不是每个请求都需要单独认证一次!).
Session 的使用方法跟requests基本保持一致, 同时支持多线程并发请求, 因为它是线程安全的连接池(会话池)
from requests import sessions
session = sessions.Session()
url = "http://127.0.0.1:8000/api/cms/get/userList"
header = {
"Token": "MTYyODg0MjU0MC4xMzM5NTQ1OjA5NWUzMTRkM2ExNTk1ZTMwNmZkNWZjYTM3MzZjYTgwNTBhYWM0NWU="
}
response = session.get(url,headers=header)
print(response.json())
其他具体操作与requests一样。。。
二进制文件下载与上传
使用 Response.iter_content 将会处理大量你直接使用 Response.raw 不得不处理的。当流下载时,上面是优先推荐的获取内容方式。Note that chunk_size can be freely adjusted to a number that may better fit your use cases.
我们找一个在线图片路径
url = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbpic.588ku.com%2Felement_origin_min_pic%2F16%2F07%2F06%2F17577cd55945262.jpg%21r650&refer=http%3A%2F%2Fbpic.588ku.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631417225&t=a7b4d26d5cee273a0e5951e8e0580e97"
response = requests.get(url=url)
# 保存文件的文件夹路径
savefile = r"F:\code\stackCMSAPI"
# 文件名称
filename = "test01.png"
# 拼接路径
file = os.path.join(savefile,filename)
print(file)
# wb w写入 b二进制 wb写入二进制文件
with open(file, 'wb') as fd:
for chunk in response.iter_content():
fd.write(chunk)


文件上传
url = "http://127.0.0.1:8000/api/cms/uplaod"
response = requests.post(url=url, files={'file': open(r'F:\code\stackCMSAPI\test01.png', 'rb')})
print(response.json())
上传成功


基本上requests基础就这些、其他的不再细讲、可以自己看官方文档进行练习、这些基础基本上可以进行接口的测试。如果遇到了问题再来补充。。。




