接口自动化测试:Python Requests 入门
目录
前言
在软件测试工作中,接口测试是一项非常重要的技能。相比于页面测试,接口测试执行速度更快、定位问题更准确,也更容易实现自动化。
对于测试工程师来说,Requests 是学习接口自动化测试时必须掌握的库。它能够帮助我们模拟客户端发送 HTTP 请求,并获取服务器返回的数据,从而验证接口功能是否符合预期。
本文将通过实际案例介绍 Requests 的常见用法,并说明其在接口自动化测试中的应用。
一、什么是 Requests
Requests 是 Python 中最流行的 HTTP 请求库之一,其设计理念是:HTTP for Humans(为人类设计的 HTTP 库)
使用 Requests,我们可以轻松实现:
- 发送 GET 请求
- 发送 POST 请求
- 提交表单数据
- 发送 JSON 数据
- 管理 Cookie 和 Session
- 上传和下载文件
- 获取接口返回结果
安装方式
命令⾏通过 pip⼯具 进⾏安装,命令:
pip install requests
检查安装是否成功
我们可以通过查看所有已经安装的库,来查看是否安装成功,命令:
pip list
成功⽰例:

安装完成后即可导入使用:
import requests
二、为什么接口自动化测试要学习 Requests
在实际项目中,一个完整的请求流程如下:
客户端
↓
发送HTTP请求
↓
后端接口
↓
返回JSON数据
↓
客户端展示结果
接口自动化测试的本质就是:
- 发送请求
- 获取响应
- 校验结果
而 Requests 正是帮助我们完成第一步和第二步的重要工具
二、requests 模块使用
1. 第一个接口请求
⽰例:对百度接⼝发起请求
import requests
r = requests.get("https://www.baidu.com/")
print(type(r))
运行结果:
<class 'requests.models.Response'>
2. 介绍
requests.get ⽅法⽤于发送⼀个 HTTP请求 到指定的 URL,requests.get ⽅法返回⼀个 Response 对象,这个对象包含了服务器返回的所有信息,如:

Response 对象提供的属性/⽅法介绍:
| 属性/方法 | 返回类型 | 说明 | 常见使用场景 |
|---|---|---|---|
r.status_code | int | 获取 HTTP 响应状态码,例如 200、404、500 | 判断请求是否成功 |
r.text | str | 获取字符串形式的响应内容,自动根据编码进行解码 | 查看接口返回内容、日志打印 |
r.json() | dict / list | 将 JSON 格式响应解析为 Python 对象 | 获取返回字段并进行断言 |
r.content | bytes | 获取字节形式的响应内容 | 下载图片、文件、音频等二进制数据 |
r.headers | dict | 获取响应头信息 | 校验 Content-Type、Server 等信息 |
r.cookies | RequestsCookieJar | 获取服务器返回的 Cookie | 登录状态验证、会话管理 |
r.url | str | 获取最终请求 URL(可能经过重定向) | 检查重定向后的访问地址 |
r.encoding | str | 获取或设置响应内容编码格式 | 解决中文乱码问题 |
r.raw | HTTPResponse | 获取原始响应对象,不做任何处理 | 底层数据流处理(较少使用) |
r.ok | bool | 状态码小于 400 返回 True | 快速判断请求是否成功 |
r.reason | str | 返回状态码对应描述信息 | 调试接口异常 |
r.elapsed | timedelta | 获取请求耗时 | 接口性能验证 |
r.raise_for_status() | None | 请求失败(4xx、5xx)时抛出异常 | 异常处理、快速定位错误 |
使⽤⽰例:
# 响应状态码
print(r.status_code)
# 获取响应头信息
print(r.headers)
结果:
200
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Content-Encoding': 'gzip', 'Content-Length': '1145', 'Content-Type': 'text/html', 'Pragma': 'no-cache', 'Server': 'bfe', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Date': 'Sun, 31 May 2026 06:29:08 GMT'}

通过开发者工具,我们可以确认通过使用Response 对象,我们就基本上可以一一对应的得到真实响应结果

响应结果要对应
注意!! 否则就会报错
- 如果响应结果 json 格式,必须以 json 格式打印
- 如果响应结果 html 格式,必须以 text 打印
示例:对百度接⼝发起请求
- 通过开发者工具可以查看响应头信息

- 也可以通过
r.headers来获取响应头信息
示例:
r = requests.get("https://www.baidu.com/")
print(type(r))
# 获取响应头信息
print(r.headers)
结果:
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Content-Encoding': 'gzip', 'Content-Length': '1145', 'Content-Type': 'text/html', 'Pragma': 'no-cache', 'Server': 'bfe', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Date': 'Sun, 31 May 2026 06:48:55 GMT'}

通过上述获取响应头信息,可知响应结果 html 格式,如果我们以 json 格式打印就会出现如下报错JSONDecodeError

3. 常⻅请求⽅法
查看 requests 源码可以看到,基本覆盖了所有的HTTP 请求方法,用于表示客户端希望对服务器资源执行什么操作

其中最常用的是get、post、request请求方法
对于方法的认识,推荐你可以看我这篇文章《HTTP 协议基本格式与 Fiddler 抓包工具实战指南》
使⽤⽰例:
import requests
get_r = requests.get("https://www.baidu.com")
post_r = requests.post("https://www.baidu.com")
print("get:", get_r.status_code)
print("post:", post_r.status_code)
结果:
get: 200
post: 200
4. 添加请求信息
在使用 requests.get()、requests.post() 等方法发送请求时,我们通常需要携带请求头、请求参数、Cookie 等信息。
实际上,get()、post() 、put()、delete() 等方法底层最终都会调用 request() 方法,因此它们支持的大部分参数是相同的。

常用参数说明:
| 参数 | 类型 | 说明 | 常见场景 |
|---|---|---|---|
url | str | 请求地址 | 所有请求必须指定 |
params | dict | URL 查询参数 | GET 请求传参 |
data | dict / str | 请求体数据 | 表单提交 |
json | dict | JSON 格式请求体 | RESTful API 接口 |
headers | dict | 请求头信息 | Token认证、Content-Type设置 |
cookies | dict | Cookie信息 | 登录状态保持 |
files | dict | 上传文件 | 文件上传接口 |
auth | tuple | HTTP认证信息 | Basic Auth认证 |
timeout | int / float | 请求超时时间 | 防止接口长时间无响应 |
proxies | dict | 代理服务器配置 | 抓包、代理访问 |
verify | bool | 是否验证SSL证书 | HTTPS接口测试 |
如果直接使用 requests.request()方法发送请求时,注意加上mathod= [请求方法]参数来指定请求方法,请求方法大小写都可以
示例1:
req_r1 = requests.request(method="get", url="https://www.baidu.com")
req_r2 = requests.request(method="POST", url="https://www.baidu.com")
print("method_get:", req_r1.status_code)
print("method_post:", req_r2.status_code)
结果:
method_get: 200
method_post: 200
传参数选择 params、json 还是 data?
params用于在URL中传递查询参数(Query Parameters),通常用于 GET 请求,但也可以用于其他类型的请求。
示例:请求抽奖页面奖品列表接口
url = "http://47.98.40.153:58080/prize/find-list"
# 定义请求参数
param={
"currentPage":1,
"pageSize":10,
}
# 定义请求头
header={
"Token":"eyJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFETUlOIiwiaWQiOjM5LCJpYXQiOjE3Nzk2MTEyNDYsImV4cCI6MTc3OTYxNDg0Nn0.XzWbJAmusdho1i23VipMur2pt4mCdSabG7blVJbT0o"
}
r = requests.request(method="GET",url=url,headers=header,params=param)
print(r.json())
实际发送的请求:
GET /activity/find-list?currentPage=1&pageSize=10 HTTP/1.1
最终 URL:
http://47.98.40.153:58080/activity/find-list?currentPage=1&pageSize=10
json用于在请求体(Body)中传递 JSON 格式的数据,通常用于 POST 或 PUT 请求。
上传格式选择为 json 格式,Content-Type 会⾃动被设置为 application/json

示例2:请求抽奖页面用户登录接口
url = "http://47.98.40.153:58080/blogin.html"
# 定义请求头
header={
"Token":"eyJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFETUlOIiwiaWQiOjM5LCJpYXQiOjE3Nzk2MTEyNDYsImV4cCI6MTc3OTYxNDg0Nn0.XzWbJAmusdho1i23VipMur2pt4mCdSabG7blVJbT0o"
}
payload = {
"username": "admin",
"password": "123456"
}
r = requests.request(method="GET",url=url,json=payload,header=header)
print(r.json())
data用于在请求体(Body)中传递表单数据,通常用于 POST 或 PUT 请求。
示例3:请求获得活动接口
import requests
header={
"Token":"eyJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFETUlOIiwiaWQiOjM5LCJpYXQiOjE3Nzk2MTEyNDYsImV4cCI6MTc3OTYxNDg0Nn0.XzWbJAmusdho1i23VipMur2pt4mCdSabG7blVJbT0o"
}
data = {
{
"activityName": "11",
"description": "11",
"activityPrizeList": [
{
"prizeId": 1790,
"prizeAmount": 1,
"prizeTiers": "FIRST_PRIZE"
}
],
"activityUserList": [
{
"userId": 3584,
"userName": "sdf173f51"
}
]
}
}
r = requests.post(
"http://47.98.40.153:58080/activity/create",
data=data,
header=header
)
print(r.json())
更多推荐


所有评论(0)