1. 程式人生 > >使用Java程序消費SAP Leonardo的機器學習API

使用Java程序消費SAP Leonardo的機器學習API

在哪裏 替換 圖1 pom.xml gson 選擇 完成 判斷 ear

以sap leonardo作為關鍵字在微信上搜索,能搜到不少文章。但是我瀏覽了一下,好像沒有發現有從具體編程角度上來介紹的。所以我就貢獻一篇。

技術分享圖片

需求

開發一個Java程序,用戶可以指定一張圖片,該Java程序調用SAP Leonardo上訓練好的機器學習API,該API會識別該圖片,給用戶返回一個文本信息,告訴用戶識別結果。

  1. 訪問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。

  1. 前一步驟的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了。

技術分享圖片

  1. 使用下圖的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

技術分享圖片
調整完畢之後再次執行,能看到期望的輸出結果:通過SDK調用API並打印結果。

技術分享圖片
如果您不願意自己手動修改,可以直接從我的github下載修改之後的代碼,只需要用您自己的API key替換掉代碼中硬編碼的key即可。

https://github.com/i042416/ProductImageMLService

更多Leonardo精彩,盡在https://api.sap.com!

技術分享圖片

要獲取更多Jerry的原創技術文章,請關註公眾號"汪子熙"或者掃描下面二維碼:

技術分享圖片

技術分享圖片

使用Java程序消費SAP Leonardo的機器學習API