Postman实践之环境变量 前几天使用Postman的环境变量优化了一个开发调试时的很繁琐的步骤,记录一下。
优化前的场景
由于是非公共接口,所以对接口的调用方需要进行鉴权处理,鉴权模块由客户端SDK生成,服务端的解析处理也整合到了Spring框架中,因此在服务端开发接口时,就需要伪造授权。授权主要依赖于添加到Http Request Header中的Authorization字段,其算法主要是对登录用户的token以及url进行多次Mac加密,并附加时间戳、随机字串等。
先前授权模块开发团队有提供一个简单的web demo,可以通过设置url、时间戳等来生成Authorization,但在实际开发中,我每测试一个API,都需要先在Postman中写好url、header、参数等,然后再复制一遍到web demo中,然后生成了Authorization后再复制回Postman中,才算是完成一次API请求;并且由于混合了时间戳和随机数,所以同一请求不能重复使用,因此每次调试API都要重复一遍上次操作,十分麻烦。
Postman环境变量及简单脚本编写
环境变量配合脚本才能够实现价值,Postman的API builder窗口大致如下(Chrome V4.8.0)
除了最常用的Authorization、Headers和Body外,还有两个很好用的模块,就是Pre-request Script即请求前预处理脚本和Tests测试模块,前者是发起请求前执行,Tests是请求后执行,因此大致的优化思路已经出来了:
先调用登录接口,在Tests模块中将登录成功返回的token和mac key保存到环境变量中,然后在其他业务模块接口中,在请求前的预处理脚本中先引用环境变量中的token和mac key,然后通过JavaScript脚本生成随机数和时间戳,Mac加密成Authorization,然后在请求的Header中引用该值,即可达到实现执行一次登录操作,后续的业务接口都不需要再关注Authorization的生成。
具体代码
因为和项目自身业务有关,所以代码仅为示例,不具有普适性。
Login API——Tests:
tests["Body contains access_token"] = responseBody.has("access_token");
tests["Body contains mac_key"] = responseBody.has("mac_key");
if(tests["Body contains access_token"]&& tests["Body contains mac_key"]){
// 将返回信息解析成对象
var responseData = JSON.parse(responseBody);
tests["access_token"]=responseData.access_token
tests["mac_key"]=responseData.mac_key
// 设置全局变量
postman.setGlobalVariable("uc_access_token",tests["access_token"]);
postman.setGlobalVariable("mac_key",tests["mac_key"]);
}else{
postman.clearGlobalVariable("uc_access_token");
postman.clearGlobalVariable("mac_key");
}
某业务API——Pre-request Script:
// 登录后替换
var access_token = postman.getGlobalVariable("uc_access_token");
var mac_key = postman.getGlobalVariable("mac_key");
// host
var host = postman.getEnvironmentVariable("host").substr(7)
var uri = request.url.substr(8)
// timestamp
var timestamp = new Date().getTime();
var method = request.method.toUpperCase();
// uuid function
var uuid = function () {
var len = 8;//32长度
var radix = 16;//16进制
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
var uuid = [], i;
radix = radix || chars.length;
if (len) {
for (i = 0; i < len; i++)uuid[i] = chars[0 | Math.random() * radix];
} else {
var r;
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | Math.random() * 16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
return uuid.join('');
}
// nonce
var nonce = timestamp + ':' + uuid();
// authorization
var sha256 = CryptoJS.HmacSHA256(nonce + "n" + method + "n" + uri + "n" + host + "n", mac_key, true)
var mac = CryptoJS.enc.Base64.stringify(sha256);
var authorization = 'MAC id="' + access_token + '",nonce="' + nonce + '",mac="' + mac +'"';
postman.setEnvironmentVariable("authorization", authorization);
某业务API——Headers:
Authorization:{{authorization}}
Content-Type:application/json
过程中可以点击Postman右上角的眼睛形状图标,可以看到环境变量的值: