调用外部程序
你可以前置/后置操作中通过添加自定义脚本的方式,调用以下外部程序:
语言 | 文件格式 |
---|---|
Java | .jar |
Python | .py |
PHP | .php |
JavaScript | .js |
BeanShell | .bsh |
Go | .go |
Shell | .sh |
Ruby | .rb |
Lua | .lua |
- Apifox 版本需
>= 1.0.25
才能使用外部脚本调用程序。 - 外部程序是在「沙盒环境」以外运行的,有权限访问和操作电脑上的其他程序、文件及数据,存在一定的安全性风险,使用者请务必确保被调程序的安全性。
使用方法
将需要调用的外部程序(例如 .jar
、.py
、.php
等文件 )复制到 Apifox 客户端的「外部程序目录」路径下。你可以点击软件右上角 ⚙
齿轮 icon ,选择「外部程序」即可打开外部程序目录。
输入
脚本中使用方法pm.execute(fileName, args)
调用外部程序。
- fileName:
String
,外部程序文件名,需存放在外部程序目录
下。 - args:
Array<String>
,传给外部程序的运行参数,为字符串数组类型,可以传递多个参数。
你可以在命令中添加运行参数 JarOptions & CommonOptions
,将可选参数传递给 pm.execute
,用于配置某些特性,比如“调用 jar 包中的指定的方法”。
输出
返回值为 String
类型。使用命令行运行程序时,在控制台输出的字符串。
在 Apifox 内运行时若发生错误,将抛出异常信息,建议使用 try catch
命令处理异常。
CommonOptions
类型:
interface CommonOptions {
windowsEncoding?: string // windows 系统用使用的编码格式,默认为 "cp936"
}
JarOptions
类型:
调用 java 程序指定 jar 包中特定类的特定方法时使用。
interface JarOptions {
className: string // 指定 jar 包中调用的类名,例如 "cn.apifox.Utils"
method: string // 指定 jar 包中调用的方法名,例如 "add"
paramTypes?: string[] // 指定 jar 包中调用的方法参数类型,例如 ["int", "int"]
}
类型说明:
paramTypes
为选填字段,如果为空,则默认通过args
参数推断类型, 整数推断为"int"
,浮点数推断为"double"
,布尔值推断为"boolean"
,字符串推断为"String"
, 数组则根据第一个元素的类型来推断,例如[3]
推断为"int[]"
,[3.14]
推断为"double[]"
,依此类推。如果自动推断的类型,不符合被调用方法的参数类型,则需要手动指定
paramTypes
的值。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[]"
、"String[]"
确保电脑已经安装相应程序运行需要的环境。
.jar
程序:需要 安装 java 环境。.py
程序:需要安装 python 环境。.js
程序:需要安装 nodejs 环境。- 其他语言程序:需要安装对应语言的环境。
调用原理
- 调用外部程序是以命令行的方式运行程序,返回值为程序在控制台输出的字符串。
- 系统会自动根据外部程序的后缀名,调用对应的命令行来运行外部程序。
.jar
程序:通过java
命令运行。- 如:脚本
pm.execute('cn.apifox.Base64EncodeDemo.jar', ['abc','bcd'])
,实际执行命令为java -jar cn.apifox.Base64EncodeDemo.jar abc bcd
。
- 如:脚本
.py
程序:通过python
命令运行。- 如:脚本
pm.execute('md5-json.py', ['abc','bcd'])
,实际执行命令为python md5-json.py abc bcd
。
- 如:脚本
若使用 Apifox 调用外部 Python 文件时没反应 / 报错,那么需要执行以下操作:
以 macOS 为例,若你的系统内置了 Python3,那么就需要使用 ln -s
命令将本机中的 python3
软链至 python
。
示例代码:sudo ln -s "$(which python3)" /usr/local/bin/python
.js
程序:通过node
命令运行。- 如:脚本
pm.execute('xxx.js', ['abc','bcd'])
,实际执行命令为node xxx.js abc bcd
。
- 如:脚本
- 其他语言程序也是类似原理。
代码示例
后置脚本:
try {
// jar 示例,调用 cn.apifox.Base64EncodeDemo.jar
// 实际命令行执行的命令为:java -jar cn.apifox.Base64EncodeDemo.jar abc
const jarResult = pm.execute('cn.apifox.Base64EncodeDemo.jar', ['abc'])
console.log('jar 运行结果', jarResult)
// php 示例,调用 test.php
const param1 = { a: 1, b: 2 }
// 注意:json 格式数据作为参数时,需要使用 JSON.stringify 对参数进行序列化
// 实际命令行执行的命令为:php test.php '{"a":1,"b":2}'
const phpResultString = pm.execute('test.php', [JSON.stringify(param1)])
// 注意:返回数据为 json 格式字符串时,可使用 JSON.parse 反序列化
const phpResult = JSON.parse(phpResultString)
console.log('php 运行结果', phpResult)
} catch (e) {
console.error(e.message)
}
test.php 代码:
<?php
$param = json_decode($argv[1]);
$result = [];
foreach($param as $key=>$value)
{
$result[$key] = $value * 2;
}
echo json_encode($result);
调用 jar 包中的指定方法
该特性 2.1.39-alpha.1 之后的版本才支持,请升级到最新版本
cn.apifox.utils.jar 包中代码:
package cn.apifox.utils;
public class Utils {
public Integer add(Integer a, Integer b) {
return a + b;
}
};
脚本代码:
try {
// 调用 cn.apifox.Utils.jar 中的 cn.apifox.utils.Utils.add(Integer, Integer) 方法
const jarResult = pm.execute('cn.apifox.utils.jar', [3, 5], {
className: 'cn.apifox.utils.Utils',
method: 'add',
paramTypes: ['Integer', 'Integer']
})
console.log(jarResult) // 执行结果为:"8"
} catch (e) {
console.error(e.message)
}
运行结果:
常见问题
1. 引用外部程序输出结果时不同系统返回的字符串可能带有不同换行符号
- 可以对要输出的结果进行去除空格与换行符处理
2. 部分系统引用外部脚本,打印中文乱码
- 可以添加以下参数
var result = pm.execute(`hello.go`, [], { windowsEncoding: 'utf-8' })