调用外部程序
外部程序概述
定义和基本概念
支持的文件类型
.jar
- Java 归档文件.php
- PHP 脚本文件.js
- JavaScript 文件.py
- Python 脚本文件.bsh
- BeanShell 脚本.go
- Go 源代码文件.sh
- Shell 脚本.rb
- Ruby 脚本.lua
- Lua 脚本.rs
- Rust 源代码文件.bat
- Windows 批处理文件.ps1
- PowerShell 脚本文件外部程序目录配置
打开 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 |
调用示例
pm.executeAsync()
方法,其语法如下,可将其写在接口的 “前置/后置操作” 中:
pm.executeAsync()
方法执行外部程序。该方法生成一个命令行,并在子进程中运行指定的外部程序,然后返回该程序的标准输出(stdout)。pm.executeAsync('add.py', ['2', '3'])
实际执行的是命令 python add.py 2 3
。pm.executeAsync()
方法,具体如下。步骤 1:准备外部程序
add.py
,它从命令行参数获取输入并打印结果:
python add.py 2 3
或 python3 add.py 2 3
运行这个文件,就会打印出结果。步骤 2:在 Apifox 中调用
pm.executeAsync()
方法调用外部程序,示例如下:
add.py
,以获取外部程序的输出结果,如下图所示:pm.environment.set('变量名', '变量值');
API 参考
pm.executeAsync
filePath
(string): 外部程序的路径args
(string[]): 传递给程序的参数数组options
(Object): 可选配置项command
(string): 自定义命令前缀(如 python3
)cwd
(string): 子进程工作目录(默认:外部程序目录)env
(Object): 子进程环境变量windowsEncoding
(string): Windows 系统的编码格式(默认:"cp936"
)className
(string): JAR 包类名method
(string): JAR 包方法名paramTypes
(string[]): 方法参数类型
pm.execute (遗留方法)
pm.executeAsync
替代此方法,因为pm.execute
会阻塞UI线程。
filePath
string 外部程序路径args
string[] 参数。调用 jar 包中的指定方法时,会使用 JSON.stringify
进行转换。除此之外非 string 类型会进行隐式类型转换自动转换为 string 类型。options
ObjectwindowsEncoding
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
方式,在最小改动的前提下,迁移代码。将
execute
改为 executeAsync
在方法调用前添加 await 关键字
修改前
修改后
程序执行
执行过程
在控制台显示执行的命令
输出程序的标准输出(stdout)
输出程序的标准错误(stderr)
执行结果判定
pm.executeAsync
: 通过程序退出码判断执行状态pm.execute
: 通过标准错误输出判断执行状态调试方法
外部程序的输入输出处理
参数传递
JavaScript
Python
返回值处理
错误处理
调试信息
Java JAR 包调用
特殊调用机制
1.
2.
方法调用规范
参数类型说明
"int"
, "long"
, "boolean"
, "double"
, "float"
, "short"
"Integer"
, "Long"
, "Boolean"
, "Double"
, "Float"
, "Short"
"String"
"int[]"
, "String[]"
, "Integer[]"
等paramTypes
,系统会自动推断类型:"int"
"double"
"boolean"
"String"
代码示例
PHP 示例
脚本调用
外部程序 PHP 代码
JAR 包示例
脚本调用
外部程序 Java 代码
Python 示例
脚本调用
外部程序 Python 代码
常见问题与解决方案
项目配置文件问题
Python 版本问题
命令查找问题
中文编码问题
Python 编码错误
最佳实践建议
1.
pm.executeAsync
而不是 pm.execute
2.
3.
try-catch
捕获可能的异常4.
5.
修改于 2025-03-03 04:23:21