Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

Java クライント開発における Web API の実装アプローチ:その6 CData Driver編

前回まで 主に各API規格の仕様ベースでアクセスする方法を紹介してきました。

今回はちょっと趣向を変えて、JDBC、つまりデータベースを操作するSQLベースで Web API にアクセスする方法を提供している CData JDBC Driver を紹介します。

最初の記事はこちらから。

bit.ly

CData JDBC Driver って何?

FacebookTwitter 、Dynamics 365 や Salesforce といった 100 を超える クラウドサービス・Web API・NoSQL に JDBC で接続を可能にするという Driver・ライブラリ製品です。

f:id:sugimomoto:20190123143715p:plain

例えば今まで紹介してきた以下の API の注文(orders)テーブルに CData JDBC Driver でアクセスする場合は

https://app.swaggerhub.com/apis/sugimomoto/CDataNorthWindSample/1.0.0

「SELECT * FROM orders」といったSQLの形式で実行するだけで実現可能になります。

f:id:sugimomoto:20190123143726p:plain

CData Driver 内部では リクエストされたSQL を分解し、Web API の HTTP Request に組み立て直し、レスポンスの JSON をレコードセット形式にフォーマット化、クライアントに返すという仕組みです。

実際にCData Driver のログを確認してみると、以下のように SELECT 文が発行された後、HTTP Requestが実行されていることがわかるかと思います。(ログデータは若干省略しています。)

[Connection: 8] Executing query: [SELECT [orders].[order_id], [orders].[order_date],[orders].[customer_id],[orders].[employee_id],FROM [orders]LIMIT 100].
[Connection: 8] [Request] GET https://cdatanorthwindsampleapiserver.azurewebsites.net/api.rsc/orders?$select=order_id%2Corder_date%2Ccustomer_id%2Cemployee_id&$top=100
User Authorized SSL Cert: [TRUSTED] Server Cert: [LS0tLS1CRUdK] Accepted: True
[Connection: 8] [Response] HTTP/1.1 200 OK, 1844 Bytes Transferred
[HTTP Headers]
HTTP Auth Scheme: 3
GET /api.rsc/orders?$select=order_id%2Corder_date%2Ccustomer_id%2Cemployee_id&$top=100 HTTP/1.1
Host: cdatanorthwindsampleapiserver.azurewebsites.net
Accept-Encoding: gzip, deflate
User-Agent: CData Data Provider Engine - www.cdata.com - Accepts: gzip
OData-MaxVersion: 4.0
accept: application/json;odata.metadata=full
x-cdata-authtoken: 1q0E5n7v8V1k4r1U5g0e

[Connection: 8] [Response]
[HTTP Headers]
HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: application/json;charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-Powered-By: CData API Server
OData-Version: 4.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 23 Jan 2019 05:34:37 GMT
{"@odata.context":"hello$metadata#orders","value":[{"order_id": 10248, "employee_id": 5, "order_date": "1996-07-04", "customer_id": "VINET"}]}
[Connection: 8] Page successful: 100 results (1,525 ms).

対象の API

f:id:sugimomoto:20190120000738p:plain

対象の API は今までと一緒です。

https://app.swaggerhub.com/apis/sugimomoto/CDataNorthWindSample/1.0.0

同じようにODataベースの REST API なので、CData JDBC OData Driver を使ってアクセスします。以下からトライアルのダウンロードが可能です。インストール後、Javaプロジェクトでライブラリを参照してください。

https://www.cdata.com/jp/drivers/odata/jdbc/

操作も同じように注文データ(orders)と注文明細データ(order_details)を取得して結合したものをコンソールで出力するというものです。

実装コード

APIに接続する場合の接続文字列は CData OData JDBC Driver 独自のものになります。URIAPIのエンドポイントを指定し、認証部分記述すればOKです。

jdbc:odata:URL=https://cdatanorthwindsampleapiserver.azurewebsites.net/api.rsc;Custom Headers=x-cdata-authtoken:XXXXXXXXX;

実際にOrdersテーブルのとOrderDetailsテーブルにアクセスしたソースコードはこちら。

gist.github.com

以下のリポジトリでもソースコードを公開しています。

github.com

Java クライアントアプリケーションから CData Driver を使うポイント

まずはなんといってもSQLでアクセスできることでしょう。

HTTP動詞やWeb APIのエンドポイントURLなどを意識することなく、データの取得操作が実施できます。

String sql = "SELECT [orders].[order_id], [orders].[order_date],[orders].[customer_id],[orders].[employee_id],[order_details].[discount],[order_details].[product_id],[order_details].[quantity],[order_details].[unit_price]FROM [order_details] LEFT OUTER JOIN [orders] ON [order_details].[order_id] = [orders].[order_id] LIMIT 100;";

Statement stat = conn.createStatement();
boolean ret = stat.execute(sql);

それに加え、ただSELECTするだけではなく、JOINやWhereなど、SQLの規格に則った記述ができるので、各エンドポイントからデータを取得して、それをクライアントサイドでマージするといった処理を書く必要がありません。

また JDBC 規格で提供しているので、スキーマメタデータ情報にもアクセスすることができます。

以下の処理は取得したデータのMetadataからカラム名を特定し、それぞれのカラム名とカラムバリューを取得している行です。

for(int i=1;i<=rs.getMetaData().getColumnCount();i++) {
    System.out.println(rs.getMetaData().getColumnName(i) +" : "+rs.getString(i));
}

終わりに

今回は Java クライアントアプリケーションから接続した例で紹介しましたが、JDBC接続をサポートしているアプリケーションやサービスからも内部に組み込むだけで、アクセス先をDBではなくWeb APIに切り替えるということが可能です。

前回までは各仕様のインターナルな部分におけるエコシステムを中心とした紹介でしたが、こういった外部でも育まれているエコシステムを活用することも一つの選択肢だと思います。

次回は今までの投稿内容をふくめて、まとめに入りたいと思います。(長かった・・・)