在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);
})();

请注意以下几点:

  1. CryptoJS: 我们假设您已经在项目中包含了 CryptoJS 库,并且可以通过 require 或者 script标签引入它。
  2. Date.now(): JavaScript 中获取当前时间戳的方法与 Java 中System.currentTimeMillis() 相当。
  3. SortedMap: 在 JavaScript 中,我们使用
    Object.entries 和 for…of 循环来遍历对象的键值对。由于 JavaScript 的 Object.entries返回的数组默认就是按添加顺序排序的,因此不需要额外的排序。
  4. 编码问题: JavaScript中处理字符串编码通常不是问题,因为字符串是以 UTF-16 编码的,但如果您需要明确地处理编码问题,可以使用 TextEncoder类(在现代浏览器中可用)或者第三方库如 Buffer (Node.js 中可用)。
  5. 测试用例: 我将 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);

注意事项

  1. 确保 CryptoJS 已经安装:确保您已经在本地机器上安装了 CryptoJS 模块。
  2. 使用 require 导入模块:在 Postman 的预请求脚本中使用 require 来导入 CryptoJS 模块。
  3. 异步问题:上述代码中的 veritySign 函数是同步的,这意味着它会在 Postman 的预请求脚本中立即执行。如果您需要处理异步操作,可以使用回调函数或 Promise 来实现。

按照上述步骤,您应该能够在 Postman 的预请求脚本中使用 CryptoJS 并生成所需的签名。

测试

打开postman控制台,点击待测接口并请求,查看控制台日志打印:
在这里插入图片描述
可以看到请求签名是OK的,这样我们就能在请求body中引用了:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386584.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思MindSpore学习入门-自动混合精度

混合精度&#xff08;Mix Precision&#xff09;训练是指在训练时&#xff0c;对神经网络不同的运算采用不同的数值精度的运算策略。在神经网络运算中&#xff0c;部分运算对数值精度不敏感&#xff0c;此时使用较低精度可以达到明显的加速效果&#xff08;如conv、matmul等&am…

OSI七层模型详解

OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连。 一般都叫OSI参考模型&#xff0c;是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、会话层、…

[玄机]流量特征分析-常见攻击事件 tomcat

[玄机]流量特征分析-常见攻击事件 tomcat 题目做法及思路解析&#xff08;个人分享&#xff09; Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;提供了一个运行这些应用程序的Web服务器环境。Tomcat由A…

go程序在windows服务中优雅开启和关闭

本篇主要是讲述一个go程序&#xff0c;如何在windows服务中优雅开启和关闭&#xff0c;废话不多说&#xff0c;开搞&#xff01;&#xff01;&#xff01;   使用方式&#xff1a;go程序 net服务启动 Ⅰ 开篇不利 Windows go进程编译后&#xff0c;为一个.exe文件,直接执行即…

语言转文字

因为工作原因需要将语音转化为文字&#xff0c;经常搜索终于找到一个免费的好用工具&#xff0c;记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

NSSRound#4 Team

[NSSRound#4 SWPU]1zweb 考察&#xff1a;phar的反序列化 1.打开环境&#xff0c;审计代码 1.非预期解 直接用file伪协议读取flag,或直接读取flag file:///flag /flag 2.正常解法 用读取文件读取index.php,upload.php的源码 index.php: <?php class LoveNss{publi…

hadoop学习(一)

一.hadoop概述 1.1hadoop优势 1&#xff09;高可靠性&#xff1a;Hadoop底层维护多个数据副本&#xff0c;即使Hadoop某个计算元素或存储出现故障&#xff0c;也不会导致数据的丢失。 2&#xff09;高扩展性&#xff1a;在集群间分配任务数据&#xff0c;可方便扩展数以千计…

c++ 内存管理(newdeletedelete[])

因为在c里面新增了类&#xff0c;所以我们在有时候会用malloc来创建类&#xff0c;但是这种创建只是单纯的开辟空间&#xff0c;没有什么默认构造的。同时free也是free的表面&#xff0c;如果类里面带有指针指向堆区的成员变量就会free不干净。 所以我们c增加了new delete和de…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step

springcloud RocketMQ &#xff0c;一个mq消息发送后&#xff0c;客户端是怎么一步步拿到消息去消费的&#xff1f;我们要从代码层面探究这个问题。 找的流程图&#xff0c;有待考究。 以下我们开始debug&#xff1a; 拉取数据的线程&#xff1a; PullMessageService.java 本…

126M全球手机基站SHP数据分享

数据是GIS的血液&#xff01; 我们在《2.8亿东亚五国建筑数据分享》一文中&#xff0c;为你分享过东亚五国建筑数据。 现在再为你分享全球手机基站SHP数据&#xff0c;你可以在文末查看该数据的领取方法。 全球手机基站SHP数据 全球手机基站数据是OpenCelliD团队创建由社区…

【Spring Cloud】Sleuth +Zinkin 实现链路追踪并持久化的解决方案

文章目录 前言链路追踪介绍Sleuth入门Sleuth介绍TraceSpanAnnotation Sleuth入门1、引入依赖2、修改配置文件3、网关路由配置4、演示 Zipkin的集成ZipKin介绍ZipKin服务端安装Zipkin客户端集成1、添加依赖2、添加配置3、访问微服务4、演示 Zipkin数据持久化使用mysql实现数据持…

现代Java开发:使用jjwt实现JWT认证

前言 jjwt 库 是一个流行的 Java 库&#xff0c;用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程&#xff0c;其中最流行的就是使用jjwt实现jwt认证&#xff0c;但是教程之中依然使用的旧版的jjwt库&#xff0c;许多的类与方法已经标记弃用或者…

多家隧道代理价格:阿布云、快代理、小象代理、熊猫代理和亿牛云……

随着奥运的热度攀升&#xff0c;各大品牌也在抓紧时机赶上这波奥运热潮&#xff0c;随之而来的大量数据信息收集和分析工作也接踵而至&#xff0c;在这一数据采集过程中&#xff0c;HTTP代理的质量和价格对企业的效率和成本调控重要性不言而喻。我们大部分人在日常购买产品的时…

Revit中如何添加剖面?快速实现剖面图的方法汇总

Revit中创建剖面以及剖面视图一般有两种方法&#xff0c;一是使用Revit原生的剖面功能&#xff0c;而是使用Revit插件BIM建模助手进行便捷的剖面操作以及剖面视图创建。 Revit原生的剖面功能&#xff0c;点击后可以自由拉伸剖面方向、范围&#xff0c;放置完剖面符号后&#xf…

【ROS 最简单教程 003/300】ROS 快速体验:Hello World

开始自己的第一次尝试叭 ~ Hello World 本篇是 C 版本&#xff0c;如需 python 版本 &#x1f449; python 版本指路 ROS 中程序的实现流程&#xff1a; 创建工作空间 ( &#x1f499; 如 tutu_ws) &#xff0c;进入并编译 mkdir -p tutu_ws/src cd tutu_ws catkin_make在 src …

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…

springboot使用Gateway做网关并且配置全局拦截器

一、为什么要用网关 统一入口&#xff1a; 作用&#xff1a;作为所有客户端请求的统一入口。说明&#xff1a;所有客户端请求都通过网关进行路由&#xff0c;网关负责将请求转发到后端的微服务 路由转发&#xff1a; 作用&#xff1a;根据请求的URL、方法等信息将请求路由到…

Hive之扩展函数(UDF)

Hive之扩展函数(UDF) 1、概念讲解 当所提供的函数无法解决遇到的问题时&#xff0c;我们通常会进行自定义函数&#xff0c;即&#xff1a;扩展函数。Hive的扩展函数可分为三种&#xff1a;UDF,UDTF,UDAF。 UDF&#xff1a;一进一出 UDTF&#xff1a;一进多出 UDAF&#xff1a…