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)

postman-request-builder

除了最常用的Authorization、Headers和Body外,还有两个很好用的模块,就是Pre-request Script即请求前预处理脚本和Tests测试模块,前者是发起请求前执行,Tests是请求后执行,因此大致的优化思路已经出来了:
先调用登录接口,在Tests模块中将登录成功返回的token和mac key保存到环境变量中,然后在其他业务模块接口中,在请求前的预处理脚本中先引用环境变量中的token和mac key,然后通过JavaScript脚本生成随机数和时间戳,Mac加密成Authorization,然后在请求的Header中引用该值,即可达到实现执行一次登录操作,后续的业务接口都不需要再关注Authorization的生成。

具体代码

因为和项目自身业务有关,所以代码仅为示例,不具有普适性。

Login API——Tests:

  1. tests["Body contains access_token"] = responseBody.has("access_token");
  2. tests["Body contains mac_key"] = responseBody.has("mac_key");
  3. if(tests["Body contains access_token"]&& tests["Body contains mac_key"]){
  4. // 将返回信息解析成对象
  5. var responseData = JSON.parse(responseBody);
  6. tests["access_token"]=responseData.access_token
  7. tests["mac_key"]=responseData.mac_key
  8. // 设置全局变量
  9. postman.setGlobalVariable("uc_access_token",tests["access_token"]);
  10. postman.setGlobalVariable("mac_key",tests["mac_key"]);
  11. }else{
  12. postman.clearGlobalVariable("uc_access_token");
  13. postman.clearGlobalVariable("mac_key");
  14. }

某业务API——Pre-request Script:

  1. // 登录后替换
  2. var access_token = postman.getGlobalVariable("uc_access_token");
  3. var mac_key = postman.getGlobalVariable("mac_key");
  4. // host
  5. var host = postman.getEnvironmentVariable("host").substr(7)
  6. var uri = request.url.substr(8)
  7. // timestamp
  8. var timestamp = new Date().getTime();
  9. var method = request.method.toUpperCase();
  10. // uuid function
  11. var uuid = function () {
  12. var len = 8;//32长度
  13. var radix = 16;//16进制
  14. var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
  15. var uuid = [], i;
  16. radix = radix || chars.length;
  17. if (len) {
  18. for (i = 0; i < len; i++)uuid[i] = chars[0 | Math.random() * radix];
  19. } else {
  20. var r;
  21. uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
  22. uuid[14] = '4';
  23. for (i = 0; i < 36; i++) {
  24. if (!uuid[i]) {
  25. r = 0 | Math.random() * 16;
  26. uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
  27. }
  28. }
  29. }
  30. return uuid.join('');
  31. }
  32. // nonce
  33. var nonce = timestamp + ':' + uuid();
  34. // authorization
  35. var sha256 = CryptoJS.HmacSHA256(nonce + "n" + method + "n" + uri + "n" + host + "n", mac_key, true)
  36. var mac = CryptoJS.enc.Base64.stringify(sha256);
  37. var authorization = 'MAC id="' + access_token + '",nonce="' + nonce + '",mac="' + mac +'"';
  38. postman.setEnvironmentVariable("authorization", authorization);

某业务API——Headers:

  1. Authorization:{{authorization}}
  2. Content-Type:application/json

过程中可以点击Postman右上角的眼睛形状图标,可以看到环境变量的值:

postman-var