在Postman中引用JS库

[复制链接]
发表于 2026-2-16 01:53:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
媒介

在做接口测试时,出于安全因素,哀求参数须要做加密大概加上署名才气正常哀求,比方:根据填写的哀求参数举行hash盘算举行署名。postman作为主流的接口调试工具也是支持哀求预处置惩罚的,即在哀求前利用JavaScript脚本对参数举行一些预处置惩罚然后再举行引用。
配景

一样平常接口都是用Java语言写的,以是其加密算法也是Java语言写的,加密过程中大概会涉及到引用了Java干系的类库,以是在postman中举行涉及加密接口的哀求时,须要先将Java加密算法转换成JavaScript代码,在转换过程中就大概引用到JS的类库。那么怎么在Postman中引用JS类库呢?假设我们要在Postman中引用CryptoJS库。
将Java代码转换为js代码

有以下Java署名算法
  1. package org.example;
  2. import org.apache.commons.codec.digest.DigestUtils;
  3. import java.io.UnsupportedEncodingException;
  4. import java.util.*;
  5. import java.util.Map.Entry;
  6. /**
  7. Unit test for simple App. */
  8. public class AppTest
  9. {
  10. public static String veritySign(SortedMap<String, Object> parameters, String key) {
  11.     StringBuffer sbkey = new StringBuffer();
  12.     Set es = parameters.entrySet();
  13.     Iterator it = es.iterator();
  14.     String md5a;
  15.     while (it.hasNext()) {
  16.         Entry entry = (Entry) it.next();
  17.         md5a = (String) entry.getKey();
  18.         Object v = entry.getValue();
  19.         if (null != v && !"".equals(v)) {
  20.             sbkey.append(md5a + "=" + v + "&");
  21.         }
  22.     }
  23.     sbkey = sbkey.append("key=" + key);
  24.     String sbString = sbkey.toString();
  25.     md5a = "";
  26.     String content = sbkey.toString();
  27.     char[] chars = content.toCharArray();
  28.     String charset = "utf-8";
  29.     int sum = 0;
  30.     char[] var12 = chars;
  31.     int i = chars.length;
  32.     for (int var14 = 0; var14 < i; ++var14) {
  33.         char aChar = var12[var14];
  34.         sum += Integer.valueOf(aChar);
  35.     }
  36.     int num = sum % 3 + 3;
  37.     for (i = 0; i < num; ++i) {
  38.         try {
  39.             content = DigestUtils.md5Hex(content.getBytes(charset)).toUpperCase();
  40.         } catch (UnsupportedEncodingException var16) {
  41.             var16.printStackTrace();
  42.         }
  43.     }
  44.     md5a = content;
  45.     System.out.println(md5a);
  46.     return md5a;
  47. }
  48. public static void main(String[] args) {
  49.     String channelId = "12345678";
  50.     String pid = "beijing";
  51.     Long time = System.currentTimeMillis();
  52.     String brand="Apple";
  53.     String modal="iPhone 15 pro";
  54.     String key = "123dzW127725c47534bdeqf6726de68z";
  55.     //请求参数信息
  56.     SortedMap<String, Object> paramMap = new TreeMap<>();
  57.     paramMap.put("modelCode", brand + " " + modal);
  58.     paramMap.put("channelId", channelId);
  59.     paramMap.put("pid", pid);
  60.     paramMap.put("time", time);
  61.     veritySign(paramMap, key);
  62. }
  63. }
复制代码
转换为JS代码:
  1. // 引入 CryptoJS 模块
  2. function veritySign(parameters, key) {
  3.     let sbkey = '';
  4.     for (const [keyParam, value] of Object.entries(parameters)) {
  5.         if (value !== null && value !== '') {
  6.             sbkey += keyParam + '=' + value + '&';
  7.         }
  8.     }
  9.     sbkey += 'key=' + key;
  10.     let content = sbkey;
  11.     let chars = content.split('');
  12.     let sum = 0;
  13.     for (let i = 0; i < chars.length; i++) {
  14.         let aChar = chars[i];
  15.         sum += aChar.charCodeAt(0);
  16.     }
  17.     let num = sum % 3 + 3;
  18.     for (let i = 0; i < num; i++) {
  19.         try {
  20.             content = CryptoJS.MD5(content).toString().toUpperCase();
  21.         } catch (error) {
  22.             console.error(error);
  23.         }
  24.     }
  25.     let md5a = content;
  26.     console.log(md5a);
  27.     return md5a;
  28. }
  29. // 测试用例
  30. (function main() {
  31.     const channelId = '12345678';
  32.     const pid = 'beijing';
  33.     const time = Date.now();
  34.     const brand = 'Apple';
  35.     const modal = 'iPhone 15 pro';
  36.     const key = '123dzW127725c47534bdeqf6726de68z';
  37.     // 请求参数信息
  38.     const paramMap = {
  39.         modelCode: brand + ' ' + modal,
  40.         channelId: channelId,
  41.         pid: pid,
  42.         time: time
  43.     };
  44.     const signature = veritySign(paramMap, key);
  45.     console.log('Signature:', signature);
  46. })();
复制代码
请留意以下几点:

  • 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 模块:
  1. npm install crypto-js
复制代码
步调 2: 在 Postman 中引用 CryptoJS

接下来,在 Postman 的预哀求脚本中引用 CryptoJS:

测试脚本须要做一点点改动,须要将署名字符串设置成postman全局变量在哀求体中引用:
  1. // 将生成的签名存储到全局变量中
  2. pm.globals.set("sign", sign);
复制代码
postman完备pre request代码
  1. // 引入 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);// 将生成的签名存储到全局变量中
  2. pm.globals.set("sign", sign);
复制代码
留意事项


  • 确保 CryptoJS 已经安装:确保您已经在本地呆板上安装了 CryptoJS 模块。
  • 利用 require 导入模块:在 Postman 的预哀求脚本中利用 require 来导入 CryptoJS 模块。
  • 异步题目:上述代码中的 veritySign 函数是同步的,这意味着它会在 Postman 的预哀求脚本中立即实行。假如您须要处置惩罚异步利用,可以利用回调函数或 Promise 来实现。
按照上述步调,您应该可以大概在 Postman 的预哀求脚本中利用 CryptoJS 并天生所需的署名。
测试

打开postman控制台,点击待测接口并哀求,检察控制台日记打印:

可以看到哀求署名是OK的,如许我们就能在哀求body中引用了:

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表