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

在一些特定场景下,比如需要在 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' })

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tower for Mac:Git管理的新境界

Tower for Mac,让您的Git管理进入新境界!这款专为Mac用户打造的Git客户端,凭借其出色的性能和丰富的功能,成为众多开发者的首选工具。 Tower不仅支持常规的Git操作,如提交、推送和拉取,还提供了许多高级功能…

AR人脸美妆SDK解决方案,让妆容更加贴合个人风格

美妆行业正迎来前所未有的变革,为满足企业对高效、精准、创新的美妆技术需求,美摄科技倾力打造了一款企业级AR人脸美妆SDK解决方案,为企业打开美妆领域的新世界大门。 革命性的人脸美妆技术 美摄科技的AR人脸美妆SDK解决方案,不…

攻略:ChatGPT3.5~4.0(中文版)国内无限制免费版(附网址)【2024年5月最新更新】

一、什么是ChatGPT? 1、ChatGPT的全名是Chat Generative Pre-trained Transformer,其中"chat"表示聊天。"GPT"则是由三部分组成:生成式(generative)意味着具有创造力;预训练&#xff0…

计算机毕业设计 | vue+springboot图书借阅 书籍管理系统(附源码)

1. 开发目的 实现图书的智能化、信息化和简单化;实现图书信息的增加、删除、修改、查找、借阅、还书、收藏的显示操作及实时数据库的提交和更改和对普通用户的增、删、改、查;提高图书管理员工作信息报送及反馈的工作效率,减轻管理员的劳动负…

基于Spring Boot框架实现大学生选课管理系统

文章目录 源代码下载地址项目介绍项目功能界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 教务处管理 开课、开班审批,排课处理,班级操作,选课时间段管理** 使用了sql解决了开课开班的时间段的冲突…

Python的Web框架Flask+Vue生成漂亮的词云图

生成效果图 输入待生成词云图的文本,点击生成词云即可,在词云图生成之后,可以点击下载图片保存词云图。 运行步骤 分别用前端和后端编译器,打开backend和frontend文件夹。前端运行 npm install ,安装相应的包。后端…

再也不用担心 AI 图片脸崩手崩了

如果你经常用 Stable Diffusion 画人物,相信你一定画出过脸崩的图片。这也是目前文生图 AI 工具普遍存在的问题。连 Midjourney V6 也不例外!当它画一个人的时候表现还好,当画面里的人一多,局面就难以控制了。 看,这就…

远动通讯屏的作用

远动通讯屏的作用 远动通讯屏有时有称为调度数据网柜,远动通讯屏具体干啥作用?远动通讯屏是以计算机为基础的生产过程与调度自动化系统,可以对现场的运行设备进行监视和控制、以实现数据采集、设备测量、参数调节以及各类信号报警等各项功能。…

segment anythin 新标注工具 paddleocr训练自己的数据

快递单ocr检测 1.总结2.需求3.方案4.面单定位4.1反转图片扩充数据集4.2新的标注方式4.3json2yolo4.4yolov5推理 5.paddleocr5.1 数据标注5.2 文本检测训练5.3 文本识别训练检测结果 1.总结 按照惯例,先吐槽一下。反正也没人看我比比歪歪。做事全部藏着掖着&#xf…

致力于双碳减排服务——安科瑞推出碳电表

1. 概述 全球首个“碳关税”——欧盟碳边境调节机制于2023年10月启动试运行。自此,首批纳入欧盟碳边境调节机制的6个行业相关产品在出口至欧盟国家时需提供碳排放数据,这会倒逼国内制造业企业加快开展产品碳足迹核查的步伐。以钢铁行业为例,…

怎样把excel表格转换成图片格式?学会这3个Excel小技巧,表格操作不求人,工作效率翻倍

一,前言 excel是办公必备的表格处理软件,每个表格都包含大量的数据和函数逻辑关系,牵一发而动全身。传输excel表格时可以将文件转换成图片或者pdf,这样有利于传输,而且不会改变表格原有的格式。那么怎样才能把excel转…

“告别传统编码:Baidu Comate智能助手引领软件生产力革命”

文章目录 写在前面:Baidu Comate智能编码助手核心功能助力全方位的软件开发支持一、自动化代码生成二、智能代码审查三、实时智能生成完整代码块四、注释生成代码五、对话式生成代码六、生成单元测试七、生成注释八、代码优化九、代码解释十、技术问答 快速上手体验…

家装空间3D建模素材:打造理想家园的必备工具

在家装过程中,设计师和业主往往需要通过3D建模技术来实现对空间的精确规划和设计。3D建模素材作为这一领域的基础元素,为设计师提供了丰富的想象空间,帮助他们更好地呈现业主的期望和需求。 这些3D建模素材可以涵盖各种家装元素,如…

算法day02

1、202. 快乐数 如上题所述: 在该题意规则下,所有的数字变化会有两种情况,其一最后是有的会变化成恒为1的数;其二是有的数会变化会呈现成有规律的环,分别如下图所示: 可以近似的理解为图一就是一个环&#…

VMware虚拟机问题解决方案

1、运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2、卸载VMware的步骤 1)卸载已经安装的VMware 从控制面…

Vuex 和 Pinia 两个状态管理模式的区别

Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。(实际项目中千万不要即用Vuex又用Pinia,不然你会被同事‘’请去喝茶的‘’。 一、安装(常用命令安…

(二十一)springboot实战——Spring AI劲爆来袭

前言 本节内容是关于Spring生态新发布的Spring AI的介绍,Spring AI 是一个面向人工智能工程的应用框架。其目标是将 Spring 生态系统的设计原则,如可移植性和模块化设计,应用到人工智能领域,并推广使用普通的Java对象&#xff08…

ES6语法教程

简介: ECMA European Computer Manufactures Association 欧洲计算机制造商协会,该组织的目标是评估、开发、和认可电信和计算机标准,94年后该组织改名为Ecma国标。 ECMAScript是由Ecma国际通过ECMA-262标准化的脚本程序设计语言 Ecma国…

将Flutter程序打包为ios应用并进行安装使用

如果直接执行flutter build ios: Building com.example.myTimeApp for device (ios-release)...════════════════════════════════════════════════════════════════════════════════No vali…

抖音小店怎么找达人带货的?分享几个成功率超高的沟通话术!

哈喽~我是电商月月 做抖音小店,特别是无货源的商家想要更多的流量,必定会尝试直播卖货,不会自己直播卖货,就会开通精选联盟,在里面找达人合作 那精选联盟到底是怎样找达人带货的呢? 有的达人打招呼了根本…