こんにちは、特派員のI.Mです。
今回はAPIのお話です。

 

※この記事は 『CRESCO Advent Calendar 2017』 4日目の記事です。

SAP API Business Hub

SAP API Business Hubをご存知でしょうか?
所謂APIのカタログサイトで、SAPやそのパートナーが公開しているAPIの情報が閲覧できたり、トライできる環境です。
既に学習済みのモデルですがSAP Leonardo Machine Learningの一端がここで体験できます。
(利用にはSCNアカウントの作成(無料)が必要です)

トップページのAPIsから”SAP Leonardo Machine Learning – Functional Services”のパネル、”ARTIFACTS”から利用可能なAPIの一覧が表示されます。

Version:Alphaですが、Language Detection(言語検出)をみてみましょう。
実はAPIコールだけなら、このサイトから可能になっています。

“Language Detection API”をクリックすると、APIの詳細画面が表示されます。
試用環境(sandbox)のAPI Endpoint(URL)、実行用URIなどが記載されていますが、”Expand Operations”をクリックするとResponseのスキーマや、Requestパラメータなどが確認できます。
パラメータを埋めて[Try it out!]ボタン(ログイン未済なら[Login to Try out])を押せば、すぐに実行されます。

ちゃんとドイツ語(de/German)と検出されていますね。
(”Ich bin ein Japaner.”:「私は日本人です」の独訳。 powered by Google翻訳)

SAP API Business Hubで、コードの生成

最近はコードの自動生成ができる開発環境やライブラリなどが増えてきていますが、SAP API Businesss Hubも対応しているようです。
(SAPのPaaSでは標準の環境で、Java Applicationをサポートしているので以降Javaのコードです)
APIのURIの右側にある”Generate Code”をクリックするとコード生成ダイアログが表示されます。

生成されたコードは完全にJava標準ですね。。。
ご丁寧にtry-catchしてくれていますが、52行あります。
これ、このまま使う人いるのでしょうか…???
RESTful APIをJavaで開発するためJAX-RSの仕様が定められ、準拠したライブラリがいくつか公開されています。
これらを利用すると手順が簡略化されているはずなのでそれらを利用したいところですよね。

Postmanで、コード生成

Web APIのクライアントテストツールであるPostmanにもコード生成機能があります。
PostmanでこのAPIを実行してコードの生成メニューを確認したところ、UnirestとOK HTTPが選択できるようです。

Unirestは軽量(Lightweight)なライブラリで、PHPやRubyでも(同様のコード/使い勝手で?)使えるとか。
クライアントのインスタンスを作成することなくstaticなPOSTメソッドから、さらにチェーンしてリクエストheaderやbodyを追加していますので、コード量は少なくなっていますね。
内部でApache HttpClientのライブラリを使用しているようです。

HttpResponse response = Unirest.post("https://sandbox.api.sap.com/ml/languagedetection/language")
.header("content-type", "application/json")
.header("accept", "application/json")
.header("apikey", "********************************")
.body("{ \"message\": \"Ich bin ein Japaner.\"}")
.asString();

OK HTTPはAndroidの開発者に人気のライブラリのようです。
クライアントのインスタンスを作成し、リクエストのインスタンスにheaderやbodyを入れ、最後に実行してレスポンスのインスタンスを取得する、これぞJava!という感じの使い方ですね。
余計な手順もそこそこ排除されていて標準よりは断然コード量が少なくなります。

OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{ \"message\": \"Ich bin ein Japaner.\"}");
Request request = new Request.Builder()
.url("https://sandbox.api.sap.com/ml/languagedetection/language")
.post(body)
.addHeader("content-type", "application/json")
.addHeader("accept", "application/json")
.addHeader("apikey", "********************************")
.build();
Response response = client.newCall(request).execute();

※自動で付与される(設定で付与のON/OFF切替可)リクエストheader”cache-control”と”postman-token”は除去しています。

その他のWebAPI Clientライブラリ

他に代表的なものには、先ほど言及したApache HttpClientライブラリや、Jerseyなどがあります。
Jerseyは、Javaの生みの親であるサン・マイクロシステムズ(現在はオラクルが開発元)によって実装されています。
このJerseyのサンプルコードを紹介します。

Client client = ClientBuilder.newClient();
// Header
MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
headers.putSingle("Content-Type", "application/json");
headers.putSingle("Accept", "application/json");
headers.putSingle("APIKey", "********************************");
// body
String body = "{ \"message\": \"Ich bin ein Japaner.\"}";
// request
String response = client.target("https://sandbox.api.sap.com/ml/languagedetection")
.path("/language")
.request().headers(headers)
.post(Entity.entity(body, MediaType.APPLICATION_JSON), String.class);
System.out.println(response);

記載方法はOK HTTPに似ていますが、JAX-RSのリファレンス実装なのでライブラリ名(jersey)はクラス名にもパッケージにも出てきません。

Spring FrameworkのRESTful API Clientとして、RestTemplateWebClientがあります。
Spring Frameworkと言えばPivotal
SAPはPivotalが主導してきたCloud Foundryのメンバーシップに参画(Platinum Member)し、PaaSにもCloud Foundryを採用したりしていることから、Spring Framework活用の流れも発生していることでしょう。
いずれ試してみたいと思います。

Swagger(Open API)にも対応

SAP API Business Hubに話が戻りますが、このサイトの各APIの右上にある[Download API]ボタンを押すと、Swaggerに準拠したJSONかYAML形式のWebAPI仕様ドキュメントを取得することができます。
生成されるJavaのコードは少し残念でしたが、これをSwaggerのFrameworkにインポートすればクライアントのコード生成も可能でしょう。

SAPはSwaggerをベースにRESTful APIの記述標準化団体であるOpen API Initiativeのメンバーにも名を連ねています。Webの分野ではSAPも完全にオープン技術のエコシステムに組み込まれてきている証ですね。