postman实现一次登录所有接口携带token
0. 问题背景
在后端开发过程中,我们需要做接口自测或者问题排查需要使用postman,但是大多数时候我们的系统都是有登录的,这个时候就需要请求携带token,如果每次请求的时候都去请求一次登录接口获取一个token然后再放入接口的header中,就显得很笨。下面就是解决这个问题的步骤。
1. 使用变量
postman是支持变量的,根据不同的作用域,分为全局变量、环境变量、集合变量等。这里我们解决登录token问题是要在所有的接口中起作用的,所以我们这里需要设置的是全局变量。
如上图,我再全局变量里设置了3个变量,可以看到前2个变量是有初始值和当前值的,但是第3个变量auth
也就是token是只有当前值的。这是因为在我目前的项目中,前两个变量是固定的,所以我给了一个初始值,那当前值是根据初始值自动填充的,而token由于每次登录都会变化,所以我没有设置初始值,当前值是由脚本填充的。
2. 脚本填充全局变量中的token
每次登录之后会获取有效的token,那么我们在请求登录接口之后拿到token填充到全局变量中不就不用每次去修改token了嘛,所以如下:
如上图,在登录接口的Tests
tab中,我写了一个脚本(js),拿到返回值中的token,放到全局变量globals
中。
var json = pm.response.json();
// 设置全局变量,环境变量是pm.environment
pm.globals.set("auth", json.access_token);
好了,现在实现了每次请求登录接口之后全局变量中的token都会更新,接下来就是如何使用全局变量了。
3. 使用全局变量
在postman中,最顶层的文件夹结构称之为collection
我们可以在collection中做很多操作,比如设置授权相关的东西,例如token。
我们可以看到,这里支持多种类型的授权,我这里选择的API Key
就是一种简单k-v结构,然后选择将它添加到header里,那么如果说我每个请求要在请求头里加的不止一个token呢?比我就在globals里加了3个变量,那么可以看到Authorization旁边还有一个Pre-request Script,意思就是请求前的脚本,我们写个脚本将剩余的2个变量放入请求头里就行了。
// 添加新 header
var t_id = pm.globals.get('tenant');
pm.request.headers.add({
key: 'Tenant-Id',
value: t_id
});
var a = pm.globals.get('authorization');
pm.request.headers.add({
key: 'Authorization',
value: a
});
// 添加或修改已存在 header
// pm.request.headers.upsert({
// key: 'Connection',
// value: 'close'
// });
// 移除 header
// pm.request.headers.remove('User-Agent')
4. 验证
打开左下角的控制台可以看到每次接口请求的详细信息
我请求了一个接口,详细信息如下:
可以看到请求头里有我们想要加的3个变量,成功。