Apifox 教程:如何实现跨语言调用(Java、PHP、Python、Go 等)

news2024/11/30 10:35:48

在一些特定场景下,比如需要在 Apifox 中对文件进行读写、加密、转换格式或者进行其它业务的操作时,仅使用 Apifox 内置的 JS 类库可能无法满足业务需求,这时,就可以借助「外部程序」作为解决方案。

外部程序是保存在「外部程序目录」下的代码文件,可以是 Java 程序归档文件 jar 包,也可以是其他程序的代码源文件,例如 .jar、.py、.php、.js 等后缀的文件。文件需要放到「外部程序目录」下,这个目录可以在页面右上角的「设置 -> 外部程序」中打开。

图片

使用「外部程序」时需要注意两点:

  1. Apifox 版本必须是 2.3.25 或以上才支持调用外部程序。
  2. 外部程序是在「沙盒环境」以外运行的,这意味着它有权限访问你电脑上的其他程序、文件和数据,所以要确保外部程序是安全的。

调用「外部程序」的语法

在 Apifox 中调用外部程序可以使用 pm.executeAsync() 方法,其语法如下,可将其写在接口的「前置/后置操作」中:

await pm.executeAsync(filePath, args, options)

其内各项参数表示如下,更具体的可参考帮助文档里的解释。

  • filePath  (string) : 外部程序路径。
  • args (string[]) : 传递给外部程序的参数,数组中每个字符串代表一个参数。其中,非 string 类型会隐式转换为 string 类型。
  • options  (Object) : 其他选项设置,包括:
    • command (string) : 外部程序的执行命令。非必填,如果不填会自动推断。
    • cwd (string) : 子进程工作目录。非必填,默认为「外部程序目录」。
    • env (Record) : 子进程环境变量。非必填,默认为 {}。
    • windowsEncoding  (string) : Windows 系统用使用的编码格式。非必填,默认为 "cp936"。
    • className (string) : 调用 jar 包中的类名,非必填,详见 jar 包中的方法。
    • method  (string) : 调用 jar 包中的方法名,当 className 有值时为必填项。
    • paramTypes (string[]) : 指定 jar 包中方法参数的类型,默认根据参数自动推断。

在调用外部程序时,Apifox 会启动一个子进程,在里面以命令行的方式运行你指定的外部程序,然后,会把子进程的标准输出 (stdout) 作为外部程序的返回值。

这么说可能有点绕,简单讲就是 Apifox 会根据 pm.executeAsync() 方法里的参数生成一个命令,然后用命令去执行这个外部程序,并捕获输出的结果。例如:脚本 pm.executeAsync('add.py', ['2', '3']) 的实际执行命令为 python add.py 2 3。

举个更具体的例子。

假设你有一个 Python 脚本,用于计算两个数字的和。现在,你想在 Apifox 中调用这个外部的 Python 脚本,就可以使用 pm.executeAsync() 方法,具体如下。

准备外部程序

首先,你需要创建一个 Python 文件并将其放到「外部程序目录」下,例如 add.py,在脚本中,你一般需要处理传入的参数,并生成相应的输出。

# add.pyimport sys
# 从命令行参数中获取两个数字num1 = int(sys.argv[1])num2 = int(sys.argv[2])
# 计算两个数字的和result = num1 + num2
# 将结果打印到标准输出(stdout)print(result)

1 处理传入的参数

外部程序在 Apifox 中是以命令行的方式执行的,所以外部程序只能从命令行中获取到传入的参数。

上述脚本中的 sys.argv 是 Python 用于获取命令行参数的方法。例如使用 pm.executeAsync('add.py', [2, 3]) 调用外部脚本,其实际执行命令为 python add.py 2 3,则在外部脚本 add.py 中,获取参数的方式为: 

# 从命令行参数中获取两个数字num1 = int(sys.argv[1]) // 2num2 = int(sys.argv[2]) // 3

每种编程语言获取命令行参数的方式与该语言的语法相关联,不同的编程语言会有不同的机制来处理命令行参数,举例来说:

  • 在 Python 中,你可以使用 sys.argv 列表来访问命令行参数。
  • 在 JavaScript 中,如果你在 Node.js 环境下运行脚本,你可以使用 process.argv 来获取命令行参数。
  • 在 Java 中,命令行参数可以通过 args[] 参数传递给 main() 方法。

2 生成相应的输出

Apifox 不会捕获函数的返回值 (return) ,而是依赖于程序的标准输出 (stdout) 。

上述脚本里的 print() 作为 Python 的标准输出 (stdout) ,将计算结果输出到控制台或终端,Apifox 会捕获到这个输出结果,所以你将结果打印出来就可以将其返回。其它编程语言如 JavaScript 的 console.log()、Java 的 System.out.println() 也作为标准输出,具体取决于每种编程语言的语法。

外部程序建议先进行单独测试,确保其可以独立运行并产生预期结果,然后再在 Apifox 中调用,例如使用命令行 python add.py 2 3 运行这个文件,就会打印出结果。

图片

其它类型的外部程序,比如要将一个图片文件转成 Base64、读取或保存图片文件、将 Word、PDF 等文件进行加密或者其它一系列你需要的操作,都建议先手动运行程序并检查输出。

在前置/后置操作中调用

外部程序准备好以后,你可以在 Apifox 的「前置/后置操作」中创建一个自定义脚本,然后使用 pm.executeAsync() 方法来调用「步骤一」中的外部程序。以下是一个示例:

// 使用 pm.executeAsync 调用 Python 脚本async function callPythonScript() {    // 外部程序的路径为 add.py    const scriptPath = 'add.py';    // 传递给 Python 脚本的参数,例如两个数字 2 和 3    const args = ['2', '3'];
    try {        // 调用 Python 脚本,并等待结果        const result = await pm.executeAsync(scriptPath, args);        console.log('Result:', result);    } catch (error) {        console.error('Error:', error);    }}
// 调用函数开始执行callPythonScript();

这个示例可以简化成下面这样的:

// 外部程序路径,传递参数const result = await pm.executeAsync('add.py', ['2', '3'])console.log('Result:', result);

传递的参数除了常量/固定值以外,你还可以通过变量的方式进行传递,例如:

// 读取环境变量的值const scriptPath = pm.environment.get('scriptPath')const arg1 = pm.environment.get('arg1')const arg2 = pm.environment.get('arg2')
const result = await pm.executeAsync(scriptPath, [arg1, arg2])console.log('Result:', result);

Apifox 会根据你提供的参数拼接出一个命令字符串,比如这个例子中 pm.executeAsync('add.py', ['2', '3']) 方法拼接成的命令就是:

python add.py 2 3

这跟你在本地运行这个 add.py 文件时使用的命令相一致。

当你在 Apifox 中发送请求时,会执行这个 JavaScript 脚本,并通过生成的命令调用外部程序 add.py,以获取外部程序的输出结果,如下图所示:

图片

在 Apifox 中获取到的返回结果为 String 类型,你可根据实际需要进行类型转换。结果获取到之后,可将结果存储到环境变量中,以供取用,语法参考如下:

pm.environment.set('变量名', '变量值');

常见问题

1 macOS 提示找不到 Python 命令

图片

在 macOS 系统上,默认安装了 Python 3 而不是 Python 2,要执行 Python 脚本,可使用 pm.executeAsync() 方法并设置参数 command 值为 "python3" 来确保使用正确的 Python 版本,例如:

await pm.executeAsync('demo.py', [], { command: 'python3' })

2 部分 Windows 系统返回中文乱码

可设置 windowsEncoding 参数值为 'utf8',例如:

await pm.executeAsync('demo.js', [], { windowsEncoding: 'utf8' })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式 - GPIO编程简介

An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按:本 2019 年博客系列是 ICS 最受欢迎的系列之一,现已更新(2022 年 12 月),以确保内容仍然准确、相关和有用。 本博客是 Integr…

【Mac】Ghost Buster Pro(苹果电脑内存清理专家) v3.2.5安装教程

软件介绍 Ghost Buster pro是一款针对Mac系统的电脑清理和优化工具,可以帮助用户清理系统垃圾、修复注册表错误、卸载不需要的软件、管理启动项等,从而提高系统性能和稳定性。 安装教程 1.打开镜像包,拖动「Ghost Buster Pro」到应用程序中…

当代 Qt 正确的 安装方法 及 多版本切换

此文写于 20240511 首先去网站Index of /official_releases/online_installers下载一个安装器 安装器有什么用? 可以浏览安装版本 安装组件 安装器版本越能 能装的东西越多 现在只能选Qt5 和 Qt6 至于你公司用的Qt4 我也没招 见招时再拆招 安装器 默认国外源 可以换国内…

sql函数--10---In 多个字段

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.普通 in语句查询sqlMyBatis错误写法正确写法ListString[] 2.In多个字段sql案例脚本实例:错误写法:正确写法: MyBatis XML 写法…

[图解]SysML和EA建模住宅安全系统-02

1 00:00:00,900 --> 00:00:02,690 这个就是一个块定义图了 2 00:00:03,790 --> 00:00:04,780 简称BDD 3 00:00:05,610 --> 00:00:08,070 实际上就是UML里面的类图 4 00:00:08,080 --> 00:00:09,950 和组件图的一个结合体 5 00:00:13,150 --> 00:00:14,690 我…

YOLOv9最新改进系列:融合空间信息关注机制(SimAM)于YOLOv9网络,在通道之间和空间位置之间建立更加准确的关联,助力YOLOv9有效涨点!!!

YOLOv9最新改进系列:融合空间信息关注机制(SimAM)于YOLOv9网络,在通道之间和空间位置之间建立更加准确的关联,助力YOLOv9有效涨点!!! 在此之前!先恭喜两位家人!&#xf…

中国当代最具影响力的人物颜廷利:死神(死亡)并不可怕,可怕的是…

中国当代最具影响力的人物颜廷利:死神(死亡)并不可怕,可怕的是… 在中国优秀传统文化之中,汉语‘巳’字与‘四’同音,在阿拉伯数字里面,通常用‘4’来表示; 作为汉语‘九’字&#x…

鸿蒙开发-ArkTS语言-XML

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 鸿蒙开发-ArkTS语言-非线性容器 文章目录 前言 一、XML概述 二、XML生成 三、XML解析 1.解析XML标签和标签值 2.解析XML属性…

引擎:主程渲染

一、引擎发展 二、引擎使用 1.游戏渲染流程 2.3D场景编辑器操作与快捷键 3.节点的脚本组件 脚本介绍 引擎执行流程 物体节点、声音组件\物理组件\UI组件、脚本组件 暴露变量到面板 4.节点的查找 基本查找 this.node:挂载当前脚本的节点A; this.nod…

APP未上架应用市场,微信商户如何轻松开通APP支付?

在移动互联网时代,APP作为企业与用户之间的重要桥梁,其支付功能的完善与否直接关系到用户体验和企业的营收。然而,有些企业可能面临APP尚未上架应用市场的情况,这时如何开通微信APP支付功能呢?(需要超快捷高…

端午节线上活动方案怎么写?

一年一端午,一岁一安康。 如果您想组织端午活动,却不知道如何安排,可以看看何策网,有很多案例参考,仿造模板修改即可。 下面分享一个线上端午节活动策划方案,希望能帮到你! 端午节作为祭祖祈…

汽车线控转向系统介绍

汽车线控转向系统由方向盘总成、转向执行总成和主控制器(ECU)三个主要部分以及自动防故障系统、电源等辅助系统组成。 线控转向系统(Steering-By-Wire),取消了方向盘和转向车轮之间的机械连接部件,彻底摆脱了机械固件的限制,完全由电能来实现…

Postman历史版本安装与runner测试

前言 实际上就是笔者本地做demo,postman使用了最新版本,本身也没问题,不过postman不支持不登录做runner测试了,很多功能必须登录账号才能使用,否则只能使用http工具发送的能力,而postman本身就是一个简单工…

Modbus通讯协议初学

目录 Modbus通讯协议初学什么是Modbus?Modbus用来做什么?4个种类的寄存器协议速记功能码Modbus 报文帧示例解读 Modbus通讯协议初学 什么是Modbus? 顾名思义,它是一个bus,即总线协议。比如串口协议、IIC协议、SPI都是通讯协议。你接触到这种协议,相信你所处的行业是工业方…

远程点击没反应

目录 todesk远程登录后点击没反应 解决方法: 方法1 快捷键: 方法2 界面点击Ctrl Alt Delete todesk,向日葵远程登录后点击没反应 todesk远程登录后点击没反应 解决方法: 方法1 快捷键: Ctrl Alt Delete 方法…

大模型都在用的GQA是什么

论文:Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints 更详细内容直接看原文!!! 摘要 Multi-query attention(MQA)只使用一个键值头,大大加快了解码器推理…

【ArcGIS 小技巧脚本工具】批量修复CAD图层的数据源

当你打开ArcPro文档的时候,看到内容列表满屏红色感叹号。 新手可能会心脏骤停,久经沙场的规划人只会微微一笑。随机选中一个幸运的红色感叹号点击,打开更改数据源对话框,找到它原始的数据源,确定。 but。。。为啥只修复…

C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端

客户端的程序结构前半部分与服务器端基本相同,后半部分也相对简单。相关函数的解释可以参考前文服务器端的内容。有关客户端的内容除个别地方外,就不再做长篇大论的解释。强调一点,如果将此程序移到其它电脑上运行,编译需要releas…

【基于 PyTorch 的 Python 深度学习】6 视觉处理基础:卷积神经网络(2)

前言 文章性质:学习笔记 📖 学习资料:吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容:根据学习资料撰写的学习笔记,该篇主要介绍了卷积神经网络的池化层部分和现代经典网络。…

Echarts旭日图的配置项,强大的层级关系展示图表。

ECharts中的旭日图(Sunburst Chart)是一种数据可视化图表,用于展示层级关系数据。它通常用于呈现树状结构或层级结构的数据,例如组织结构、文件目录结构、地理区域层级等。 旭日图通过圆形的方式展示数据的层级结构,每…