马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
媒介
在做接口测试时,出于安全因素,哀求参数须要做加密大概加上署名才气正常哀求,比方:根据填写的哀求参数举行hash盘算举行署名。postman作为主流的接口调试工具也是支持哀求预处置惩罚的,即在哀求前利用JavaScript脚本对参数举行一些预处置惩罚然后再举行引用。
配景
一样平常接口都是用Java语言写的,以是其加密算法也是Java语言写的,加密过程中大概会涉及到引用了Java干系的类库,以是在postman中举行涉及加密接口的哀求时,须要先将Java加密算法转换成JavaScript代码,在转换过程中就大概引用到JS的类库。那么怎么在Postman中引用JS类库呢?假设我们要在Postman中引用CryptoJS库。
将Java代码转换为js代码
有以下Java署名算法- package org.example;
- import org.apache.commons.codec.digest.DigestUtils;
- import java.io.UnsupportedEncodingException;
- import java.util.*;
- import java.util.Map.Entry;
- /**
- Unit test for simple App. */
- public class AppTest
- {
- public static String veritySign(SortedMap<String, Object> parameters, String key) {
- StringBuffer sbkey = new StringBuffer();
- Set es = parameters.entrySet();
- Iterator it = es.iterator();
- String md5a;
- while (it.hasNext()) {
- Entry entry = (Entry) it.next();
- md5a = (String) entry.getKey();
- Object v = entry.getValue();
- if (null != v && !"".equals(v)) {
- sbkey.append(md5a + "=" + v + "&");
- }
- }
- sbkey = sbkey.append("key=" + key);
- String sbString = sbkey.toString();
- md5a = "";
- String content = sbkey.toString();
- char[] chars = content.toCharArray();
- String charset = "utf-8";
- int sum = 0;
- char[] var12 = chars;
- int i = chars.length;
- for (int var14 = 0; var14 < i; ++var14) {
- char aChar = var12[var14];
- sum += Integer.valueOf(aChar);
- }
- int num = sum % 3 + 3;
- for (i = 0; i < num; ++i) {
- try {
- content = DigestUtils.md5Hex(content.getBytes(charset)).toUpperCase();
- } catch (UnsupportedEncodingException var16) {
- var16.printStackTrace();
- }
- }
- md5a = content;
- System.out.println(md5a);
- return md5a;
- }
- public static void main(String[] args) {
- String channelId = "12345678";
- String pid = "beijing";
- Long time = System.currentTimeMillis();
- String brand="Apple";
- String modal="iPhone 15 pro";
- String key = "123dzW127725c47534bdeqf6726de68z";
- //请求参数信息
- SortedMap<String, Object> paramMap = new TreeMap<>();
- paramMap.put("modelCode", brand + " " + modal);
- paramMap.put("channelId", channelId);
- paramMap.put("pid", pid);
- paramMap.put("time", time);
- veritySign(paramMap, key);
- }
- }
复制代码 转换为JS代码:- // 引入 CryptoJS 模块
- function veritySign(parameters, key) {
- let sbkey = '';
- for (const [keyParam, value] of Object.entries(parameters)) {
- if (value !== null && value !== '') {
- sbkey += keyParam + '=' + value + '&';
- }
- }
- sbkey += 'key=' + key;
- let content = sbkey;
- let chars = content.split('');
- let sum = 0;
- for (let i = 0; i < chars.length; i++) {
- let aChar = chars[i];
- sum += aChar.charCodeAt(0);
- }
- let num = sum % 3 + 3;
- for (let i = 0; i < num; i++) {
- try {
- content = CryptoJS.MD5(content).toString().toUpperCase();
- } catch (error) {
- console.error(error);
- }
- }
- let md5a = content;
- console.log(md5a);
- return md5a;
- }
- // 测试用例
- (function main() {
- const channelId = '12345678';
- const pid = 'beijing';
- const time = Date.now();
- const brand = 'Apple';
- const modal = 'iPhone 15 pro';
- const key = '123dzW127725c47534bdeqf6726de68z';
- // 请求参数信息
- const paramMap = {
- modelCode: brand + ' ' + modal,
- channelId: channelId,
- pid: pid,
- time: time
- };
- const signature = veritySign(paramMap, key);
- console.log('Signature:', signature);
- })();
复制代码 请留意以下几点:
- CryptoJS: 我们假设您已经在项目中包罗了 CryptoJS 库,而且可以通过 require 大概 script标签引入它。
- Date.now(): JavaScript 中获取当前时间戳的方法与 Java 中System.currentTimeMillis() 相称。
- SortedMap: 在 JavaScript 中,我们利用
Object.entries 和 for…of 循环来遍历对象的键值对。由于 JavaScript 的 Object.entries返回的数组默认就是按添加序次排序的,因此不须要额外的排序。
- 编码题目: JavaScript中处置惩罚字符串编码通常不是题目,由于字符串是以 UTF-16 编码的,但假如您须要明确地处置惩罚编码题目,可以利用 TextEncoder类(在今世欣赏器中可用)大概第三方库如 Buffer (Node.js 中可用)。
- 测试用例: 我将 Java 中的main 方法转换成了一个立即实行的函数表达式 (IIFE),用于测试 veritySign 函数。
您可以将这段代码放在一个 HTML 文件中并运行它,大概在 Node.js 情况中运行它,只要确保 CryptoJS 库已经被准确加载。
这里是修改后的代码,用于在 Postman 的预哀求脚本中利用 CryptoJS:
在postman中举行引用
在 Postman 的预哀求脚本中,您不能利用 window 对象(欣赏器对象),由于预哀求脚本是在 Node.js 情况中运行的,而不是在欣赏器情况中运行的。因此,window 对象是不可用的。您应该直接利用 require 来加载 CryptoJS 模块。
步调 1: 安装 CryptoJS
起首,确保您已经在本地呆板上安装了 Node.js 和 npm。然后,安装 CryptoJS 模块:步调 2: 在 Postman 中引用 CryptoJS
接下来,在 Postman 的预哀求脚本中引用 CryptoJS:
测试脚本须要做一点点改动,须要将署名字符串设置成postman全局变量在哀求体中引用:- // 将生成的签名存储到全局变量中
- pm.globals.set("sign", sign);
复制代码 postman完备pre request代码- // 引入 CryptoJS 模块var CryptoJS = require('crypto-js');// 修改后的 veritySign 函数function veritySign(parameters, key) { let sbkey = ''; for (const [key, value] of Object.entries(parameters)) { if (value !== null && value !== '') { sbkey += key + '=' + value + '&'; } } sbkey += 'key=' + key; let sbString = sbkey; let content = sbkey; let chars = content.split(''); let sum = 0; for (let i = 0; i < chars.length; i++) { let aChar = chars[i]; sum += aChar.charCodeAt(0); } let num = sum % 3 + 3; for (let i = 0; i < num; i++) { try { content = CryptoJS.MD5(content).toString().toUpperCase(); } catch (error) { console.error(error); } } let md5a = content; console.log(md5a); return md5a;}// 初始化参数 const channelId = '12345678'; const pid = 'beijing'; const time = Date.now(); const brand = 'Apple'; const modal = 'iPhone 15 pro'; const key = '123dzW127725c47534bdeqf6726de68z';let paramMap = { modelCode: brand + ' ' + modal, channelId: channelId, pid: pid, time: time};// 调用 veritySign 函数let sign = veritySign(paramMap, key);// 将生成的签名存储到全局变量中
- pm.globals.set("sign", sign);
复制代码 留意事项
- 确保 CryptoJS 已经安装:确保您已经在本地呆板上安装了 CryptoJS 模块。
- 利用 require 导入模块:在 Postman 的预哀求脚本中利用 require 来导入 CryptoJS 模块。
- 异步题目:上述代码中的 veritySign 函数是同步的,这意味着它会在 Postman 的预哀求脚本中立即实行。假如您须要处置惩罚异步利用,可以利用回调函数或 Promise 来实现。
按照上述步调,您应该可以大概在 Postman 的预哀求脚本中利用 CryptoJS 并天生所需的署名。
测试
打开postman控制台,点击待测接口并哀求,检察控制台日记打印:
可以看到哀求署名是OK的,如许我们就能在哀求body中引用了:
|