关于Apifox的外部程序调用

431 阅读2分钟

背景

在调用接口的时候,需要计算参数的签名值,然后将签名值放在header里边传输过来,如下:

image-20230116180212478

在使用Apifox测试接口时,signature参数就需要动态生成,Apifox提供了编写脚本进行参数调整等功能,今天尝试研究研究~

解决办法

apifox提供了请求的前置操作,可以在前置操作编写脚本实现功能。

image-20230116181818407

环境

访问地址和请求体

image-20230116181152717

请求头

image-20230116181233776

现在需要做的事情是

  • 将请求体的timestamp替换成当前时间,因为服务端会对请求有效时间进行验证
  • 在替换了timestamp后,使用HMACSHA256签名方式将整个request-body进行签名
  • 在得到签名值sign后,替换请求头里边的signature
  • 发送数据

脚本代码

注:js语言不是很熟悉,代码也是自己一步步调试了很多回才成功的,代码的质量就不要在意了。

 // 1. 拿到全局变量appKey
 var appKey = pm.variables.get("appKey")
 ​
 // 2. 获取请求体
 var jsonData = JSON.parse(pm.request.body.raw);
 console.log("修改前的body -> ", jsonData)
 jsonData.timestamp = Date.parse(new Date()) / 1000;
 console.log("修改后的body -> ", jsonData)
 pm.request.body.update(JSON.stringify(jsonData, null, 2))
 ​
 // 3. 签名
 try {
     const jarResult = pm.execute('confirmation-sdk-1.0.jar', [pm.request.body.raw, appKey]);
     console.log('jar运行结果 -> ' + jarResult);
     
     4. // 获取请求头
     pm.request.headers.upsert({
         key: "signature",
         value: jarResult,
     });
 } catch (e) {
     console.error(e.message);
 }
 ​
 ​
  • 序号1

    • appkey设置在apifox全局变量里边
  • 序号2

    • 拿到请求体并转成Json结构
    • 生成实时时间戳并赋值予timestamp
    • 更新请求体
  • 序号3

    • 通过pm.execute()的方式调用其他语言编写的程序,这里是java程序
    • confirmation-sdk-1.0.jar:程序名称
    • [pm.request.body.raw, appKey]:参数数组
  • 序号4

    • confirmation-sdk-1.0.jar得到的签名结果赋值给请求头的signature

confirmation-sdk-1.0.jar程序

 public static void main(String[] args) {
   // 调用签名工具
   System.out.println(EncryptUtil.hmacSha256(args[0],args[1]));
 }
  • main函数中调用签名方法
  • 将得到签名值输出出来,所有注意输出不要有其他内容
  • 如果打包出现没有主清单错误,可以调整一下打包的方式

三方程序需要放在apifox的指定目录,在apifox左下角有设置按钮,点击打开后选择外部插件查看路径,将三方程序放入该路径即可。

image-20230116183314856