外部程序概述#
定义和基本概念#
外部程序是指存储在 “外部程序目录” 中的可执行代码文件。这些文件可以是:支持的文件类型#
请注意:外部程序在 “沙盒环境” 之外运行,具有访问和操作计算机上其他程序、文件及数据的权限。使用时请确保程序的安全性,谨防潜 在风险。
外部程序目录配置#
调用原理#
调用流程#
Apifox 调用外部程序的过程分为三个核心步骤:命令拼接规则#
完整命令的构成:命令前缀 + 程序路径 + 参数列表
支持的编程语言对照表#
语言 | 命令前缀 | 程序扩展名 |
---|
Java | java -jar | .jar |
Python | python | .py |
PHP | php | .php |
JavaScript | node | .js |
BeanShell | java bsh.Interpreter | .bsh |
Go | go run | .go |
Shell | sh | .sh |
Ruby | ruby | .rb |
Lua | lua | .lua |
Rust | cargo run | .rs |
Windows批处理 | cmd /c | .bat |
PowerShell | powershell | .ps1 |
调用示例#
在 Apifox 中调用外部程序可以使用 pm.executeAsync()
方法,其语法如下,可将其写在接口的 “前置/后置操作” 中:filePath (string): 外部程序路径。
args (string[]): 传递给外部程序的参数,数组中每个字符串代表一个参数。
options (Object): 其它选项设置。
Apifox 会通过 pm.executeAsync()
方法执行外部程序。该方法生成一个命令行,并在子进程中运行指定的外部程序,然后返回该程序的标准输出(stdout)。举个例子,调用 pm.executeAsync('add.py', ['2', '3'])
实际执行的是命令 python add.py 2 3
。假设你有一个 Python 脚本,用于计算两个数字的和。现在,你想在 Apifox 中调用这个外部的 Python 脚本,就可以使用 pm.executeAsync()
方法,具体如下。步骤 1:准备外部程序#
首先,创建一个 Python 文件并将其放到 “外部程序目录” 的根目录下,例如 add.py
,它从命令行参数获取输入并打印结果:外部程序建议先进行单独测试,确保其可以独立运行并产生预期结果,然后再在 Apifox 中调用,例如使用命令行 python add.py 2 3
或 python3 add.py 2 3
运行这个文件,就会打印出结果。步骤 2:在 Apifox 中调用#
在 Apifox 中,可以在 “前置/后置操作” 中创建一个自定义脚本,并通过 pm.executeAsync()
方法调用外部程序,示例如下:传递的参数除了常量/固定值以外,你还可以通过变量的方式进行传递,例如:当你在 Apifox 中发送请求时,会执行这个 JavaScript 脚本,并通过生成的命令调用外部程序 add.py
,以获取外部程序的输出结果,如下图所示:你可以将返回值存储到环境变量,便于后续使用:pm.environment.set('变量名', '变量值');
API 参考#
pm.executeAsync#
推荐使用的方法,支持异步调用,避免阻塞 UI 线程。filePath
(string): 外部程序的路径
args
(string[]): 传递给程序的参数数组
command
(string): 自定义命令前缀(如 python3
)
cwd
(string): 子进程工作目录(默认:外部程序目录)
windowsEncoding
(string): Windows 系统的编码格式(默认:"cp936"
)
className
(string): JAR 包类名
method
(string): JAR 包方法名
paramTypes
(string[]): 方法参数类型
pm.execute (遗留方法)#
不 推荐,建议使用pm.executeAsync
替代此方法,因为pm.execute
会阻塞UI线程。
args
string[] 参数。调用 jar 包中的指定方法时,会使用 JSON.stringify
进行转换。除此之外非 string 类型会进行隐式类型转换自动转换为 string 类型。
windowsEncoding
string Windows 系统用使用的编码格式。非必填,默认为 "cp936"
。
className
string 指定 jar 包中调用的类名,例如 "cn.apifox.Utils"
。非必填。
method
string 指定 jar 包中调用的方法名,例如 "add"
。非必填(className
有值时为必填)。
paramTypes
string[] 指定 jar 包中调用的方法参数类型,例如 ["int", "int"]
。非必填,默认根据参数自动推断。
从pm.execute
迁移到pm.executeAsync
#
由于 pm.executeAsync
的返回值是 Promise 类型,这导致不可以直接将旧代码中的 execute
改为 executeAsync
。 但是可以使用 async/await
方式,在最小改动的前提下,迁移代码。1
将 execute
改为 executeAsync
程序执行#
执行过程#
执行结果判定#
pm.executeAsync
: 通过程序退出码判断执行状态
pm.execute
: 通过标准错误输出判断执行状态
调试方法#
外部程序的输入输出处理#
外部程序可以通过命令行参数获取到执行时从 Apifox 传递的参数。参数传递#
返回值处理#
错误处理#
调试信息#
Java JAR 包调用#
特殊调用机制#
此功能仅支持可直接反射调用的 JAR 包。不支持如 Spring Boot 等需要内部运行时进行反射调用的 JAR 包。
方法调用规范#
参数类型说明#
基本类型:"int"
, "long"
, "boolean"
, "double"
, "float"
, "short"
包装类型:"Integer"
, "Long"
, "Boolean"
, "Double"
, "Float"
, "Short"
数组类型:"int[]"
, "String[]"
, "Integer[]"
等
如果不指定 paramTypes
,系统会自动推断类型: 代码示例#
PHP 示例#
JAR 包示例#
Python 示例#
常见问题与解决方案#
项目配置文件问题#
Python 版本问题#
命令查找问题#
中文编码问题#
Python 编码错误#
问题:Windows 系统下 Python 出现编码相关错误最佳实践建议#
1.
优先使用 pm.executeAsync
而不是 pm.execute