临时变量/全局变量
有两个请求,第一个请求如下:
如上图,是一个post请求,有一个id参数,该参数值在前置操作中赋值,如下:
发请请求,结果如下:
如上图,可以看到响应结果中正确的接收到了id参数。
然后我们在创建一个GET请求,看在另一个请求中是否可以读取到该id变量,如下:
如图所示,并没有访问到之前设置的值,这里看到乱码,是因为这里显示的是进行了urlenocde编码的,实际它是使用的是{{id}}
字符串,通过响应结果可知,如下:
这说明一个请求设置的临时变量只能自己读取使用,另一个请求不能使用,只能在单个请求中单次使用,比如第一次请求时通过自定义脚本为临时变量赋值了,第一次请求时请求参数可以读取到该变量,第二次请求时,我们把自定义脚本删除,再次请求,这时就读取不到该变量了。
官方文档对临时变量的说明:
临时变量仅在单个接口或测试场景的运行期间有效,运行结束后会消失。它适用于临时覆盖其他类型的变量,并且不会在执行后保留值。
要想变量在多个请求中都可以共享使用,可以使用全局变量
,点击右上角的管理环境按钮,如下图:
如上图,我们选择了项目内共享
的全局变量,并添加了一个名为id的变量,且设置了远程值为56789,远程值的作用是,该值会与 Apifox
的服务器同步,并在你分享该参数时与团队成员共享。
此时我们在请求中使用该id,如下:
如上图,发现实际请求中id值为空,这是因为全局变量只使用本地值,但是我们并没有在全局变量中填入本地值,如果在本地值填入的值和远程值一样,这不就有点重复了吗?所以可以设置本地值使用远程值,点击 “跟随远程值” 按钮,如下:
点击后效果如下:
如上图所示,它有文字提示现在本地值是跟随远程值的。此时再发送请求就正常了,如下:
我们也可以给本地值设置一个不一样的值,这样就是请求时会使用本地值,而不会使用远程值。我们的本地值并不会同步到团队的其它成员中,所以其它人如果没设置本地值,他想使用远程值,则需要设置跟随远程值,以便使用远程值。
现在我们是在设置中写死了全局变量的值,也可以在代码中修改它的值,比如在自定义脚本中:
pm.globals.set('id', '123456')
也有对应的获取函数:
var id= pm.globals.get('id');
如果说一个参数没有默认值,则远程值和本地值都可以不填,后期通过请求服务器得到值后再用代码给全局变量赋值,注意,假如调用pm.globals.set('id', '123456')
其实就是给本地值赋值,当你打开设置界面时会看到它的本地值变成了123456
,当我们在设置中把本地值删除时,也相当于你调用代码把值设置为空一样的效果。
所以,简单总结全局变量,它其实就是持久化保存到本地了,所以你关闭软件再持打开,该变量还是存在的,所以它和我们平时写代码时的全局变量还不太一样,一般写代码时的全局变量是内存中的,只要程序一关闭就没了。
另外,在使用全局变量时,如果没有远程值,而且该变量的值不是写死的,要通过代码去设置,比如一个全局使用的access_token
,在登录后服务器返回该值,则我们直接在代码中设置全局变量即可,不需要提前到设置中去创建该变量,也就是说,当在代码中调用pm.globals.set('id', '123456')
时,如果设置里面没有id这个全局变量,则Apifox就会自动帮我们创建一个。 如果你有一个固定值,不需要用代码去设置,这种情况才需要到设置里手动设置变量。
全局参数
比如登录后会得到一个access_token
,其它的请求都需要带上这个请求参数,有的会要求把该参数放到请求头,有的要求放到查询参数上。虽然我们可以把access_token
保存到全局变量,但是每个请求都要手动添加使用这个变量,也是个无聊的重复操作,这种情况可以使用全局参数让Apifox自动帮我们添加这个参数,示例如下:
1、添加全局变量
如果你的参数值是一个固定值,这里就可以填入一个固定的本地值了,由于我的access_token
是登录后服务器返回的,不是固定的,所以我这里就没有填,后期通过解析服务器返回值后用代码设置进来。
2、添加全局参数:全局参数的作用就是给项目中所有的请求自动添加的参数,参数可以是Header
、Cookie
、Query
、Body
,我里我就以在Header
和Query
中添加access_token
参数为例,如下:
发送一个请求,效果如下:
可以看到查询参数和请求头中都有该参数了,只是值为空。
有些请求可能并不需要这个access_token
参数,因为这个参数代表登录后才能访问的接口,有些接口不登录就能访问的,这些接口就不需要这些参数,比如检查更新接口,在对应的参数中,可以看到全局参数,我们可以单独取消它,示例如下:
如上图所示,每个请求默认都会带上全局参数,如果我们确定某个请求不需要此参数,则把参数前面的勾取消即可。
解析响应结果并保存到全局变量
从响应结果中获取需要的数据,并保存到全局变量中,以便在别的请求中可以使用该数据。比如登录成功后有access_token,别的请求都需要用到此参数,还有一个userid,有的请求可能用到,有的请求用不到,只要是有可能用到的,我们都可以解析出来,保存到全局变量中,这样就可以在别的请求中使用了,假设登录成功后返回的响应数据是一个json
结构,内容如下:
{
"success": true,
"code": "200",
"msg": "登录成功",
"obj": {
"token": {
"access_token": "cf2db89f-3d5c-4c74-8ea3-01e52120a224",
"userid": "604"
}
}
}
添加后置操作 > 提取变量,如下:
这里的难点在于JSONPath表达式:$.obj.token.access_token
,解释别的json就照我这个表达式的规律去修改就行了。这里指定了变量名称为 access_token
,且指定该变量的类型为 全局变量
,在解析数据时,Apifox就会自动帮我们创建一个全局变量access_token
,并把解析到的值保存到access_token
的本地值
中。所以我们并不需要在提前去全局设置那里声明全局变量,Apifox会自动帮我们生成,当然,我们提前自己设置了也没关系,反正设置有了就可以直接使用,没设置有Apifox就会帮我们生成一个。
还有一个userid参数需要解析,操作一样:
OK,只要登录请求一执行,access_token和userid就会保存到全局变量中,当需要使用的时候就访问该全局变量即可,前面我们已经在全局参数中使用了access_token变量。像userid只在某些请求上用到了,那就没必要添加到全局参数中了,在什么请求用到就单独在什么请求中添加即可,比如获取用户信息:
如上图,我们在获取用户信息请求的Query
参数中添加了userid参数,并通过{{userid}}
来使用全局变量userid
中的值,而全局参数access_token
会自动添加。
临时变量/全局变量/环境变量比较
如果临时变量和全局变量重名会怎样?实验如下:
如上图所示,请求中有一个name参数,参数值使用name变量中的值,我们在前置操作中给该变量赋值,如下:
执行请求,效果如下:
可以看到,请求中成功访问到了我们设置的变量值,该变量是临时变量,只有在请求期间生效,比如你在另一个请求中使用{{name}}是访问不到的。就算你在相同的请求中,如果你把自定义脚本删除,再访问该变量也是访问不到的,因为该变量是临时的。
如果我们又设置有同名的全局变量会怎样?示例如下:
注:我们并不需要到设置中去设置全局变量,只要代码中设置了,该变量就会自动保存到设置里面的全局变量里面去的。执行该请求,发现使用的name值还是Lilei,这也很容易理解,就我们平时写代码时一样,如果又有全局变量又有局部变量,使用时默认访问的是局部变量,如果我们把临时变量的代码删除,如下:
如上所示,这时就使用到了全局变量中的值了。
还有一个环境变量,它和全局变量很像,都是持久化保存到本地的,所以可以在不同的请求中共享使用,唯一不同的时,环境变量的作用范围只在指定的环境中生效。
当有同名的临时变量、环境变量、全局变量时,优先使用临时变量,然后是环境变量,然后是全局变量,示例如下:
如上所示,可以看到最终使用的变量是临时变量中的值,如果删除临时变量,则会使用环境变量中的值,如果再删除环境变量才会使用到全局变量的值。
需要注意的时,删除临时变量只要代码上删除即可,而环境变量和全局变量是持久化保存的,即使代码删除了,但是变量已经持久化到本地了,还需要到设置中一并删除才可以。pm.environment.set('name', 'lily')
这个代码创建了一个环境变量并设置值为'lily‘
,环境变量只对指定环境生效,如上图,我们选择了“正式环境”,所以运行该请求时,环境变量name就会创建在“正式环境”中,别的环境中就不会有这个变量,假设你此时选择测试环境,然后再运行一次请求,则此时在测试环境中也会有name变量了。
一般来说,环境变量是为了在不同环境有不同的值而设置的,很少需要在脚本里面通过代码赋值,几乎都是在设置里面直接设置不同的值,如下:
根据需要分别针对不同的环境,设置相同的变量名,但是设置不同的本地值。
我的另一篇关于Apifox的文章:使用Apifox动态生成请求参数