如何用 WebIDE 打开并运行 CRM Fiori 应用

访问 Web IDE url
在 Web IDE 里进行项目 clone 操作: https://<git host name>:8080/#/admin/projects/fnf/customer/cus.crm.opportunity

选择 clone 完毕的项目,点击 Run:
选择 noShellIndex.html:

在项目根目录下添加一个文件: neo-app.json

之后即可成功运行:

neo-app.json 的源代码:
服务器端的 JavaScript, 看下 wikipedia 的介绍:https://en.wikipedia.org/wiki/JavaScript#Server-side_JavaScriptServer-side JavaScript
In December 1995, soon after releasing JavaScript for browsers, Netscape introduced an implementation of the language for server-side scripting with Netscape Enterprise Server.
Since 1996, the IIS web-server has supported Microsoft's implementation of server-side Javascript -- JScript -- in ASP and .NET pages.
Since the mid-2000s, additional server-side JavaScript implementations have been introduced, such as Node.js in 2009.
再看 SAP 的 Server Side(服务器端) JavaScript 解决方案:SAP Extended Application Service 打开 SAP HANA Web-Based Development Workbench:

创建一个新的 package:


创建一个新的 Application:


创建一个新的文件 test.xsjs, 内容如下:

这个 hello world 应用是一个简单的 echo 应用:将用户通过 url 传进来的数据直接输出。测试:

在 SAP 云平台里打开 SAP HANA Web-Based Development Workbench 进行服务器端 JavaScript 的开发。

创建一个新的 package:

创建一个新的 application:


创建一个新的文件 google-distance-api.xshttpdest 用于维护 destination 相关信息:

创建一个 xsjs 文件消费该 destination,获取从 Walldorf 到 Paris 的距离信息:

执行结果:

因为是服务器端 JavaScript,因此在 Chrome 开发者工具里不再能够观察到 Google service 的 http 调用。

以 sap leonardo 作为关键字在微信上搜索,能搜到不少文章。但是我浏览了一下,好像没有发现有从具体编程角度上来介绍的。所以我就贡献一篇。

需求
开发一个 Java 程序,用户可以指定一张图片,该 Java 程序调用 SAP Leonardo 上训练好的机器学习 API,该 API 会识别该图片,给用户返回一个文本信息,告诉用户识别结果。
访问 https://api.sap.com, 点击 API:

SAP Leonardo Machine Learning - Functional Services

点击 Product Image Classification API:

会看到如下界面。该界面包含了这个 API 的 Model Schema 介绍,即您调用 API 之后,返回的响应结构里包含哪些字段,以及对应的类型(对象或者数组)。界面里包含了一个小型的 API 调用控制台,您可以直接控制台里选择一个本地图形文件,然后点击 Try it out 按钮来体验一下 API 的效果。

例如我使用了下面这张图片进行测试:

在控制台里看到请求处理成功,API 判断出来该图片有 97%的可能性是一台 notebook。

下面我们需要使用 Java 程序来调用 API。
前一步骤的 API 控制台的右上角有一个按钮 Download SDK,点击之后将 SDK 下载到本地:

可以看到该 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!

版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/15f4c5e82166e7ed83611ed1d】。文章转载请联系作者。
评论