在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.mzph.cn/diannao/51068.shtml

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

相关文章

windows SSH免密连接ubuntu

前提windows 和linux系统都安装了openssh服务 Linux&#xff08;安装OPENSSH服务&#xff09;&#xff1a;sudo apt-get install openssh-server Windows&#xff1a;自己百度吧 1.生成Windows公钥 Windows的CMD中执行&#xff1a;ssh-keygen -t rsa&#xff0c;执行过程中直接…

Linux编程:使用 strip 命令优化 ELF 文件大小

0. 概要 在软件开发过程中&#xff0c;经常需要处理各种各样的可执行文件和共享库。 为了提高系统的性能和减少磁盘占用空间&#xff0c;我们可能会对这些文件进行优化。其中之一就是使用 strip 命令来移除 ELF (Executable and Linkable Format) 文件中的非必要数据。 本文将…

Conda与Docker:打造无缝开发环境

Conda与Docker&#xff1a;打造无缝开发环境 在现代软件开发中&#xff0c;容器化技术已经成为一种趋势&#xff0c;它能够为应用提供一个一致的运行环境&#xff0c;无论在何处部署。Docker是实现容器化的首选工具之一。而Conda&#xff0c;作为Python和其他科学计算软件的包…

Redis:AOF持久化

1. 简介 以日志的形式来记录每个写操作&#xff0c;将redis执行的每个写操作记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只需追加文件但不可以改写文件&#xff0c;redis启动之初会重新构建数据&#xff0c;即redis重启后会将日志中的所有写指令重新执行一遍以达…

扰动观测器DOB设计及其MATLAB/Simulink实现

扰动观测器(Disturbance Observer, DOB)是一种在控制系统中用于估计和补偿未知扰动的重要工具,以增强系统的鲁棒性和稳定性。其设计过程涉及系统建模、观测器结构设计以及控制律的调整。 扰动观测器设计原理 系统建模: 首先,需要建立被控对象的数学模型,明确系统的状态变…

APP重启 - C#小函数类推荐

此文记录的是一个应用程序重启的函数。 /***应用程序重启动Austin Liu 刘恒辉Project Manager and Software DesignerE-Mail: lzhdim163.comBlog: http://lzhdim.cnblogs.comDate: 2024-01-15 15:18:00使用方法&#xff1a;AppUtil.RestartApplication(Application.Executa…

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书 一、赛项概述&#xff1a;二、竞赛形式&#xff1a;三、竞赛规则四、竞赛样题4.1、第一场4.1.2、实操闯关赛4.2、第二场4.3、第三场 需要培训可以私信博主 欢迎交流学习&#xff01; [X] &#x1…

【深入理解SpringCloud微服务】深入理解nacos

【深入理解SpringCloud微服务】深入理解nacos Nacos服务注册内存注册表内存注册表的更新通知客户端服务变更、服务同步、健康检查2.x版本nacos的变化 Nacos服务注册 spring-cloud-alibaba-nacos-discovery通过实现spring-cloud-commons规范定义的接口&#xff0c;完成nacos接入…

昇思25天学习打卡营第11天|xiaoyushao

今天分享ResNet50迁移学习。 在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;所以很少有人会从头开始训练整个网络。普遍的做法是&#xff0c;在一个非常大的基础数据集上训练得到一个预训练模型&#xff0c;然后使用该模型来初始化网络的权重参数或作为固定特征提…

IT服务运营过程中的资源要素管理(至简)

在IT服务运营管理过程中&#xff0c;所有资源要投入正式、连续、稳定运行&#xff0c;要保持规范化的管理和标准化的操作&#xff0c;具体包括工具管理、知识管理、服务台管理与评价、备件库管理等内容。 一、工具管理 1、工具的基本运营。见下表&#xff1a; 工具的基本运营…

论文阅读:Deep_Generic_Dynamic_Object_Detection_Based_on_Dynamic_Grid_Maps

目录 概要 Motivation 整体框架流程 技术细节 小结 不足 论文地址&#xff1a;Deep Generic Dynamic Object Detection Based on Dynamic Grid Maps | IEEE Conference Publication | IEEE Xplore 概要 该文章提出了一种基于动态网格图&#xff08;Dynamic Grid Maps&a…

pyarmor,一个超厉害的 Python 库

在当今的软件开发领域&#xff0c;代码保护是一个不可忽视的重要环节。pyarmor作为一个强大的Python代码保护工具&#xff0c;可以帮助我们轻松地对Python脚本进行加密和授权控制&#xff0c;确保源码的安全。本文将深入介绍pyarmor的特性、安装方法、基本功能以及高级功能&…

操作系统面试知识点总结4

#来自ウルトラマンメビウス&#xff08;梦比优斯&#xff09; 1 文件系统基础 1.1 文件的相关概念 文件是以计算机硬盘为载体的存储在计算机上的信息集合&#xff0c;可以是文本文档、图片、程序。 文件的结构&#xff1a;数据项、记录、文件&#xff08;有结构文件、无结构式…

橙单前端项目下载编译遇到的问题与解决

今天下载orange-admin前端项目&#xff0c;不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误&#xff0c;如下&#xff1a; 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了&#xff0c;可能是原作者…

Python学习笔记44:游戏篇之外星人入侵(五)

前言 上一篇文章中&#xff0c;我们成功的设置好了游戏窗口的背景颜色&#xff0c;并且在窗口底部中间位置将飞船加载出来了。 今天&#xff0c;我们将通过代码让飞船移动。 移动飞船 想要移动飞船&#xff0c;先要明白飞船位置变化的本质是什么。 通过上一篇文章&#xff0…

新手小白的pytorch学习第十四弹------十一、十二、十三弹卷积神经网络CNN的习题

习题编号目录 No 1No 2No 3No 4No 5No 6No 7No 8No 9No 10No 11No 12No 13 练习题主要就是 写代码&#xff0c;所以这篇文章大部分是代码哟~ No 1 What are 3 areas in industry where computer vision is currently being used? No 2 工业异常检测&#xff0c;目标检测 Sea…

第三十四天 复合选择器之后代选择器

常用复合选择器包括 后代选择器、子选择器、并集选择器、伪类选择器 后代选择器 语法 选择器1 选择器2{属性:属性值;} 出现重复组可以用类名进行区别 后代选择器可以无限套娃 父子等级可以是人为创造的

利用GPT4o Captcha工具和AI技术全面识别验证码

利用GPT4o Captcha工具和AI技术全面识别验证码 &#x1f9e0;&#x1f680; 摘要 GPT4o Captcha工具是一款命令行工具&#xff0c;通过Python和Selenium测试各种类型的验证码&#xff0c;包括拼图、文本、复杂文本和reCAPTCHA&#xff0c;并使用OpenAI GPT-4帮助解决验证码问…

【C++】倍增LCA详解 + P3379 最近公共祖先题解

文章目录 1.暴力做法2.倍增做法问题1问题2 总结CodeEnd 这道题是一道求树上最近公共祖先的模板题。 1.暴力做法 我们先思考O(n)的暴力做法&#xff1a;&#xff08;这里的n是指树的最大深度&#xff0c;也可以近似于节点个数&#xff09; 我们假设我们要求的是lca(u,v)&#…