Apifox 帮助文档
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
  1. 使用脚本
  • 帮助中心
  • 更新日志
  • 入门
    • 产品介绍
    • 联系我们
    • 私有化部署
  • 开始使用
    • 下载 Apifox
    • 注册与登录
    • 页面布局
    • 基本概念
    • 快速上手
      • 概述
      • 新建接口
      • 发送接口请求
      • 快捷请求
      • 添加断言
      • 新建测试场景
      • 分享 API 文档
      • 了解更多
    • 基础知识
      • 接口基本信息
        • 请求 URL 与方法
        • 请求参数与请求体
        • 请求头
        • 请求参数编码解码
        • HTTP/2
      • 认证与授权
        • 概述
        • 支持的授权类型
        • Digest Auth
        • OAuth 1.0
        • OAuth 2.0
        • Hawk Authentication
        • Kerberos
        • NTLM
        • Akamai EdgeGrid
        • CA 和客户端证书
      • 响应与 Cookie
        • 概述
        • API 响应
        • 创建和发送 Cookie
        • 实际请求
        • 提取响应示例
      • 请求代理
        • 网页端中的请求代理
        • 分享文档中的请求代理
        • 客户端中的请求代理
      • API Hub
        • API Hub
    • 导入导出数据
      • 概述
      • 手动导入
      • 定时导入
      • 导入设置
      • 导出数据
      • 其它方式导入
        • 导入 OpenAPI/Swagger
        • 导入 Postman
        • 导入 Apipost
        • 导入 Eolink
        • 导入 cURL
        • 导入 Markdown
        • 导入 Insomnia
        • 导入 apiDoc
        • 导入 .har 文件
        • 导入 knife4j
        • 导入 NEI
        • 导入小幺鸡(docway)
        • 导入 Apizza
        • 导入 WSDL
  • 设计 API
    • 概述
    • 新建 API 项目
    • 接口基础知识
    • 请求体多示例配置
    • 响应组件
    • 常用字段
    • 全局参数
    • 历史记录
    • 批量管理
    • 数据模型
      • 概述
      • 新建数据模型
      • 通过 JSON 等生成
      • 高级数据类型
      • 构建数据模型
    • 鉴权组件
      • 概述
      • 创建鉴权组件
      • 使用鉴权组件
      • 在线文档中的鉴权组件
    • 高级功能
      • 接口字段
      • 接口状态
      • 关联测试场景
      • 参数列表外观
      • 接口唯一标识
  • 开发和调试 API
    • 概述
    • 生成请求
    • 发送请求
    • 请求历史
    • 接口用例
    • 动态值
    • 校验响应
    • 文档模式/调试模式
    • 生成代码
    • 环境和变量
      • 概述
      • 全局/环境/临时变量
      • 环境与服务
      • Vault Secrets(密钥库)
        • 功能简介
    • 前后置操作&脚本
      • 概述
      • 断言
      • 提取变量
      • 等待时间
      • 数据库操作
        • 概述
        • MongoDB
        • Redis
        • Oracle
      • 使用脚本
        • 概述
        • 前置脚本
        • 后置脚本
        • 公共脚本
        • pm 脚本 API
        • 使用 JS 类库
        • 响应数据可视化
        • 调用外部程序
      • 脚本示例
        • 断言示例
        • 脚本使用变量
        • 脚本读取/修改接口请求信息
      • 常见问题
        • 如何获取动态参数的真实值并加密?
        • 脚本运行后,提取的数字(bigint)精度丢失应该如何处理?
    • API 调试
      • GraphQL 调试
      • WebSocket 调试
      • Socket.IO 调试
      • SSE 调试
      • SOAP/WebService
      • gRPC 调试
      • 使用请求代理调试
      • Dubbo 调试
        • 新建 Dubbo 接口
        • 调试 Dubbo 接口
        • Dubbo 接口文档
      • TCP(Socket)
        • Socket 接口功能简介
        • 报文数据处理器
  • Mock 数据
    • 概述
    • 智能 Mock
    • 自定义 Mock
    • Mock 优先级
    • Mock 脚本
    • 云端 Mock
    • 自托管 Runner Mock
  • 自动化测试
    • 概述
    • 编排测试场景
      • 新建测试场景
      • 测试步骤间传递数据
      • 测试流程控制条件
      • 从接口/用例同步数据
      • 跨项目导入接口/用例
      • 导出测试场景数据
    • 运行测试场景
      • 运行测试场景
      • 批量运行测试场景
      • 数据驱动测试
      • 定时任务
      • 管理其它项目接口的运行环境
    • 测试报告
      • 测试报告
    • API 测试
      • 集成测试
      • 性能测试
      • 端到端测试
      • 回归测试
    • Apifox CLI
      • 概述
      • 安装和运行 CLI
      • CLI 命令选项
    • CI/CD
      • 概述
      • 与 Jenkins 集成
      • 与 Gitlab 集成
      • 与 Github Actions 集成
      • 与其它更多 CI/CD 平台集成
  • 发布 API 文档
    • 概述
    • 快捷分享
    • 查看 API 文档
    • 发布文档站
    • 页面布局设置
    • 自定义域名
    • AI 相关特性
    • 高级设置
      • 文档站搜索设置
      • 跨域代理
      • 文档站接入 Google Analytics
      • SEO 设置
      • 文档左侧目录设置
      • 文档可见性设置
      • 在线 URL 链接规范
    • API 版本
      • 创建 API 版本
      • 发布 API 版本
      • 快捷分享 API 版本
      • 功能简介
  • 迭代分支
    • 功能简介
    • 新建迭代分支
    • 在迭代分支中改动 API
    • 在迭代分支中测试 API
    • 合并迭代分支
    • 管理迭代分支
  • 管理中心
    • 入驻清单
      • 了解基本概念
      • 团队入驻
    • 管理团队
      • 团队基本操作
      • 团队成员管理
      • 成员角色与权限设置
      • 团队资源
        • 通用 Runner
        • 请求代理 Agent
        • 团队变量
      • 实时协作
        • 团队协作
    • 管理项目
      • 项目基本操作
      • 项目成员管理
      • 通知设置
        • 功能简介
        • 通知对象
        • 通知事件
      • 项目资源
        • 数据库连接
    • 管理组织
      • 单点登录(SSO)
        • 功能简介
        • 为组织配置单点登录
        • 管理用户账号
        • 将组映射到团队
        • Microsoft Entra ID
      • SCIM 用户管理
        • 功能简介
        • Microsoft Entra ID
      • 组织资源
        • 自托管 Runner
  • IDEA 插件
    • 快速上手
    • 生成接口文档
    • 生成数据模型
    • 配置
      • 全局配置
      • 项目内配置
      • 可配置规则
      • 脚本工具
      • Groovy 本地扩展
    • 进阶配置
      • 注释规范说明
      • 框架支持
    • 常见问题
      • 常见问题
  • 浏览器扩展
    • Chrome
    • Microsoft Edge
  • Apifox MCP Server
    • 概述
    • 通过 MCP 使用 Apifox 项目内的 API 文档
    • 通过 MCP 使用公开发布的 API 文档
    • 通过 MCP 使用 OpenAPI/Swagger文档
  • 最佳实践
    • 概述
    • 接口之间如何传递数据
    • 登录态(Auth)如何处理
    • 接口签名如何处理
    • 如何加密/解密接口数据
    • Jenkins 定时触发任务
    • 如何计算 AI 问答成本
    • 与其他成员共用数据库连接配置
    • 通过 CLI 运行包含云端数据库连接配置的测试场景
    • 通过 Runner 运行包含云端数据库连接配置的测试场景
  • 账号&应用设置
    • 账号设置
    • 语言设置
    • 网络代理
    • 快捷键
    • 数据备份与恢复
    • 更新 Apifox
    • API 访问令牌
  • 身份验证 & Auth 鉴权指南
    • 什么是 API Key
    • 什么是 Bearer Token
    • 什么是 JWT
    • 什么是 Basic Auth
    • 什么是 Digest Auth
    • 什么是 OAuth 1.0
    • 什么是 OAuth 2.0
      • 什么是 OAuth 2.0
      • 授权码授权类型
      • 授权码授权类型,带有 PKCE
      • 隐式授权类型
      • 密码凭证授权类型
      • 客户端凭证授权类型
  • 服务与隐私协议
    • 服务协议
    • 隐私协议
    • 服务等级协议
  • 参考资料
    • API 设计优先理念
    • JSON Schema 介绍
    • JSONPath 介绍
    • XPath 介绍
    • Apifox Markdown 语法
    • CSV 格式规范
    • 正则表达式
    • 安装 Java 环境
    • Runner 运行环境
    • 常见编程语言对应的数据类型
    • Socket 粘包和分包问题
    • 词汇表
    • 目录链接汇总
    • Apifox Swagger 扩展
      • 概述
      • x-apifox-folder
      • x-apifox-status
      • x-apifox-name
      • x-apifox-maintainer
    • Apifox JSON Schema 扩展
      • 概述
      • x-apifox-mock
      • x-apifox-orders
      • x-apifox-enum
    • 动态值表达式
  • 常见问题
  1. 使用脚本

调用外部程序

外部程序概述#

定义和基本概念#

外部程序是指存储在 “外部程序目录” 中的可执行代码文件。这些文件可以是:
Java 程序归档文件(JAR 包)
其它编程语言的源代码文件
可执行脚本文件

支持的文件类型#

支持以下文件格式:
.jar - Java 归档文件
.php - PHP 脚本文件
.js - JavaScript 文件
.py - Python 脚本文件
.bsh - BeanShell 脚本
.go - Go 源代码文件
.sh - Shell 脚本
.rb - Ruby 脚本
.lua - Lua 脚本
.rs - Rust 源代码文件
.bat - Windows 批处理文件
.ps1 - PowerShell 脚本文件
请注意:外部程序在 “沙盒环境” 之外运行,具有访问和操作计算机上其他程序、文件及数据的权限。使用时请确保程序的安全性,谨防潜在风险。

外部程序目录配置#

1
打开 Apifox 应用
2
点击页面右上角的 “设置”
3
在弹出的面板中选择 “外部程序” 选项
4
设置或查看外部程序目录位置
CleanShot 2024-11-29 at 11.59.39@2x.png

调用原理#

调用流程#

Apifox 调用外部程序的过程分为三个核心步骤:
1
命令拼接:根据用户提供的参数构建完整的命令字符串
2
命令执行:启动子进程运行构建的命令
3
结果返回:捕获并返回程序的标准输出

命令拼接规则#

完整命令的构成:命令前缀 + 程序路径 + 参数列表
示例:

支持的编程语言对照表#

语言命令前缀程序扩展名
Javajava -jar.jar
Pythonpython.py
PHPphp.php
JavaScriptnode.js
BeanShelljava bsh.Interpreter.bsh
Gogo run.go
Shellsh.sh
Rubyruby.rb
Lualua.lua
Rustcargo run.rs
Windows批处理cmd /c.bat
PowerShellpowershell.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 运行这个文件,就会打印出结果。
image.png

步骤 2:在 Apifox 中调用#

在 Apifox 中,可以在 “前置/后置操作” 中创建一个自定义脚本,并通过 pm.executeAsync() 方法调用外部程序,示例如下:
传递的参数除了常量/固定值以外,你还可以通过变量的方式进行传递,例如:
当你在 Apifox 中发送请求时,会执行这个 JavaScript 脚本,并通过生成的命令调用外部程序 add.py,以获取外部程序的输出结果,如下图所示:
image.png
外部程序应先独立测试,确保能按预期输出结果。
返回结果为字符串类型,可根据需要进行转换。
你可以将返回值存储到环境变量,便于后续使用:pm.environment.set('变量名', '变量值');
更具体的例子可参考这篇最佳实践《如何在 Apifox 中调用其他语言(Java、PHP、Python、Go 等)》

API 参考#

pm.executeAsync#

推荐使用的方法,支持异步调用,避免阻塞 UI 线程。
语法
参数说明
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 Object
windowsEncoding string Windows 系统用使用的编码格式。非必填,默认为 "cp936"。
className string 指定 jar 包中调用的类名,例如 "cn.apifox.Utils"。非必填。
method string 指定 jar 包中调用的方法名,例如 "add"。非必填(className有值时为必填)。
paramTypes string[] 指定 jar 包中调用的方法参数类型,例如 ["int", "int"]。非必填,默认根据参数自动推断。
返回:string

从pm.execute迁移到pm.executeAsync#

由于 pm.executeAsync 的返回值是 Promise 类型,这导致不可以直接将旧代码中的 execute 改为 executeAsync。 但是可以使用 async/await 方式,在最小改动的前提下,迁移代码。
具体操作如下:
1
将 execute 改为 executeAsync
2
在方法调用前添加 await 关键字
修改前
修改后

程序执行#

执行过程#

执行外部程序时,系统会:
1
在控制台显示执行的命令
2
输出程序的标准输出(stdout)
3
输出程序的标准错误(stderr)
image.png

执行结果判定#

pm.executeAsync: 通过程序退出码判断执行状态
pm.execute: 通过标准错误输出判断执行状态

调试方法#

可将控制台显示的命令复制到终端中直接执行
利用标准错误输出进行调试信息输出

外部程序的输入输出处理#

外部程序可以通过命令行参数获取到执行时从 Apifox 传递的参数。

参数传递#

参数通过命令行方式传递,各语言获取方式示例:
JavaScript
Python
image.png

返回值处理#

程序可通过 “标准输出” 返回结果:

错误处理#

调试信息#

Java JAR 包调用#

特殊调用机制#

此功能仅支持可直接反射调用的 JAR 包。不支持如 Spring Boot 等需要内部运行时进行反射调用的 JAR 包。
JAR 包调用有两种方式:
1.
默认方式:调用 Main 类的 main 方法
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 包示例#

点击下载 cn.apifox.utils.jar 示例包
脚本调用
外部程序 Java 代码

Python 示例#

脚本调用
外部程序 Python 代码

常见问题与解决方案#

项目配置文件问题#

问题:Rust 或 Go 项目找不到配置文件
解决方案:

Python 版本问题#

问题:MacOS 默认使用 Python3
解决方案:

命令查找问题#

问题:系统提示找不到命令
解决方案:
1.
安装相应的程序
2.
确保程序路径已添加到系统 PATH
3.
Java 环境配置参考安装文档

中文编码问题#

问题:Windows 系统下中文显示乱码
解决方案:

Python 编码错误#

问题:Windows 系统下 Python 出现编码相关错误
image.png
解决方案:

最佳实践建议#

1.
优先使用 pm.executeAsync 而不是 pm.execute
2.
总是进行错误处理
3.
使用 try-catch 捕获可能的异常
4.
为跨平台兼容性考虑编码问题
5.
谨慎处理用户输入,避免命令注入风险
修改于 2025-03-03 04:23:21
上一页
响应数据可视化
下一页
断言示例
Built with