概要編、SQL活用編、国税庁インボイスシステムを使ってみた、に続きi-Cross API関連4回目の掲載となります。
下図のようにi-CrossAPIを用いたREST API作成には前回解説した「①SQLでデータベース検索」、今回解説いたします「②CL/RPGプログラムを利用」の2通り利用が可能です。
外部アプリから要求を受け取るURI(例えばhttp://api.xxx.com/xxxのような文字列)であるエンドポイントと、IBMiで実際に動くREST APIの実態(下図①SQLでデータベース検索、②CL/RPGプログラムを利用)をどのように紐づけるのかが、前回同様i-CrossAPIでのREST API作成の実際です。

動作概要
CL/RPGを活用したREST API作成例として下図「得意先の締め日コードを更新する」例を作成します。
REST APIコール可能な外部アプリが①更新したい得意先番号と更新後の締め日コードを指定して今回作成するREST APIのURI(http://api.xxx.com/xxx・・・のような文字列)をコールすると②REST APIは外部アプリが指定した「得意先番号」と「締め日コード」をパラメータとして取得し③RPGプログラムのパラメータとして渡します。④パラメータを受け取ったRPGプログラムは「得意先番号」が一致するレコードを⑤「締め日コード」で更新します。更新に用いた「得意先番号」と「締め日コード」を⑥自動でjson化し、更新結果としてコール先の外部アプリに返します。

REST API化を意識したRPGプログラム
i-Cross APIはデータの追加、更新、削除などの操作をするREST APIの実態として既存RPGプログラムの一部分を修正し流用が可能です。修正の勘所は入力画面から値入力をしている部分を外部から値をパラメータとして取得するように修正する事です。
例えば今回のように締め日コードを変更したい得意先番号と変更後の締め日コードを下図のように外部から値をパラメータとして得意先番号はP@BANG、締め日コードはP@SIMEとして受け取るバッチ型プログラムに修正します。

RPGを用いたREST APIの設定手順
外部アプリが指定するURI(http://api.xxx.com/xxx・・・のような文字列)をIBMiにiCrossAPIで設定するため、下図のように「①API一覧」から任意の名前でAPIパスを命名します。今回は②のように得意先を意味する「account」と言う名前のパスを設定し、受け渡しするパラメータとして得意先番号を「{id}」、締め日コードを「{code}」として設定しました。今回IBMiは外部アプリからデータ更新を受けるのでHTTPメソッドでは③PUTを用いました。
下図設定は外部アプリがIBMiへリクエストの入口であるURI≒エンドポイントを設定しているだけですので、このエンドポイントが外部アプリからコールされた時、IBMi内でリクエストを満足させる実際の動作が必要です。i-Cross APIではこのIBMi内で動作する実態を④スキーマと呼んでおり、④スキーマ横の「+」記号をクリックしREST APIの実態をIBMiに作成し、受け渡しするパラメータである得意先番号「{id}」、締め日コード「{code}」と紐づけをします。

上図④スキーマ横の「+」記号をクリックすると下図「スキーマの作成」画面が表示されます。「①データソース」としてREST APIを作成したいIBMiを指定し「②スキーマの種類」であるSQL、SQL(GUI)、CL/RPGから今回は「CL/RPG」を選択します。「③スキーマ名称」は何でも良いのですが、accountとしました。

上図「OK」ボタンをクリックすると、下図のような①プログラムを選択し②パラメータを設定する画面が表示されます。「①ライブラリ、プログラム」から使用したいプログラムを選択します。プログラムは得意先番号と締め日コードをパラメータとして使うので「②入出力パラメーター」で得意先番号をid、締め日コードをcodeのようなパラメータ名としました。最後に①で指定したプログラムTOKUPDが存在するライブラリDEMQUERYを③選択ライブラリに、全てのライブラリからドラッグ&ドロップで指定し保存します。

次に下図のように「①APIパス」「/account/{id}{code}」が呼ばれると実際に動く「②スキーマ」accountがPUTメソッドに紐づくように③付近へドラッグ&ドロップします。

ドロップされたスキーマaccountを下図のように①展開し、RPGプログラムであるスキーマaccountが用いる③スキーマパラメータidとcodeと②APIパスパラメータ「{id}{code}」とを紐づけ保存をします。

Swaggerで動作確認
動作確認の前にIBMiで更新前のデータを確認します。今回は1レコード目のデータを更新する事にします。1レコード目のデータは下図のように①得意先番号は01010、②現在の締め日コードは3です。

作成したREST APIの動作確認をi-Cross APIで利用可能なSwaggerで確認可能です。Swaggerは①API一覧から②の三点メニューの③Swaggerから利用します。

下図のように表示されたAPIを①矢印アイコンで展開し「②Try it out」をクリックすると③更新したい得意先番号であるid(今回は01010)と④更新する締め日コード(今回は1へ更新)を指定し「⑤Execute」で実行します。

下図のように①正常終了を示すCode200番と更新内容を返答した「②Resposce Body」が表示されます。「③Curl」コマンドも表示されます。

念のためIBMiで更新後のデータを確認します。下図のように1レコード目の①得意先番号01010の②締め日コードは1に更新されています。(更新前は3だった)

外部アプリの代わりにCurlで動作確認
REST APIをコールする外部アプリの代わりにCurlコマンドで動作確認を行います。前述のようにSwaggerで下記のようにCurlコマンドを提示してくれるので、これを流用します。

上記CurlコマンドをコピーしてWindowsコマンドプロンプトにそのまま張り付けると動かないので下図のようにWSL2のLinux環境のコマンドプロンプトにペーストし、IBMiとのやり取りが詳細に画面表示するように①-vパラメータを付加し、締め日コードを2にし実行をしました。すると③HTTPステータスコード200番が返ってきており更新に成功している事が分かります。④更新結果としてAPIコール時指定した得意先番号であるidと締め日コードであるcodeが返ってきている事も分かります。

まとめ
以上のようにi-Cross APIは既存RPGプログラムを流用し、REST API作成が可能である事を解説致しました。
- 既存RPG流用には外部から値をパラメータとして取得するように修正(バッチPGM化)
- IBMiにURI(エンドポイント)を作成し、マウス操作だけで既存RPGプログラムを流用
- URIから受け取ったパラメータをRPGプログラムのパラメータへ受け渡し
- 実行結果をjson形式で外部アプリへ返信
動画で解説
音声付き約11:00の動画です
関連リンク
お問合せ
https://alpcom.co.jp/contact/
アルファー・コミュニケーションズ公式YouTubehttps://www.youtube.com/channel/UCTqwZsRRpAs9NPTUz2yH3ow/videos