在Postman中引用JS库

news2024/9/17 9:11:45

前言

在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行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.coloradmin.cn/o/1963586.html

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

相关文章

界面组件DevExtreme v24.2将发布一系列新组件、支持.NET 9

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

中小企业选择数字工厂管理系统需要注意哪些问题

在当今数字化转型的大潮中&#xff0c;中小企业作为经济体系的重要组成部分&#xff0c;正积极寻求通过引入数字工厂管理系统来提升生产效率、优化资源配置、增强市场竞争力。然而&#xff0c;面对市场上琳琅满目的数字工厂管理系统解决方案&#xff0c;中小企业在选择时往往面…

HarmonyOS鸿蒙- 延时执行

一、延时执行一次 3000 表示秒,可根据需求修改 //2秒后执行打印setTimeout(() > {console.log(Timer is end)},3000) 取消延时执行 // 3秒后执行打印 let timerId setTimeout(() > {console.log(Timer is end)},3000)// 取消timerId的延时 clearTimeout(timerId) 二、…

设计师的素材管理神器,eagle、千鹿大测评

前言 专业的设计师都会精心维护自己的个人素材库&#xff0c;常常需要耗费大量时间用于浏览采集、分类标注、预览筛选、分享协作&#xff0c;还要管理字体、图片、音视频等各类设计素材 如果你作为设计师的话&#xff0c;今天&#xff0c;就为大家带来两款热门的素材管理工具…

构建基于数据驱动的应用程序与Llamaindex——理解大型语言模型

如果你在阅读这本书&#xff0c;你可能已经探索过大型语言模型&#xff08;LLMs&#xff09;的领域&#xff0c;并且已经认识到它们的潜在应用以及它们的缺陷。本书旨在解决LLMs所面临的挑战&#xff0c;并提供一本实用指南&#xff0c;教你如何使用LlamaIndex构建数据驱动的LL…

57_Redis与Springboot的集合应用

前提 要实现,使用Redis存储登录状态 需要一个完整的前端后端的项目 前端项目搭建 解压脚手架安装依赖配置请求代理选做: 禁用EsLint语法检查 Vue Admin Template关闭eslint校验&#xff0c;lintOnSave&#xff1a;false设置无效解决办法_lintonsave: false-CSDN博客 后端项…

C++和R穿刺针吸活检肿瘤算法模型模拟和进化动力学量化差异模型

&#x1f3af;要点 &#x1f3af;模拟肿瘤细胞增生进化轨迹 | &#x1f3af;肿瘤生长的随机空间细胞自动机模型 | &#x1f3af;模拟穿刺活检的收集空间局部的肿瘤块&#xff0c;模拟针吸活检采集长而薄的组织样本 | &#x1f3af;构建不同参数模拟合成肿瘤测试集 | &#x1f…

【TS】TypeScript函数类型:提升函数的类型安全性和可读性

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript函数类型&#xff1a;提升函数的类型安全性和可读性1. 引言2. 基本函…

vue3 基于elementui el-table封装 hooks (未使用ts版本)

elementui-table封装 hooks js-hooks import { ref, reactive, onMounted } from vue import { ElMessage, ElMessageBox, ElNotification } from element-plus /*** FileDescription: el-table 函数式组件hooks--实现一个表格的数据加载、分页、搜索、删除和导出等操作,* fu…

tesseract 图片识别引擎

什么是tesseract Tesseract是一款开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;用于从图像中提取文本。它由Ray Smith在惠普实验室于1985年至1995年开发&#xff0c;并在2005年由惠普将其作为开源软件发布。之后&#xff0c;Tesseract的开发由Google主导&am…

如何理解低代码?怎么用好低代码

怎样理解低代码 理解一个概念最好的办法就是找相关概念进行类比&#xff0c;那么想要单独理解低代码这个概念是不太行的。我们还需要了解“零代码”以及“纯代码”开发的概念。那么什么是低代码&#xff1f;其与“零代码”和“纯代码”的关系又是如何&#xff1f; 零代码 也许…

IDEA资源文件中文乱码问题解决方法

目录 一、问题描述二、解决方法 一、问题描述 IDEA中打开资源文件出现乱码。 二、解决方法 进入“Settings” -> “Editor” -> “File Encodings”&#xff0c;按下图修改箭头所指的三个地方&#xff1a;

java类加载和双亲委派及加载恶意类代码应用

前面的CC1和CC6&#xff0c;都是在Runtime.exec执行命令。如果WAF过滤了Runtime就寄&#xff0c;而且用命令的方式写入shell进行下一步利用&#xff0c;在流量中一个数据包就能把你的行为全部看完&#xff0c;很容易被分析出来。 如果用恶意字节码加载的方式&#xff0c;我们的…

轮询系统的具体原理是什么

一般市面上的轮询系统&#xff0c;看似高深莫测&#xff0c;但都是大差不差的&#xff0c;没有太多的技术含量&#xff0c;都是通过你的订单情况&#xff0c;在数据库中找出一个可以收这个订单的支付方式&#xff0c;然后经过b站来实现与支付通道商交互。 这个过程看似复杂&am…

IP-GUARD文档云备份服务器迁移数据操作说明

一、功能简介 使用文档云备份过程可能出现需要迁移旧数据到新目录的情况(如一开始存储目录设置 不合理,之后变更存储目录),下面介绍迁移备份数据到新目录的方法,迁移后可正常查看、 下载、删除原备份文件。 二、同一计算机上迁移存储目录 当仅需要将存储目录迁移到同一计…

随机森林的可解释性分析(含python代码)

随机森林的可解释性分析 1.引言可解释性的重要性 2.随机森林的原理2.1 基本原理&#xff1a;2.2 随机森林的实现 3.随机森林的可解释性分析3.1 特征重要性3.2 特征重要性3.3 SHAP值3.4 部分依赖图&#xff08;PDP&#xff09;3.5 交互特征效应3.6 变量依赖图 4.结论5.参考文献 …

Android和iOS 测试五个最好的开源自动化工具

本文主要介绍Android和iOS 五个最好的开源自动化工具&#xff0c;这里整理了相关资料&#xff0c;希望能帮助测试软件的朋友&#xff0c;有需要的看下 自动化测试在产品测试上有着非常重要的作用。实现测试自动化有多种积极的方式&#xff0c;包括最大限度地减少测试执行时间&…

昇思25天学习打卡营第26天|munger85

ShuffleNet图像分类 和mobilenet一样&#xff0c;也是在资源有限的设备上进行神经网络来做ai图像分类的小模型&#xff0c;在保持精度的同时大大降低了模型的计算量。 是基本块 就是真正的网络&#xff0c;如果模型size是2&#xff0c;就是输出的时候多一些&#xff0c;精细一…

公司监控员工电脑都能监控到什么?公司电脑可以监控到哪些内容?

很多人反馈&#xff0c;公司监控电脑&#xff1a; 那到底为什么安装监控&#xff1f; 公司监控员工电脑又都能监控到什么&#xff1f; 下面小编跟你细细道来~ 第一部分&#xff1a;架空员工电脑监控的目的 在现代企业管理中&#xff0c;电脑监控已成为一种常见的做法。 企…

【LLM大模型】落地RAG系列:RAG入门及RAG面临的挑战和解决方案!!

2023 年以来&#xff0c;RAG 已成为基于大模型的人工智能系统中应用最为广泛的架构之一。因此对 RAG 应用的性能、检索效率、准确性的研究成为核心问题。 本文首先介绍什么是 RAG、为什需要 RAG、介绍 Naive RAG 工作流程及Naive RAG 存在的问题和挑战&#xff01; 为什么需要 …