Skip to content

请求对象

什么是请求对象?

请求对象是 AsyncTest 在自定义脚本中提供的 当前接口请求的控制对象,用于在脚本中动态生成或修改请求的各个部分(URL、请求头、请求体、URL 参数等)。

你可以通过 at.request 访问当前的请求对象,并调用其暴露的方法来操作请求内容。


基本概念

请求对象提供了两类方法:

  1. generate 方法:生成请求内容(会进行变量替换)
  2. 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.FormDatastrdictNone
    • 如果传入 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_typeform-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)]

返回值:

使用场景:

  • 动态修改 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: 新的请求头
    • 类型:dictstr(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 调用
  • 适合在接口前置操作中进行请求的动态构造和修改