脚本调用其他语言( java、python、php 等)

    • (.jar)
    • python (.py)
    • php (.php)
    • js (.js)
    • BeanShell (.bsh)
    • go (.go)
    • shell (.sh)
    • ruby (.rb)
    • lua (.lua)

    注意

    1. 仅版本号 >= 1.0.25 的 Apifox 版本支持脚本调用外部程序。
    2. 外部程序是在沙盒环境以外运行的,有权限访问和操作电脑上的其他程序、文件及数据,存在一定的安全性风险,使用者请务必自己确保被调用程序的安全性。
    1. 将需要调用的外部程序( .jar.py.php等文件 )复制到外部程序目录下。点击软件左下角 形状的 icon ,选择外部程序,即可查看外部程序目录

    2. 脚本中使用方法pm.execute(fileName, args)调用外部程序。

      1. 参数 fileNameString,外部程序文件名,需存放在外部程序目录下。
      2. 参数 argsArray<String>,传给外部程序的运行参数,为字符串数组类型,可以传递多个参数。
      3. 参数 optionsJarOptions & CommonOptions(见下文)(版本号 >= v2.1.x 支持该参数),传递给 pm.execute 的可选参数,用于配置某些特性,比如“调用 jar 包中的指定的方法”。
      4. 发生错误时会抛出异常,建议使用try catch处理异常。

      CommonOptions 类型:

      1. interface JarOptions {
      2. className: string; // 指定 jar 包中调用的类名,例如 "cn.apifox.Utils"
      3. method: string; // 指定 jar 包中调用的方法名,例如 "add"
      4. paramTypes?: string[]; // 指定 jar 包中调用的方法参数类型,例如 ["int", "int"]
      5. }

      类型说明:

      1. paramTypes 为选填字段,如果为空,则默认通过 args 参数推断类型, 整数推断为 "int",浮点数推断为 ,布尔值推断为 "boolean",字符串推断为 "String", 数组则根据第一个元素的类型来推断,例如 [3] 推断为 "int[]"[3.14] 推断为 "double[]",依此类推。
      2. 如果自动推断的类型,不符合被调用方法的参数类型,则需要手动指定 paramTypes 的值。
      3. paramTypes 数组支持的元素值有: "Number""int""Integer""long""Long""short""Short""float""Float""double""Double""boolean""Boolean""String""Number[]""int[]""Integer[]""long[]""Long[]""short[]""Short[]""float[]""Float[]""double[]""Double[]""boolean[]""Boolean[]"
    3. 确保电脑已经安装相应程序运行需要的环境。

      1. .jar程序:需要 。
      2. .py程序:需要安装 python 环境。
      3. .js程序:需要安装 nodejs 环境。
      4. 其他语言程序:需要安装对应语言的环境。
    1. 调用外部程序是以命令行的方式运行程序,返回值为程序在控制台输出的字符串。
    2. 系统会自动根据外部程序的后缀名,调用对应的命令行来运行外部程序。
      1. .jar程序:通过java命令运行。
        • 如:脚本pm.execute('cn.apifox.Base64EncodeDemo.jar', ['abc','bcd']),实际执行命令为java -jar cn.apifox.Base64EncodeDemo.jar abc bcd
      2. .py程序:通过python命令运行。
        • 如:脚本pm.execute('md5-json.py', ['abc','bcd']),实际执行命令为python md5-json.py abc bcd
      3. .js程序:通过node命令运行。
        • 如:脚本pm.execute('xxx.js', ['abc','bcd']),实际执行命令为node xxx.js abc bcd

    后置脚本:

    test.php 代码:

    1. <?php
    2. $param = json_decode($argv[1]);
    3. $result = [];
    4. foreach($param as $key=>$value)
    5. {
    6. $result[$key] = $value * 2;
    7. }
    8. echo json_encode($result);

    cn.apifox.utils.jar 包中代码:

    脚本代码:

    1. try {
    2. // 调用 cn.apifox.Utils.jar 中的 cn.apifox.utils.Utils.add(Integer, Integer) 方法
    3. const jarResult = pm.execute('cn.apifox.utils.jar', [3, 5], {
    4. className: 'cn.apifox.utils.Utils',
    5. method: 'add',
    6. paramTypes: ['Integer', 'Integer'],
    7. })
    8. console.log(jarResult); // 执行结果为:"8"
    9. } catch (e) {
    10. }

    运行结果:

    1. 引用外部程序输出结果时不同系统返回的字符串可能带有不同换行符号