以sap leonardo做为关键字在微信上搜索,能搜到很多文章。可是我浏览了一下,好像没有发现有从具体编程角度上来介绍的。因此我就贡献一篇。java
开发一个Java程序,用户能够指定一张图片,该Java程序调用SAP Leonardo上训练好的机器学习API,该API会识别该图片,给用户返回一个文本信息,告诉用户识别结果。git
SAP Leonardo Machine Learning - Functional Services
github
点击Product Image Classification API:编程
会看到以下界面。该界面包含了这个API的Model Schema介绍,即您调用API以后,返回的响应结构里包含哪些字段,以及对应的类型(对象或者数组)。界面里包含了一个小型的API调用控制台,您能够直接控制台里选择一个本地图形文件,而后点击Try it out按钮来体验一下API的效果。api
例如我使用了下面这张图片进行测试: 在控制台里看到请求处理成功,API判断出来该图片有97%的可能性是一台notebook。数组
下面咱们须要使用Java程序来调用API。微信
能够看到该SDK是一个基于Gradle的Java项目。您须要下载Maven和Gradle并完成环境变量的配置,这些配置很是基础,在网上有大量资料,这里再也不重复。 完成配置后,使用Eclipse的import功能,将SDK导入到Eclipse里。机器学习
导入完成后如图。红色区域是SDK自带的代码,蓝色区域是Jerry本身手动建立的代码,用于调用API并打印结果。学习
双击根目录下的pom.xml, 将以下依赖关系维护进去: 测试
在项目根目录下执行Maven命令 mvn install, 确保项目成功build。至此,您能够开始编写Java代码使用SAP提供的JDK来调用该机器学习API了。
3. 使用下图的Java代码调用SDK去消费API。SDK封装了底层HTTP请求的发送和响应的解析等细节,使用起来很是简捷。
为简单起见,上图13行我将本地图片文件的绝对地址硬编码进去。上图第八行硬编码的API key来自API控制台:
至此,大功告成,运行程序。。。。。。什么状况?
仔细看过错误消息,很快Jerry就发现了问题出在哪里。上图蓝色下划线就暗示了错误根源。SAP SDK使用了Google发布的一个开源Java库Gson,将API返回的响应反序列化成Java对象。有了Gson,应用程序开发人员无需重复造轮子,只须要定义一些Java类,做为容器存储Gson反序列化的执行结果便可。
咱们再回到API控制台,API响应结构里request字段的类型声明为string。
然而经过测试发现,request字段的内容实际是一个Json对象:
从http://api.sap.com下载的SDK里的代码,Gson容器类Response.java里声明的request字段类型为String,而非对象,所以Gson会抛异常:Expected a string but was BEGIN_OBJECT at line 31 column 15 path $.request 知道了问题根源,改起来就容易了。新建一个Gson容器类Request.java, 而后按照控制台里观察到的request字段的结构,为Request.java维护对应的成员变量。 例如tenantName在API响应结构里是一个String,所以在Java类里的类型是String;files在API响应结构里是一个数组,所以在Java类里的类型为List<String>。
调整完毕以后再次执行,能看到指望的输出结果:经过SDK调用API并打印结果。
若是您不肯意本身手动修改,能够直接从个人github下载修改以后的代码,只须要用您本身的API key替换掉代码中硬编码的key便可。
https://github.com/i042416/ProductImageMLService
更多Leonardo精彩,尽在https://api.sap.com!
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码: