在Postman中引用JS库
前言
在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行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 模块:
npm install crypto-js
步骤 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中引用了:

相关文章:
在Postman中引用JS库
前言 在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的,即在请求前使用JavaScript脚本对…...
学习笔记-系统框图简化求传递函数公式例题
简化系统结构图求系统传递函数例题 基础知识回顾 第四讲 控制系统的方框图 (zhihu.com) 「自控原理」2.3 方框图的绘制及化简_方框图化简-CSDN博客 自动控制原理笔记-结构图及其等效变换_结构图等效变换-CSDN博客 例子一 「自控原理」2.3 方框图的绘制及化简_方框图化简-CS…...
postgrsql——事务概述
事务概述 事务的特性 原子性(Atomicity): 事务被视为一个整体,其中的操作要么全部执行成功,要么全部不执行,即不存在部分执行的情况。这确保了事务的完整性和一致性。一致性(Consistency&…...
1.Spring Boot 简介(Spring MVC+Mybatis-plus)
文章目录 一,Spring Boot 简介二,搭建springboot项目并整合mybatis-plus框架1.pom导依赖2.添加启动项3.配置文件.yml 三,springboot集成 Spring MVC1.springmvc定义2.应用注解 一,Spring Boot 简介 SpringBoot是Spring的子工程(或…...
《计算机网络》(学习笔记)
目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…...
指针函数和函数指针
函数名在表达式中应该如何被解读?答:函数名可以在表达式中被解读成“指向该函数的指针”。 函数指针和指针函数有什么区别?答:函数指针是一个指向函数的指针;指针函数是一个返回指针变量的函数。 一个函数能否有时候…...
Elasticsearch跨集群搜索
Elasticsearch(简称ES)是一种基于Lucene的搜索引擎,以其高性能、可扩展性和实时搜索能力而广受欢迎。在大型分布式系统中,跨集群搜索成为了一个重要的需求,它允许用户从多个Elasticsearch集群中联合查询数据࿰…...
基于FPGA的数字信号处理(19)--行波进位加法器
1、10进制加法是如何实现的? 10进制加法是大家在小学就学过的内容,不过在这里我还是帮大家回忆一下。考虑2个2位数的10进制加法,例如:15 28 43,它的运算过程如下: 个位两数相加,结果为5 8 1…...
树莓派下,centos7操作系统, TensorFlow java版实现植物分类功能
在树莓派上运行CentOS 7,并使用TensorFlow Java版本实现植物分类功能可以通过以下步骤实现。以下是详细的指导: 一、安装和设置环境 1. 更新系统并安装基本工具 确保你的CentOS 7系统是最新的,并安装必要的工具: sudo yum update -y sudo yum install -y wget unzip gi…...
开源一个react路由缓存库
Github仓库 背景 产品希望可以像浏览器那样每打开一个路由,会多一个tab,用户可以切换tab访问之前加载过的页面,且不会重新加载。真就产品一句话…… Github上有轮子了吗 Github上开箱即用的轮子是基于react-router-dom V5实现的ÿ…...
go-kratos 学习笔记(7) 服务发现服务间通信grpc调用
服务发现 Registry 接口分为两个,Registrar 为实例注册和反注册,Discovery 为服务实例列表获取 创建一个 Discoverer 服务间的通信使用的grpc,放到data层,实现的是从uses服务调用orders服务 app/users/internal/data.go 加入 New…...
SPSS个人版是什么软件
SPSS是一款数据统计、分析软件,它由IBM公司出品,这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等,软件易学且功能非常强大,可以使用SPSS制作图表,例如柱状、饼状、折线等图表&…...
Minos 多主机分布式 docker-compose 集群部署
参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能 中文地址:MinIO | 用于AI的S3 …...
Unity + Hybridclr + Addressable + 微信小程序 热更新报错
报错时机: Generate All 怎么All 死活就是报错 生成微信小程序,并启动后 报错内容: MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因: Hybridclr 开发文档 解…...
鸿蒙开发—黑马云音乐之Music页面
目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果: 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…...
IsaacLab | 如何在Manipulation任务中添加新的目标(target)
如是我闻: 终于让我给摸索出来了,在这里描述一下问题场景。 假使说我们有一个机械臂操作的任务,这样婶的 Isaac Lab | Push 我们想做多目标的任务,这时候需要向环境中添加第二个目标,像这样 Isaac Lab | Add target 那…...
【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)
接上篇《60、Pandas中DataFrame对象的操作(一)》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…...
Linux(虚拟机)的介绍
Linux介绍 常见的操作系统 Windows:微软公司开发的一款桌面操作系统(闭源系统)。版本有dos,win98,win NT,win XP , win7, win vista. win8, win10,win11。服务器操作系统:winserve…...
CSS(九)——CSS 轮廓(outline)
CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 轮廓(outline)属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…...
Unity Timeline:构建复杂动画序列的利器
Unity的Timeline是一个强大的动画工具,它允许开发者创建复杂的动画序列,将动画、音频和事件整合到一个统一的时间轴上。Timeline的可视化编辑界面使得动画制作变得更加直观和灵活。本文将介绍Unity Timeline的基本概念、功能以及如何使用它来实现动画。 …...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
