CData API Server の管理用API利用手順

# はじめに

[CData API Server](https://www.cdata.com/jp/apiserver/)（以下、APIServer）は、ポイント＆クリック操作だけで超高速にMySQLやSQLServerなどのデータベースからWebAPIを自動生成出来る製品です。
最新版のAPIServer（2018/07執筆時点）では、これまで、APIServerの管理者が、管理用コンソールのGUIから手動で行なっていたコネクション・リソース（テーブル）・ユーザーの追加などの作業を、REST-APIから実行出来るようになりました。本記事では、リソースの追加、および、リソースへのアクセス可能なユーザの付与を管理用APIから実行する方法をご紹介します。

# 前提

- CData API Server(Java版)がTomcat上で動作していること
- API実行用ソフトウェア[POSTMAN](https://www.getpostman.com/)が利用出来ること
- [DBVisualizer](https://www.dbvis.com/)などJDBCドライバ経由でのSQLを実行できるツールが利用出来ること

CData API Server(Java版)のTomcatへのデプロイ方法についてはこちらの[1. APIServerのデプロイ環境を構築 【デプロイ機】]
(https://qiita.com/kuwazzy/items/64bf953df24fd52811da#1-apiserver%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89-%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E6%A9%9F)をご覧ください。

# CData APIServerのビルド

[こちらのリンクのビルド](https://s3-ap-northeast-1.amazonaws.com/cdatajwrk/APIServer/KWCD-V/setup.zip)をダウンロードしてご利用ください。

# 管理用APIへのアクセス権限の付与

デフォルトでは管理用APIはオフになっています。下記のweb.xmlファイルをエディタなどで開きます。

```
[tomcatroot]/webapps/apiserver/WEB-INF/web.xml
```

「\<display-name>Restrict direct access to the Management API\</display-name>」 を探し、「\<auth-constraint>」に下記の通り「\<role-name>cdata_admin</role-name>」を追加します。これによって、「cdata_admin」ロールに属するユーザ（具体的には、adminユーザ）が管理用APIにアクセス出来るようになります。

```.xml
  <security-constraint>
    <display-name>Restrict direct access to the Management API</display-name>
    <web-resource-collection>
        <web-resource-name>Management API</web-resource-name>
        <url-pattern>/admin.rsc/*</url-pattern>
        <url-pattern>/admin.rst/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>cdata_admin</role-name>
    </auth-constraint>
  </security-constraint>
```

Web.xmlを変更が完了したらTomcatを再起動してください。

次に、APIServerの管理コンソールにadminユーザでログインして、APIアクセス用の「admin」ユーザを「設定 > ユーザー」タブから追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/35a6e432-72cf-614c-066e-2a928912681f.png)

ユーザーまたはグループには、「admin」、Groupのチェックボックスは不活性、今回は、リソースの追加をPOSTメソッドで行うので、権限のPOSTにはチェックを入れてください。

ユーザを生成すると認証トークンが表示されます。管理用APIにアクセスするためには、この認証キーが必要となりますので手元に控えておりてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/1dd63aaa-a683-be0a-d8be-daca7959f3ae.png)

ついでに、（管理用APIではなく）データソースのリソースへのAPIアクセス用のユーザがなければ追加しておいてください。ユーザー名は任意のもので構いません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/47972e0a-5ed4-1911-b78a-9b7ccc4eb38d.png)

# 接続・およびリソース画面の確認

今回は、既存の接続を使い、リソース（テーブル）を管理用APIで追加したいと思いますので、コネクションがなければ追加してください。また、リソース画面は、空の状態を前提に進めます。

接続画面の例　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/274ad2bc-cfa8-31b7-6ab2-707493dadebf.png)

リソース画面の例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/0dd720cb-f110-aa04-da17-94168fda64d4.png)

# 管理用API仕様書へのアクセス

それでは、下記URLのように「amin.rst」を開いてみましょう。

```
http://localhost:8080/apiserver/admin.rst
```
下記のように、アクセスが拒否される場合は、web.xmlを再確認、および、Tomcatを再起動してみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/21dbf7d6-9be3-bbd6-255d-bfe825b5972c.png)

下記のように管理用のAPI仕様書のページが表示されれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/b8f61a7b-15e4-73c4-bbd7-745839f71008.png)

管理用APIから操作可能なリソースは左下のリンクから詳細を確認することが出来ます。

| リソース | メソッド | 説明|
|:---|:---|:---|
| ActionParameters | GET / POST /PUT /DELETE | アクション（ストアドプロシージャ）のパラメータ |
| Actions | GET / POST /PUT /DELETE | アクション（ストアドプロシージャ） |
| Connections | GET / POST /PUT /DELETE | 接続 |
| Providers | GET | ADO.NETプロバイダ、もしくは、JDBCドライバ |
| ResourceColumns | GET / POST /PUT /DELETE | リソース（テーブル、ビュー）のカラム |
| Resources | GET / POST /PUT /DELETE | リソース（テーブル、ビュー）|
| Users | GET / POST /PUT /DELETE | ユーザー |

# 管理用APIへのアクセス

リソースから「/admin.rsc/Connections」を選択して、右側にHTTPメソッドの詳細が表示されるので、GETメソッドのURLをクリップボードにコピーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/6ada70d2-eecf-8955-1f8f-80a613431932.png)

同一ブラウザの新しいタブで本URLを開くことで、接続（データソースへの接続情報）の一覧を参照することが出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/b910d09b-7b60-4c89-9c8f-28f2e9253435.png)

次に、リソースの追加を管理用APIから実行してみます。追加はPOSTメソッドとなるため、API実行用のソフトウェアとしてPOSTMANから実行します。

| 項目 | 値 |
|:---|:---|
| メソッド | POST |
| URL | http://localhost:8080/apiserver/admin.rsc/Resources/ |
| Headers_key1 | x-cdata-authtoken |
| Headers_Value1 | ************ (adminユーザの認証キーをセット) |
| Headers_key2 | Content-Type |
| Headers_Value2 | application/json;charset=utf-8 |
| Body | 別途下記に記載 |

headersサンプル

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/20acbb53-3e20-92c8-9ed7-a1e088f6a012.png)

Bodyサンプル

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/ce3bcd6b-154b-b842-a523-b6af5fc2aa66.png)

```.json
        {
            "Operations": "GET",
            "Name": "actor",
            "tableName": "actor",
            "Description": "作成、更新、クエリ、および削除actor",
            "RestrictToRole": "",
            "RestrictToUser": "user01",
            "ConnectionName": "MySQL"
        }
```

RestrictToUserに本リソースにアクセス可能なAPIServerのユーザを指定することでリソース毎のアクセス権コントロールが可能となります。

実行します。レスポンスの「Status」が「201 Created」で、レスポンスBodyに追加された情報が表示されれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/f69130ab-79d5-721d-086e-7913826b18ba.png)

それでは、APIServerの管理コンソールで「設定 > リソース」タブを開いて作成されたリソースを開いて確認してみます。APIでのリクエストBodyの内容で作成されたことを確認することが出来れば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/b432810e-1547-2e67-5503-84fa35d6d058.png)

# JDBCドライバからの管理APIの実行

## JDBCドライバのインストール

CData JDBC driver for APIServerを[こちらのリンク](https://s3-ap-northeast-1.amazonaws.com/cdatajwrk/APIServer/MARD-V/setup.zip)からダウンロードしてください。Setup.zipを解凍してsetup.jarを実行してJDBCドライバをインストールします。

## DBVisualizerの設定

DriverManagerにてインストールしたJDBCドライバをロードします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/3c89df1d-d4f0-c3dd-3d5b-a524a5f064de.png)

※Windowsマシンの場合のデフォルトインストールパスは「C:\Program Files\CData\CData JDBC Driver for APIServer 2018J\lib」です。

Connectionを作成します。Driverは先のDriverManagerで作成したDriverを選択して、DatabaseURLには下記の情報をセットします。

```
jdbc:APIServer:URL=http://localhost:8080/apiserver/admin.rsc;AuthToken=*********;
```

※AuthTokenは「admin」ユーザの認証トークンをセットしてください。

Connectして、左側のConnectionリスト内の作成したコネクションを開いていくと「TABLE」に管理用APIのリソース一覧が表示されば、JDBCドライバから、APIServerの管理APIへの接続は成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/1f30cd33-5161-23c2-a702-2e98543b0ae6.png)

SQLCommanderを開いて、下記のSQLを実行してリソースを追加してみます。テーブル名や接続名は環境に合わせて任意のものに変更してください。

```.sql
INSERT INTO Resources
 (Name, ConnectionName, Description, Operations, RestrictToRole, RestrictToUser, tableName) VALUES
 ('actor2', 'MySQL', '', 'GET', '', 'user01', 'actor');
```

SQLの実行がSuccessfulで完了することを確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/cdaca221-56a1-063c-a2da-b5ffb3d8e7b4.png)

APIServerのリソース画面を開き、SQLのInsert文で追加したリソースが表示されていれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/afded247-8654-c83f-c05a-9ab766bd4f94.png)


# まとめ

APIServerの管理用APIを使ってリソース（テーブル）の追加をAPIから実施しました。本APIやSQLをバッチプログラムなどで実行することでAPI管理業務を自動化することが出来ます。