

在接口自动化测试的学习中,requests 库是绕不开的核心工具 ------ 它是 Python 中最流行的 HTTP 客户端库,能帮我们轻松发送各类 HTTP 请求,模拟前端与后端的交互。结合课堂笔记和实战代码,本文将从基础用法、核心参数、实战场景 三个维度,彻底讲透 requests 库的使用。
一、requests 库核心基础:响应对象与请求方法
1.1 核心响应对象:Response
发送请求后,requests 会返回一个 Response 对象,它包含了服务器返回的所有信息,也是接口测试中断言、数据提取的核心依据。常用属性 / 方法如下:
| 属性 / 方法 | 描述 | 实战用法 |
|---|---|---|
r.status_code |
响应状态码(200/400/403/500) | assert r.status_code == 200 |
r.text |
字符串格式的响应体(原始数据) | 查看未解析的 JSON / 文本内容 |
r.json() |
将 JSON 格式响应体转为 Python 字典 | 接口自动化最常用,直接取值 |
r.headers |
响应头信息(字典格式) | 提取响应头中的 token / 缓存信息 |
r.url |
实际请求的 URL | 验证请求地址是否正确 |
r.cookies |
响应中的 cookie 信息 | 处理登录态传递 |
r.encoding |
响应编码格式 | 解决中文乱码问题 |
r.raise_for_status() |
非 200 状态码抛出异常 | 快速判断请求是否失败 |
1.2 核心请求方法:requests 提供 4 类常用请求方法
requests 封装了 HTTP 协议的所有请求方式,其中 GET、POST 是接口测试中最常用的,底层均调用通用的 request() 方法。
表格
| 方法 | 适用场景 | 底层依赖 |
|---|---|---|
requests.get(url, params=None, **kwargs) |
发送 GET 请求,获取数据(如查询博客详情) | request(method="GET", ...) |
requests.post(url, data=None, json=None, **kwargs) |
发送 POST 请求,提交数据(如登录、创建博客) | request(method="POST", ...) |
requests.request(method, url, **kwargs) |
通用请求方法,支持所有 HTTP 请求方式 | 所有请求方法的底层实现 |
requests.put/delete/head/options() |
对应 HTTP 的 PUT/DELETE/HEAD/OPTIONS 请求 | 同request方法封装 |
示例:
python
import requests
# 1. 基础GET请求(百度首页)
get_resp = requests.get("https://www.baidu.com")
print("GET状态码:", get_resp.status_code) # 打印200表示请求成功
print("GET响应体(前100字符):", get_resp.text[:100])
# 2. 基础POST请求(百度首页)
post_resp = requests.post("https://www.baidu.com")
print("POST状态码:", post_resp.status_code)
# 3. 通用request方法(支持所有请求方式)
req_get = requests.request(method="GET", url="https://www.baidu.com")
req_post = requests.request(method="POST", url="https://www.baidu.com")
print("通用GET状态码:", req_get.status_code)
print("通用POST状态码:", req_post.status_code)
二、核心参数详解:params、data、json、headers、cookies
接口测试的核心是传递正确的请求参数,不同参数适用于不同的业务场景,这也是新手最容易混淆的点。
2.1 params:URL 查询参数(GET 请求核心)
适用于 GET 请求 ,参数会拼接在 URL 后面(如 ?blogId=70350),也可用于其他请求方式的查询参数传递。实战场景:查询博客详情(通过 URL 传参)
python
# 博客详情接口(GET方式,params传参)
url = "http://47.108.157.13:8090/blog/getBlogDetail"
params = {"blogId": "70350"} # 查询参数
header = {"user_token_header": "你的token"}
# 方式1:直接在URL拼接参数
r1 = requests.request(method="GET", url=url + "?blogId=70350", headers=header)
# 方式2:通过params参数传参(更规范)
r2 = requests.request(method="GET", url=url, params=params, headers=header)
print("r2-json():", r2.json()) # 打印解析后的字典数据
2.2 data:表单格式请求体(POST 请求核心)
适用于 POST/PUT 请求 ,参数以表单格式 (application/x-www-form-urlencoded)传递,是登录、提交普通数据的常用方式。实战场景:博客登录接口(表单传参)
python
# 博客登录接口(POST方式,data传参)
url = "http://47.108.157.13:8090/user/login"
data = {"username": "lisi", "password": "123456"} # 表单参数
# 发送POST请求
r = requests.request(method="POST", url=url, data=data)
print("登录响应:", r.json()) # 打印登录结果(含token/userInfo)
2.3 json:JSON 格式请求体(POST/PUT 常用)
适用于 POST/PUT 请求 ,参数以JSON 格式 (application/json)传递,requests 会自动设置 Content-Type: application/json,是现代接口(如 RESTful API)的主流传参方式。示例:JSON 格式提交博客
python
# 提交博客接口(JSON传参)
url = "http://47.108.157.13:8090/blog/addBlog"
json_data = {"title": "测试博客", "content": "requests库实战"}
header = {"user_token_header": "你的token"}
r = requests.post(url=url, json=json_data, headers=header)
assert r.json()["code"] == "SUCCESS" # 断言业务成功
2.4 headers:请求头(权限 / 身份验证核心)
请求头是 HTTP 请求的重要组成部分,用于传递身份凭证(token)、客户端信息、Content-Type 等,是接口鉴权的核心。核心场景:携带 token 访问需要登录的接口
python
# 博客详情接口(携带token鉴权)
url = "http://47.108.157.13:8090/blog/getBlogDetail?blogId=70350"
header = {
"user_token_header": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6NCwidXNlck5hbWUiOiJsaXNpIiwiZXhwIjoxNzc0NTg1NzE2fQ.1KZj_l_PB_FncVamWTgqeGwr92prWDOuvKOqQT5-XVA",
"Content-Type": "application/json"
}
r = requests.get(url=url, headers=header)
print("博客详情:", r.json()["data"]["title"])
2.5 cookies:Cookie 传递(登录态维持)
Cookie 是服务器存储在客户端的小型数据,用于维持登录态,requests 支持直接通过 cookies 参数传递,适用于基于 Cookie 鉴权 的接口。实战场景:博客园用户信息接口(携带 Cookie 获取登录用户信息)
python
# 博客园用户信息接口(POST方式,携带Cookie)
url = "https://account.cnblogs.com/user/userinfo"
# 从浏览器开发者工具复制的Cookie(键值对格式)
cookie = {
".Cnblogs.AspNetCore.Cookies": "CfDJ8DfB03_iObVLoqH7ndAeeDgVJetjhlYbwnntg9Uy7_bcLryJ_RIEtfbgLsOt7uinPvbNdpBCrZ_PSO5PvJVIw1lWKGW_BmqUG4pK2jDjEGKO8vaJdJ74bQWmCZW5U5wMaUO6QMrJFftQN8k31pgTbuD4X4lX-9kWMqGkzXkGkNb8C8hU_MyCqe9ZqjSDDSoPp4lFXTZ_MgBMGJLMzyw61Otnrrp2BXpw9oGbK14Q5ibK4_cAAL0cOPN1hYq1tDjbUs_CoDAyJanjddoezpNU6KQTchSOAmfFCbcuTLrDBlrHYHgnP75YE8pb4-AsJuaNrN74fBlYhJ_BQHKmvs_GJmj1L1seks5C32Lx7it67uq9be_7oDyj6ZLvTnZdryWXlucNb7EPE27P1-djOPq8MY15hSNVjO86Gcn8kDBbfyCee8Yi3exGOr026dRtPLSVjPdSbKV0st6Xd8so1oVJlKH2amdiX1Pofe7h_Yf6S-eVG_pnL6_frtvpCNbpVgApxB5Wm1yyy0UXLy31UmVSuo5RJN6BQr4DXQ7umCz-yfpFjnZSUiuskBcwG83N3ww"
}
# 发送POST请求,携带Cookie
r = requests.request(method="POST", url=url, cookies=cookie)
print("用户信息响应:", r.text)
三、实战场景:requests 库在接口自动化中的典型应用
结合接口自动化测试的真实场景,我们通过 3 个核心案例,完整演示 requests 库的实战流程,覆盖查询、登录、鉴权三大核心场景。
3.1 场景一:查询博客详情(GET + params + headers)
需求:通过博客 ID 查询博客详情,验证返回数据的正确性,需携带 token 完成鉴权。
python
import requests
# 接口配置
url = "http://47.108.157.13:8090/blog/getBlogDetail"
params = {"blogId": "70350"} # 查询参数
header = {
"user_token_header": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6NCwidXNlck5hbWUiOiJsaXNpIiwiZXhwIjoxNzc0NTg1NzE2fQ.1KZj_l_PB_FncVamWTgqeGwr92prWDOuvKOqQT5-XVA",
"Accept": "application/json"
}
# 发送请求
r = requests.request(method="GET", url=url, params=params, headers=header)
# 断言与结果处理
assert r.status_code == 200, "请求失败"
assert r.json()["code"] == "SUCCESS", "业务失败"
blog_detail = r.json()["data"]
print("博客标题:", blog_detail["title"])
print("博客内容:", blog_detail["content"])
3.2 场景二:用户登录接口(POST + data)
需求:通过用户名密码登录,获取 token,为后续接口调用提供鉴权凭证。
python
import requests
# 接口配置
url = "http://47.108.157.13:8090/user/login"
data = {"username": "lisi", "password": "123456"} # 登录参数
# 发送登录请求
r = requests.request(method="POST", url=url, data=data)
# 提取token并打印
login_result = r.json()
assert login_result["code"] == "SUCCESS", "登录失败"
token = login_result["data"]["token"]
print("登录成功,获取token:", token)
3.3 场景三:博客园用户信息(POST + cookies)
需求:通过携带 Cookie 获取登录用户的信息,验证 Cookie 鉴权有效性。
python
import requests
# 接口配置
url = "https://account.cnblogs.com/user/userinfo"
# 从浏览器复制的登录Cookie
cookie = {
".Cnblogs.AspNetCore.Cookies": "CfDJ8DfB03_iObVLoqH7ndAeeDgVJetjhlYbwnntg9Uy7_bcLryJ_RIEtfbgLsOt7uinPvbNdpBCrZ_PSO5PvJVIw1lWKGW_BmqUG4pK2jDjEGKO8vaJdJ74bQWmCZW5U5wMaUO6QMrJFftQN8k31pgTbuD4X4lX-9kWMqGkzXkGkNb8C8hU_MyCqe9ZqjSDDSoPp4lFXTZ_MgBMGJLMzyw61Otnrrp2BXpw9oGbK14Q5ibK4_cAAL0cOPN1hYq1tDjbUs_CoDAyJanjddoezpNU6KQTchSOAmfFCbcuTLrDBlrHYHgnP75YE8pb4-AsJuaNrN74fBlYhJ_BQHKmvs_GJmj1L1seks5C32Lx7it67uq9be_7oDyj6ZLvTnZdryWXlucNb7EPE27P1-djOPq8MY15hSNVjO86Gcn8kDBbfyCee8Yi3exGOr026dRtPLSVjPdSbKV0st6Xd8so1oVJlKH2amdiX1Pofe7h_Yf6S-eVG_pnL6_frtvpCNbpVgApxB5Wm1yyy0UXLy31UmVSuo5RJN6BQr4DXQ7umCz-yfpFjnZSUiuskBcwG83N3ww"
}
# 发送请求
r = requests.request(method="POST", url=url, cookies=cookie)
# 验证结果
assert r.status_code == 200, "请求失败"
print("用户信息响应:", r.text[:200]) # 打印前200字符