前置操作和后置操作都是 API 请求在发送和响应过程中执行的脚本,主要用于在发起 API 请求前和获得响应后完成验证或执行某些操作,目的是为了提高 API 调试和测试的效率,并确保接口的正确性。
前置操作是在 API 请求之前执行的脚本代码,可以用于做以下事情:
设置 API header(请求头)
它们可用于设置请求的请求头、请求正文、验证请求参数和配置身份验证等。
设置 API 参数
前置操作能够访问环境变量、全局变量和请求变量中的数据。前置操作也可以帮助请求者了解请求参数以及如何处理它们。
添加身份验证
例如基本身份验证或 OAuth。在发送 API 请求之前,前置操作可以被用来获取访问令牌或者其他权限,确保 API 请求发送的是有效的和合法的请求。
“变量替换”功能通常用于在发送 API 请求前,作用是把接口请求参数里的所有的已引用变量(包括动态值)替换成真实的请求内容。通常用于处理接口签名等转换场景。此时主要涉及以下两种场景:
该场景下的操作需要放在“变量替换”之前运行,否则通过该脚本 set 的变量就不会对当前接口的请求参数生效。
该场景下的脚本需放在“变量替换”之后,这样脚本才能获取到该接口实际请求的参数值,否则获取到的参数值是变量替换之前的模板数据。
如需了解更多,请参考《接口签名如何处理?》
后置操作能够利用获取来自接口响应的数据,例如状态代码、header、body 等信息,进行二次处理:
验证 API 响应的状态码和响应时间是否符合预期。
验证 API 响应的内容,如 JSON 或 XML 数据。
从 API 响应中提取数据,并将其用于后续请求。
自动提取响应中需要的数据。
前后置操作都可以在接口目录中设置父级操作。父级操作可以被继承到该目录下的所有接口中,适用于需要在多个接口中执行相同的前置操作的场景,例如鉴权,变量替换等。 接口本身可以灵活调整各操作的运行顺序。
子级接口可以选择是否采用父级操作。
当子级接口下又存在多个接口时,若选择关闭引用,次级接口将默认关闭该自定义脚本。
“后置操作”支持添加断言,你可以对接口返回的数据或响应时间设置断言,以判断当前接口返回是否符合预期。
打开 Apifox 中的某条接口,在“后置操作”页中设置断言。例如输入?$.data.status
。
提示
根对象使用?$
?符号进行表示,而无需区分是对象还是数组。
运行后即可查看断言结果:
在一些具有明显上下游关系的接口中,有时需要将 A 接口的返回数据作为 B 接口的请求参数。
比如在创建宠物信息场景下,需要将 A 接口返回的?pet_id
?中的数据作为后续接口的请求参数,然后在 B 接口中的「后置操作」中添加「提取变量」功能,基于 A 接口返回的结果自动提取数据并设置为变量(临时变量/环境变量/全局变量),方便其它接口运行的时候直接使用。
打开 Apifox 中的某条接口,在“后置操作”页中添加“提取变量”,变量类型选择为“环境变量”。
例如当前 B 接口的请求参数依赖于 A 接口返回的数据,现希望 B 接口在发送请求的同时能自动获取 A 接口返回的数据并作为请求参数。实现思路如下:
打开 A 接口用例的”后置操作“页,在后置操作中添加提取变量功能。将接口返回 Response JSON 数据里的 token 值提取到名为?petid
?的变量中。
在 B 接口中的请求参数中直接填写?{{petid}}
,即可在请求中引用上一步骤中所创建的数值。
若不确定是否正确引用了 A 接口所生成的数据,可以在 B 接口的前置操作中添加以下自定义脚本:
var petid = pm.environment.get("petid");
console.log(petid)
这样就可以在控制台中查看已引用的变量值。
“前置/后置操作”支持添加数据库。在 Apifox 中选择并连接数据库后,就可以对该数据表进行增删查改和其他操作。支持在控制台中打印由数据库操作返回的结果,也可以将其提取为变量,以便在其它接口请求参数、断言、自定义脚本和读写其它数据库等多种场景中使用。
支持以下关系型数据库(SQL):
支持以下非关系型数据库(NoSQL):
提示
Apifox 重视您的数据安全。数据库地址、端口、用户名、 密码、数据库名仅存储在客户端本地,不会同步到云端。即便是同一团队内,成员之间也不会相互同步数据库的连接信息,每个团队成员需要自己手动设置数据库。
关于非关系型数据库(MongoDB)的操作方法,请参考此文档。
如果你连接的是关系型数据库,那么可以直接在命令框中输入 SQL 命令直接进行操作。例如输入?SELECT * FROM user LIMIT 2
?命令,然后勾选“控制台打印结果”按钮,底部的控制台会出现对应的结果。
支持使用 JSONPath 表达式提取数据库操作返回的结果。以上图为例,$[0].name
?表示取到返回数据数组中的第一个元素的?name
?字段值?Apifox
,然后将其提取为临时变量,变量名?name1
。
关于更多提取变量的方法,你可以阅读《JSON Path 文档》。?
关于如何使用已提取的变量,你可以阅读《环境变量 / 全局变量 / 临时变量》。
?