CData API Server を使ってみた

2019.10.28

さて今回は CData API Server 2019J を実際にセットアップしてREST APIを公開して動作させてみようと思います。
社内には10年以上前に作成されたようなWebアプリやVBアプリ等がまだまだ稼働しているのではないでしょうか。

そのようなシステムで使われているRDBをREST API公開することで、さまざまなクライアントからでもデータの出し入れができ、社内IT資産の効率化や活性化も期待できるのではないかと思います。

動作環境

サーバ(CData API Server)

OS:VMWare Fusion上のWindows 10

データベースサーバ

RDB:EC2 on MySQL
Data:SuperStoreサンプルデータ

Webサーバ

Mac OSX標準のApache HttpServer

CData API Serverのインストール

.NET EditionとJava Editionがあるのですが、今回はWindows(.NET Edition)をダウンロードしました。

ダウンロードしたらCDataAPIServer.exeを起動して、インストールを開始します。

ライセンスに同意します

次にインストール先を指定します

そのまま「次へ」をクリックします

スタートメニューフォルダを選びます。この辺りもデフォルトのまま次々進めます。

次にCData API Server 2019J にアクセスするためのパスワードを設定します。

「インストール」をクリックして、インストールを開始します。

インストールが完了するとAPI Serverが立ち上がります。

「情報」タブをクリックして導入タイプに合わせて選択します。

次に設定タブをクリックし、「接続の追加」をクリックします。

REST API化したいデータベースを選択します。(ここではMySQLを選択しました)

接続に必要なサーバ情報を入力し、「接続テスト」で疎通確認します。

接続設定が完了しました。

次にリソースタブをクリックして、「リソースの追加」をクリックします。

データ接続が可能な候補の一覧画面が出てきますので、対象を選択して「次へ」をクリックします。

テーブルの一覧画面が出てきますので、REST API化したいテーブルを選んで「次」をクリックします。

次にカラムの一覧が表示されますので、対象とするカラムにチェックを付けます。リソース名はわかりやす名前(ここではOrders)に変更することをオススメします。また操作もチェックボックスで選択できるので適宜変更しましょう。

追加が完了すると一覧画面に先ほど登録したリソースが一覧で表示されます。

これでREST API化の設定は完了です。次に「API」メニューをクリックして画面を遷移します。

リソースの下に/api.rsc/Ordersが出来ているので、そのリンクをクリックします。

GETの部分を展開してみると、Javascriptでのサンプルコードが表示されます。Javascript以外にはcURLも用意されています。

次にREST APIをコールできるユーザを追加します。

ユーザに対してどのメソッドを許可するか?やTokenの有効期限などを設定することができます。

追加が完了すると先ほど登録したユーザが一覧に表示されます。合わせて認証トークンが発行されますので、REST APIをコールする際にはこちらの認証トークンを使ってアクセスします。

これでREST API化のサーバ設定及び認証トークンの発行も完了しましたので、実際REST APIをコールしてレスポンスが得られるかを確認したいと思います。

実際にコールするためのHTMLを準備する

動作確認用のHTMLを作成しました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>サンプル</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

<script>
$.ajax({
    type: 'GET',
    url: 'http://172.16.205.134:8153/api.rsc/Orders/',
    headers: {
        'x-cdata-authtoken':'4zxxxxxxxxxxxxxxxxxy', //実際に発行されている認証トークンを指定します。
        'Content-Type':'application/json;charset=utf-8'
    }
}).done(function(data) {

        $("#myRESTData").html(JSON.stringify(data,null,"\t"));
});

</script>
</head>

<body>
<pre id="myRESTData">

注意点としてはrequest headerにx-cdata-authtokenを追加し、認証トークンを含めておくこと。
それとCData API ServerでCORSの設定を有効にしておくことです。

実行してみる

先ほどのHTMLの実行結果は以下の通り

url: 'http://172.16.205.134:8153/api.rsc/Orders/'

上記のリクエストでは全件を取得してきてしまいます。
CData API Server にはいくつかのパラメータが用意されています。

$select アウトプットするプロパティでカンマで区切られたもの。デフォルトですべてのプロパティはアウトプットとなります。
$filter このエンティティの結果に適用されるフィルタ。例えば、特定のModifiedDate より後に変更されたすべてのアイテムを取得する場合、 "ModifiedDate gt 'yyyy-MM-dd'" の値に$filter を設定します。".
$orderby 結果をオーダーするときに使うプロパティ。
$top 返すアイテムの最大数。
$skip 結果をselectする際のスキップするアイテムの数。

では$filterを使って「2018-12-01」のオーダのデータだけを返すようにしてみます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>サンプル</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

<script>
$.ajax({
    type: 'GET',
    url: 'http://172.16.205.134:8153/api.rsc/Orders/?$filter=orderdate eq "2018-12-01"',
    headers: {
        'x-cdata-authtoken':'4zxxxxxxxxxxxxxxxxxy', //実際に発行されている認証トークンを指定します。
        'Content-Type':'application/json;charset=utf-8'
    }
}).done(function(data) {

        $("#myRESTData").html(JSON.stringify(data,null,"\t"));
});

</script>
</head>

<body>
<pre id="myRESTData">

結果は以下の通り、期待通りの結果レスポンスが返ってきました。

TOP2だけを得たい場合は

url: 'http://172.16.205.134:8153/api.rsc/Orders/?$top=2'

指定したカラム(customercategory,productcategory,productname)のみ取得したい場合は

url: 'http://172.16.205.134:8153/api.rsc/Orders/?$select=customercategory,productcategory,productname',

パラメータを複合的に指定する場合は

url: 'http://172.16.205.134:8153/api.rsc/Orders/?$select=customercategory,productcategory,productname&$top=2',

のように通常のURL変数と同じように&で区切って指定すれば可能です。

期待通りの結果が返ってきてますね。

まとめ

昔から稼働している社内データベースや専用クライアントからしかアクセスできないような主にクラサバで使われているデータベース等を活用する手段としては既存に手を加える必要もないので、CData API Server は非常に導入しやすいのではないかと思います。(当然セキュリティについては考慮が必要となりますが。。。)
またREST APIということもあり、スマホからデータ参照したり、登録したり、プログラマーであれば自身でプログラムを組んでデータの登録したりも出来ますので、既存資産の活用も十分期待できますね。