目录
今天给后端接口加上了token验证,使用apipost目录加上公共header和预执行脚本时结果与预期不一致。参考apipost官方文档
给所有要用token验证的目录加上公共header如下
给所有要用token验证的目录加上预执行脚本如下
$.ajax({
url: "http://localhost:8080/user/login",
method: "GET",
headers: {
"content-type": "application/json"
},
timeout: "10000",
data: JSON.stringify({
"account": "my_account",
"password": "my_password"
}),
success: function (response) {
console.log(response.data.token);//打印查看此次登陆获取的token,稍后与变量参数的值比对
apt.variables.set("token", response.data.token);//设置环境变量token为此次返回的token
}
});
按预期结果来说,只要我配置好了这两处,那么使用apipost执行需要token验证的接口时,
将会通过预执行脚本先执行一次登陆操作,获取到此次登陆的token,将其存到环境变量中,那么在header处的token值会取这个环境变量token的值。
即预期在header中将会正常携带一个token给后端,并且这个token是每次执行都会更新的。
可是当配置完这两处执行时,token值依旧为{ {token}},并且我们查看右方的小眼睛查看当前环境变量,也没有token,说明我们在ajax请求中并没有成功设置环境变量。
出现token值依旧为{ {token}}的官方文档的描述如下,说变量token还未与接口返回的token绑定,所以原样输出了。
可是我明明在ajax请求后将返回的token设置到变量中了呀?
而对于在ajax中设置环境变量无效的原因我在官方文档中并没有看到描述,并且官方文档中也有这样在ajax中设置环境变量。
于是我不改用预执行脚本的方式设置token变量了,而是在登陆接口的后执行脚本中将token设置到变量中去,如下。
apt.globals.set("token", response.json.data.token);
此时我们先执行一次登陆接口,拿到了此次登陆的token,再去执行一次需要token验证的接口,执行成功了,说明设置变量是没问题的,就是在ajax中设置环境变量没生效。
可是为什么我们在ajax请求中会设置环境变量无效呢?
隔了一晚再看遇到的这个问题,我突然想起来了
ajax是异步的。
再仔细看看官方文档,发现描述中有说明,执行ajax方法时,可能在执行过程中请求已经发送完毕了,也就是说我们在ajax中设置变量没有赶上他发送过去的速度。
于是apipost在7.0.4版本后可以通过 await 关键字转为同步方法,先执行完函数,再发送接口
总结与解决方法
ajax为异步请求,在函数执行我们到设置token环境变量的那行前,请求就已经发送走了,所以没有取到我们的token值
那么在ajax请求前加上await关键字,将ajax转为同步请求,保证发送请求前我们的环境变量设置完毕即可,如下。
await $.ajax({
url: "http://localhost:8080/user/login",
method: "GET",
headers: {
"content-type": "application/json"
},
timeout: "10000",
data: JSON.stringify({
"account": "my_account",
"password": "my_password"
}),
success: function (response) {
console.log(response.data.token);
apt.variables.set("token", response.data.token);
}
});