要在「前/后置操作」中获取当前接口的请求参数,怎么在 Apifox 中操作?

在使用 Apifox 进行接口测试的过程中,有时需要将当前测试接口的请求参数提取出来,以便用作其它用途。例如,假设我们正在测试一个电商平台的订单创建接口,接口的请求体如下所示:
{
"id": 12345,
"products": [
{"id": 1, "quantity": 2},
{"id": 3, "quantity": 1}
],
"shippingAddress": "xx省xx市xx区",
"paymentMethod": "credit_card"
}
在这种情况下,我们可能需要:
- 提取请求参数进行加密: 为了保护隐私,我们可能需要将 shippingAddress 参数的值进行加密后再发送。
- 将请求参数存储为变量: 我们可能希望将 id 参数设置为“临时变量”,以便在后续的接口测试(如查询订单状态)中使用。
- 对请求参数进行验证: 在发送请求前,我们可能需要验证 paymentMethod 参数是否为有效值。
这时我们就可以把接口的请求参数提取出来以作处理,要获取当前接口的请求参数,需要用到pm.request
方法。可以新建一个自定义脚本,把pm.request
打印到控制台,即可看到请求的各种参数信息,例如:
// 当前接口的请求参数信息
console.log(pm.request)

方法中的request
是接口的请求对象,在「前置操作」中表示“即将发送的请求”,在「后置操作」中表示“已发送的请求”。
你可以根据业务需求选择在前置或后置操作中获取当前接口的请求参数。
- 如果要获取接口发送之前的请求参数,用前置操作;
- 如果要获取接口发送之后的请求参数,则用后置操作。
需要注意的是,只有在「前置操作」中修改请求信息才是有效的,「后置操作」中的修改不会生效。
本文主要介绍如何在 Apifox 的「前/后置操作」中通过脚本获取当前接口的请求参数。对于获取其他接口的请求参数,可以将参数存储在环境变量中然后读取,或者使用「自动化测试」功能,借助「动态值」直接读取前置步骤(即其他接口)的请求参数或响应数据。

如果想要了解怎么在「前/后置操作」中获取当前接口的响应数据,也可以参考这篇最佳实践:Apifox 中提取接口响应数据的技巧。接下来,我们将深入探讨本文的主要内容。
获取接口前置 URL
前置 URL 就是在「环境管理」中配置的服务地址。

要获取当前接口的前置 URL,可使用 pm.request.getBaseUrl()
或 pm.request.baseUrl
方法。例如:
// 获取前置 URL
let preUrl = pm.request.getBaseUrl();
console.log(preUrl);
// 或
let baseUrl = pm.request.baseUrl;
console.log(baseUrl)

如果配置有多个前置 URL,那么脚本将获取与指定服务相对应的前置 URL,你可以在「修改文档 -> 服务(前置 URL)」中查看和管理这些配置。

获取 Path 参数
Path 参数(路径参数)是 URL 中的一部分,用于指定资源的路径,通常用于标识特定的资源或资源集合。在 Apifox 中,Path 参数使用花括号 {}
表示,并直接包含在 URL 的路径中。例如:
https://apifoxmock.com/xxx/xxx/store/products/{id}
在上述这个 URL 中,{id}
就是一个 Path 参数,可以动态替换为具体的值。要提取 Path 参数,可以使用pm.request.url.path
方法获取包含所有路径名称的数组,这个数组按顺序包含 URL 中每个斜杠/
后的路径名称,允许你通过数组索引精确定位到特定参数。例如:
// 从 pm.request.url.path 获取 Path 参数
let getPathUrl = pm.request.url.path;
// 控制台打印数据
console.log(getPathUrl)
console.log(getPathUrl[4])

获取 Query 参数
Query 参数是附加在 URL 中的一部分,用于向服务器传递额外的信息。它们通常出现在 URL 中的问号 ?
之后,并以键值对的形式存在,每对之间用符号 &
分隔。例如:
https://apifoxmock.com/xxx/xxx/store/products/{id}?cart_id=42®ion_id=43
要提取 Query 参数,可以使用pm.request.url.query
方法获取所有键值对,然后通过get()
方法精确定位到特定参数。以下是提取上述cart_id
参数的示例脚本:
// 从 pm.request.url.query 获取 Query 参数
let getQueryUrl = pm.request.url.query;
// 控制台打印数据
console.log(getQueryUrl);
console.log(getQueryUrl.get("cart_id"));

获取整个 URL
要获取到接口请求的完整 URL,包括前置 URL、Path 参数和 Query 参数,可以使用pm.request.url.toString()
方法。例如:
// 控制台打印数据
console.log(pm.request.url.toString())
这个方法会返回一个字符串,其中包含了请求的全部 URL 信息。它不仅包括基本的 URL 结构,还包含了动态替换后的 Path 参数和所有的 Query 参数。

获取 Body 参数
form-data 格式
form-data
格式以键值对的形式组织数据,常用于文件上传和复杂表单提交。
要获取form-data
格式的 Body 参数,可以使用pm.request.body.formdata
方法。该方法返回一个数组对象,允许你通过get()
函数访问特定的参数值。例如:
// 当 body 类型为 form-data 时,从 pm.request.body.formdata 获取请求参数
let formData = pm.request.body.formdata;
// 控制台打印数据
console.log(formData);
console.log(formData.get("email"));
console.log(formData.get("password"));

x-www-form-urlencoded 格式
x-www-form-urlencoded
格式,与form-data
类似,也是以键值对的形式存在。
要获取 x-www-form-urlencoded
格式的 Body 参数,可以使用 pm.request.body.urlencoded
方法。该方法返回一个数组对象,允许你通过 get()
函数轻松访问这些键值对。例如:
// 当 body 类型为 x-www-form-urlencode 时,从 pm.request.body.urlencoded 获取请求参数
let urlencoded = pm.request.body.urlencoded;
// 控制台打印数据
console.log(urlencoded);
console.log(urlencoded.get("email"));
console.log(urlencoded.get("password"));

raw、json、xml 格式
对于 raw、json 或 xml 格式的 Body 参数,可以使用pm.request.body.raw
方法获取。该方法返回一个字符串,包含了请求体的原始内容。由于返回的是字符串类型,通常需要进一步解析才能访问具体的参数。例如:
// raw、json、xml 格式
let formData = pm.request.body.raw;
// 解析为 JSON 对象
let jsonData = JSON.parse(formData);
// 控制台打印数据
console.log(jsonData);
console.log(jsonData.email);
console.log(jsonData.password);

获取 Header 参数
如果要获取接口请求的 Header 参数,可以使用pm.request.headers
方法。该方法返回一个包含所有请求头信息的数组对象,你可以通过get()
函数精确定位并提取特定的参数值。例如:
// 获取请求头参数
let headers = pm.request.headers;
// 控制台打印数据
console.log(headers)
console.log(headers.get("Accept"));

常见问题解答
Q:为什么接口引用的变量没有被替换?
如图所示,接口的请求参数引用了环境变量的值,为什么在控制台中打印出来的变量没有被替换成具体值?

要替换成具体值,请在前置或后置操作中把「变量替换&继承父级」移动到脚本的最前面,这样接口请求参数里所有引用「变量(包括动态值)」的地方才会替换成实际内容。

附录
方法 | 描述 | 用途 |
pm.request | 获取当前接口的请求参数信息 | 访问请求对象 |
pm.request.getBaseUrl() | 获取前置 URL | 获取服务地址 |
pm.request.baseUrl | 获取前置 URL(替代方法) | 获取服务地址 |
pm.request.url.path | 获取 Path 参数 | 提取 URL 路径参数 |
pm.request.url.query | 获取 Query 参数 | 提取 URL 查询参数 |
pm.request.url.toString() | 获取完整 URL | 获取包含所有参数的完整 URL |
pm.request.body.formdata | 获取 form-data 格式的 Body 参数 | 提取表单数据 |
pm.request.body.urlencoded | 获取 x-www-form-urlencoded 格式的 Body 参数 | 提取 URL 编码的表单数据 |
pm.request.body.raw | 获取 raw、json 或 xml 格式的 Body 参数 | 提取原始请求体内容 |
pm.request.headers | 获取 Header 参数 | 提取请求头信息 |
JSON.parse() | 解析 JSON 字符串 | 将 JSON 字符串转换为 JavaScript 对象 |
总结
本文介绍了如何在 Apifox 中提取接口请求参数,包括前置 URL、Path 参数、Query 参数、Body 参数和 Header 参数。通过使用pm.request
对象及其相关方法,你可以轻松获取和操作各种请求数据。
更详细的内容可以参考 Apifox 的帮助文档,如果有任何问题或建议,欢迎在用户群留言讨论~