因为公司技术栈和Fate的技术架构的原因,我们最终选择了采用Java去调用接口的方式与FATE平台实现连通。
然而在测试FATE官方提供的API时,却发现了FATE的不少坑。因为现在使用FATE的人并不多的原因,网上完全没有解决方案。很多坑也是多方调查才解决的,在这里记录下,希望对你有所帮助。
1. 测试接口范围
因为我们使用场景比较特殊,我仅测试了以下五个接口,其中/data/upload
和/tracking/component/output/data/download
接口测试失败,其他均正常。
根据其他使用者的反馈,问题也主要出在这两个接口中,其他接口根据官网文档都能调通。
2. upload接口调用方式
1.官方介绍
根据官方文档的介绍,upload接口的调用方式如下:
于是,我选择了通过url直接传参数,将文件变为二进制文件传入的方式。
如图,参数为application/octet-stream类型
最后的结果很明显,失败了。
2. Github ISSUE关键解答
原文链接如下:FATE1.10.0的fate flow Swagger API的/data/upload接口报错 · Issue #4613 · FederatedAI/FATE (github.com)
这里面官方工作人员回答,说可以直接通过application/json
传入文件参数。
虽然这次请求成功了,可是进入Fate管理端发现任务执行失败,通过查询日志定位是文件找不到的问题。
注意截图中文件地址前缀为fateflow说明上传文件的地址默认为Fate所在的机器,说明报错原因是不能上传本地文件。
在此问题解答中,官方人员也说明了这种情况。KeyError: 'file' when using REST API to upload data · Issue #3647 · FederatedAI/FATE (github.com)
也就是说application/json
传入的文件地址参数只能将Fate所在机器的文件上传到Fate中,如果想要上传本地文件至Fate中,需要将use_local_data
参数改为1。
但是亲测,参数改为1接口直接报错。
也就是说,要将本地文件传入Fate平台仍然需要通过application/octet-stream
类型的参数将文件以二进制的形式传入到Fate平台中。
3. 成功的调用方式
亲测只有通过form-data 传入文件和参数才能上传文件,并且上传成功。
3. DownLoad 接口调用方式
这个接口倒是没有上传接口解决起来那么离谱,但我觉得官方文档的误导性太强了。
官方文档介绍如下:
但是使用postman调用尝试失败报错
解决方法非常简单,只需把post方式用get方式即可。
提示
method not allowed
然后尝试改用get请求确实有点合理,但是官方文档明晃晃标注post请求就不太合理了吧。而且我旁边的六年老Java大哥也和我说这么多年第一次见get请求传requestBody参数的。这个接口的请求方式确实挺出乎意料的。
还有一点需要注意,这个方法最后是传回一个文件,需要用send and download
的方式才能下载到压缩文件,只用send
最后会显示一堆乱码而不是下载文件。
如果使用java调用的话,可以参考这篇文档,亲测可用。