请求对象
什么是请求对象?
请求对象是 AsyncTest 在自定义脚本中提供的 当前接口请求的控制对象,用于在脚本中动态生成或修改请求的各个部分(URL、请求头、请求体、URL 参数等)。
你可以通过 at.request 访问当前的请求对象,并调用其暴露的方法来操作请求内容。
基本概念
请求对象提供了两类方法:
- generate 方法:生成请求内容(会进行变量替换)
- cover 方法:直接覆盖请求内容(不进行额外处理)
注意: 部分方法是异步方法,调用时需要添加 await 关键字。
请求体操作
async_generate_body()
异步方法 - 生成请求体(会进行变量替换)
python
await at.request.async_generate_body()返回值: 生成后的请求体内容
使用场景:
- 在接口前置操作中提前生成请求体
- 获取生成后的请求体内容进行进一步处理
示例:
python
# 生成请求体
body = await at.request.async_generate_body()
print(f"生成的请求体: {body}")cover_body()
覆盖请求体
python
at.request.cover_body(new_body)参数:
new_body: 新的请求体内容- 类型:
aiohttp.FormData、str、dict或None - 如果传入
dict,会自动转换为 JSON 字符串
- 类型:
返回值: 无
使用场景:
- 动态修改请求体内容
- 根据条件构造不同的请求体
示例:
python
# 覆盖为 JSON 字符串
at.request.cover_body('{"name": "sheldon", "age": 18}')
# 覆盖为字典(会自动转换为 JSON)
at.request.cover_body({"name": "sheldon", "age": 18})
# 清空请求体
at.request.cover_body(None)async_update_body_file()
异步方法 - 更新 form-data 结构的请求体中的文件
python
await at.request.async_update_body_file(field_name, file_object_unique_key, cover_index=0, cover_name=True)参数:
field_name: 需要更新的字段名file_object_unique_key: 文件对象的唯一标识(用于查找文件)cover_index: 更新策略(默认0)-1:更新字段下所有文件正整数:更新对应下标的文件超出下标:不更新
cover_name: 是否更新文件名(默认True)
返回值: 更新后的请求体内容
使用场景:
- 动态替换上传的文件
- 在测试中使用不同的文件进行测试
示例:
python
# 更新字段 "avatar" 的第一个文件
await at.request.async_update_body_file("avatar", "file_unique_key_123", 0, True)
# 更新字段 "files" 下的所有文件
await at.request.async_update_body_file("files", "file_unique_key_456", -1, False)注意: 此方法仅对 body_type 为 form-data 的请求有效。
URL 操作
generate_url()
生成完整的请求 URL(会进行变量替换和前缀拼接)
python
at.request.generate_url()返回值: 生成后的完整 URL
使用场景:
- 在接口前置操作中提前生成 URL
- 获取生成后的 URL 进行日志记录或进一步处理
示例:
python
# 生成 URL
url = at.request.generate_url()
print(f"生成的 URL: {url}")cover_url()
覆盖请求 URL
python
at.request.cover_url(new_url)参数:
new_url: 新的 URL(字符串)
返回值: 无
使用场景:
- 动态修改请求的目标地址
- 根据条件切换不同的 API 端点
示例:
python
# 覆盖 URL
at.request.cover_url("https://api.example.com/v2/users")
# 根据环境动态设置 URL
if at.env_name == "production":
at.request.cover_url("https://prod.example.com/api/users")
else:
at.request.cover_url("https://test.example.com/api/users")URL 参数操作
generate_url_params()
生成 URL 参数(会进行变量替换)
python
at.request.generate_url_params()返回值: 生成后的 URL 参数字符串(如 ?name=sheldon&age=18)
使用场景:
- 在接口前置操作中提前生成 URL 参数
- 获取生成后的参数进行进一步处理
示例:
python
# 生成 URL 参数
params = at.request.generate_url_params()
print(f"生成的 URL 参数: {params}")cover_url_params()
覆盖 URL 参数
python
at.request.cover_url_params(new_url_params)参数:
new_url_params: 新的 URL 参数- 类型 1:字符串(如
?name=sheldon&age=18&jk=jk1&jk=jk2) - 类型 2:元组列表(如
[('name', 'sheldon'), ('age', 18)])
- 类型 1:字符串(如
返回值: 无
使用场景:
- 动态修改 URL 参数
- 根据条件添加或删除参数
示例:
python
# 使用字符串覆盖
at.request.cover_url_params("?name=sheldon&age=18")
# 使用元组列表覆盖
at.request.cover_url_params([
('name', 'sheldon'),
('age', 18),
('city', 'shenzhen')
])
# 支持重复参数
at.request.cover_url_params([
('tag', 'python'),
('tag', 'api'),
('tag', 'test')
])请求头操作
generate_headers()
生成请求头(会进行变量替换)
python
at.request.generate_headers()返回值: 生成后的请求头字典
使用场景:
- 在接口前置操作中提前生成请求头
- 获取生成后的请求头进行进一步处理
示例:
python
# 生成请求头
headers = at.request.generate_headers()
print(f"生成的请求头: {headers}")cover_headers()
覆盖请求头
python
at.request.cover_headers(new_headers)参数:
new_headers: 新的请求头- 类型:
dict或str(JSON 字符串) - 如果传入
dict,会自动转换为 JSON 字符串
- 类型:
返回值: 无
使用场景:
- 动态修改请求头
- 添加认证信息、自定义头部等
示例:
python
# 使用字典覆盖
at.request.cover_headers({
"Content-Type": "application/json",
"Authorization": "Bearer token123",
"X-Custom-Header": "custom-value"
})
# 使用 JSON 字符串覆盖
at.request.cover_headers('{"Content-Type": "application/json"}')
# 动态添加认证头
token = at.temp.get("access_token")
at.request.cover_headers({
"Authorization": f"Bearer {token}"
})完整使用示例
接口前置操作:动态修改请求
python
# 根据环境修改 URL
if at.env_name == "production":
at.request.cover_url("https://prod.example.com/api/users")
else:
at.request.cover_url("https://test.example.com/api/users")
# 生成并修改请求头
headers = at.request.generate_headers()
headers["X-Request-ID"] = at.uuid().value
at.request.cover_headers(headers)
# 生成并修改请求体
body = await at.request.async_generate_body()
print(f"原始请求体: {body}")
# 覆盖请求体
at.request.cover_body({
"username": at.cname().value,
"email": at.email().value,
"phone": at.phone().value
})接口前置操作:动态添加签名
python
# 生成 URL 参数
params = at.request.generate_url_params()
# 生成请求体
body = await at.request.async_generate_body()
# 计算签名
import hashlib
sign_string = f"{params}{body}secret_key"
signature = hashlib.md5(sign_string.encode()).hexdigest()
# 添加签名到请求头
headers = at.request.generate_headers()
headers["X-Signature"] = signature
at.request.cover_headers(headers)接口前置操作:文件上传测试
python
# 更新上传的文件
await at.request.async_update_body_file(
field_name="avatar",
file_object_unique_key="test_avatar_001",
cover_index=0,
cover_name=True
)
# 添加额外的请求头
at.request.cover_headers({
"Content-Type": "multipart/form-data"
})注意事项
- 异步方法:
async_generate_body()和async_update_body_file()必须使用await调用 - 调用顺序:通常先调用
generate方法获取内容,再根据需要调用cover方法修改 - 变量替换:
generate方法会自动进行变量替换,cover方法不会 - 类型检查:
cover方法会对参数类型进行严格检查,传入错误类型会抛出异常 - 请求体类型:
async_update_body_file()仅对form-data类型的请求体有效
总结
请求对象提供了完整的请求控制能力:
- 通过
at.request访问请求对象 - 支持动态生成和覆盖 URL、请求头、请求体、URL 参数
- 支持 form-data 文件上传的动态替换
- 部分方法为异步方法,需要使用
await调用 - 适合在接口前置操作中进行请求的动态构造和修改