在使用 Apifox 进行接口测试的过程中,有时需要将当前测试接口的请求参数提取出来,以便用作其它用途。例如,假设我们正在测试一个电商平台的订单创建接口,接口的请求体如下所示:

{
  "id": 12345,
  "products": [
    {"id": 1, "quantity": 2},
    {"id": 3, "quantity": 1}
  ],
  "shippingAddress": "xx省xx市xx区",
  "paymentMethod": "credit_card"
}

在这种情况下,我们可能需要:

  1. 提取请求参数进行加密:为了保护隐私,我们可能需要将 shippingAddress 参数的值进行加密后再发送。

  2. 将请求参数存储为变量:我们可能希望将 id 参数设置为“临时变量”,以便在后续的接口测试(如查询订单状态)中使用。

  3. 对请求参数进行验证:在发送请求前,我们可能需要验证 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&region_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"));

常见问题

为什么接口引用的变量没有被替换?

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

图片

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

图片

附录

图片

本文介绍了如何在 Apifox 中提取接口请求参数,包括前置 URL、Path 参数、Query 参数、Body 参数和 Header 参数。通过使用 pm.request 对象及其相关方法,你可以轻松获取和操作各种请求数据。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐