IBM i にCData API Serverをインストールして30分でREST-APIを作成

CData社のAPI Serverという製品をご存じでしょうか？
CData API Serverを使うとRDB等のデータをノーコードでREST APIとして公開できます。
[https://www.cdata.com/jp/apiserver/](https://www.cdata.com/jp/apiserver/)
Windows（.NET）版とJava版の2種類があります。
IBM iではほとんどの環境でJDKがインストールされているかと思います。
今回はIBM i 上にCData API Serverをインストールしてみました。

## CData API Serverの入手
以下のURLから製品をダウンロードします。
Cross-Platform(Java)を選択します。
[https://www.cdata.com/jp/apiserver/download/](https://www.cdata.com/jp/apiserver/download/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/725e41c5-27b0-227f-a211-bbe5aa7feb3a.png)

## 製品のインストール
### setup.jarをIFS上のディレクトリにアップロードする。
ダウンロードしたファイルにあるsetup.jarをFTPなどでIFS上のディレクトリへアップロードします。
今回は/tempにアップロードしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/51f3708c-40a5-a91e-2dec-a7dad97eeaf0.png)

### インストーラーの実行
setup.jarを実行するにはsshでIBM iに接続するほうがLinuxと同じような感覚で進められますが、sshdが動いていない環境もあるので、今回は5250エミュレーター画面よりQSHELLを使って実行します。

:::note warn
5250エミュレータの接続構成は、英小文字が文字化けしないようコードページを939又は1399にしてください。
:::

ジョブのCCSIDを5035にしてください。
``` CHJOB CCSID(5035) ```

コマンドラインよりQSHと入力して、QSHELLを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/33a527f5-d833-b3c4-203e-61faff979959.png)

setup.jarを実行します。

```shell:QSHELL 
cd /temp 
java -jar setup.jar
```
以下の画面のようにインストラーが起動したら画面の指示に従って進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/329f71e7-aa68-3208-6864-887621c5debe.png)
確認画面で「1」を入力し、実行キーでインストール。
API ServerはデフォルトでIFS上の/opt/apiserverディレクトリにインストールされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/986d9bf2-f579-f7ce-b185-9bdb549c0c95.png)

### JDBC Driverの配置
IBM i へ接続するためにはJDBC Driver(jt400.jar)をAPI Serverに認識させる必要があります。
API ServerのlibディレクトリにDriverを配置することで認識します。
QSHELLからcpコマンドでjt400.jarをコピーします。

```shell:QSHELL
cp /QIBM/ProdData/OS400/jt400/lib/jt400.jar /opt/apiserver/lib
```

---
## API Serverをバッチジョブとして開始する
### 実行ユーザーの作成
API Server実行用のユーザーを作成します。
ユーザーID名は任意です。

```
CRTUSRPRF USRPRF(APISERV) 
          PASSWORD(*NONE)         
          TEXT('CDATA API SERVER')
          SPCAUT(*ALLOBJ *JOBCTL) 
          CCSID(5035)             
          CHRIDCTL(*JOBCCSID)     
```

### 起動用CLプログラム
以下のようなCLプログラムを作成しました。

```:STRAPISERV.CLP
PGM 
  
ADDENVVAR  ENVVAR(JAVA_HOME) + 
           VALUE('/QOpenSys/QIBM/ProdData/JavaVM/jdk80/64bit') +
           CCSID(5035) LEVEL(*JOB) + 
           REPLACE(*YES) 
 
SBMJOB     CMD(QSH CMD('cd /opt/apiserver; java -jar apiserver.jar')) +                
           JOB(APISERV) + 
           JOBQ(QSYS/QSYSNOMAX) USER(APISERV) + 
           CCSID(5035) CPYENVVAR(*YES) ALWMLTTHD(*YES)  
 
ENDPGM 
```

### 起動確認
Web Browserで以下のURLにアクセスしてログイン画面が出ればOKです。
```http://<IBM iのIPアドレス>:8080/```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/d329de7c-7bfb-f36a-94b9-70c077102241.png)

## IBM i のテーブルをAPIとして公開する

### DB接続、API公開
DB接続、APIユーザー、テーブルのAPI登録の手順については、CData様が公開されている[こちらの記事](https://www.cdatablog.jp/entry/apiserver21as400)に掲載されていますので参考にしていただければと思います。

[APIServer : DB2 for IBM i (AS/400)のテーブルをノーコードでWeb API化する](https://www.cdatablog.jp/entry/apiserver21as400)


### さっそくテーブルを１つAPIとして作成
作成といっても、公開したいテーブル、カラムをクリックして選ぶだけ！
(作成したAPI)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/eae32b1f-3161-e1f6-217a-d683062aa6c0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/c70f2fcd-d211-2009-d627-cd2ddf801498.png)

APIとして公開する設定をすると、自動的にAPIのマニュアル(swagger)も自動生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/6213a387-88d2-62a7-5bc5-64b14c1d0987.png)

### 作成したREST APIをVS Codeから叩いてました。
(リクエスト)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/0871c357-3ad4-650f-5aa2-73cad8d9ad9f.png)
（レスポンス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213253/023e76d8-e932-4b8d-a6d6-fa4550adce2d.png)
あっという間にREST APIが出来てしまいました！　

## 今回のまとめ
### IBM i 上でAPI Serverを動かすメリット
IBM i 上でAPI Serverを動作させることのメリットはやはり、追加でWindowsやLinuxサーバーを立てる必要がないことかなと思います。
ノーコードでできてしまうことで超高速にAPI公開できる生産性の高さもすごいです。
また、IBM i は古くてオープンじゃない？と誤解されている方々へのアピールになるかもしれません。

### ユースケースを考えてみる

- Webアプリケーションでの利用
 JavaScriptを使ってWebブラウザからREST APIを呼び出し、IBM i 上のデータとやり取りする。いわゆるAJAXとしての使い方。
  
- Mobileアプリからの利用
 iOSやAndroidアプリからIBM i 上のデータ照会・更新する。
 私の勤め先でもこのパターンでの開発事例があります。
 
- ECシステムなど他システムとの連携処理での活用
 連携する先のシステム側はWeb-APIを叩ける環境があればよい。
 Python, node.js, Goから等、プログラミング言語に依存しない連携手法として使える。

- ODBC,JDBCではセキュリティ上の観点からユーザーにアクセスさせないが、一部のデータのみセキュアな方法で公開したいケース
 ODataをサポートしているアプリケーション(TableauなどのBI製品)に対し、必要なデータをリアルタイムに公開できる。
 Web-APIはhttpによる通信のため、ファイヤーウォールでの制御も容易。

- CLやRPGからIBM i以外のRDBやクラウドサービスと連携する
 今回はIBM i のDBをAPI化しましたが、MySQL, PostgreSQL, SQL Server, OracleなどのDBも同じようにノーコードでAPI化できる。
IBM i に提供されているWeb-APIを叩くSQL関数と組み合わせて使えば、CLやRPGプログラムから他RDBへリアルタイムにアクセスすることができる。

いろいろと活用シーンがありそうですね。
上記のユースケースを今後機会があれば試してみてみたいと思います。