統合Webサービスで
REST APIを公開する
外部サービスへのアクセスでは、IBM iをクライアントとして外部のデータを取得する例を紹介したが、ここでは反対に、IBM iでREST APIを公開して外部からアクセスさせる方法を紹介したい。
API を提供するサーバーとしてIBM iを構成するにはさまざまな方法があるが、ここでは統合Webサービス(以下、IWS)の機能を使用する例を紹介しよう。
IWSで構成するサービスは、SOAPかRESTかを選択できる。RESTを選択した場合はさらに、ILEプログラム(もしくはサービス・プログラム)かSQLを選択する。今回はSQLを使用してデータを公開する手順を見ていくことにする。
RESTにSQLを利用するための前提ソフトウェア(HTTPグループPTF)は、以下となる。今回の画面サンプルは7.3を利用する。
IBM i 7.4 :SF99662 (レベル1以上)
IBM i 7.3 :SF99722 (レベル19以上)
では、データベースの全データをJSON形式で取得するための手順を見ていこう(図表5)。

IWS の構成
まず、http://hostname:2001/HTTPAdminにアクセスして、ログインしておく。続いて表示される画面の「ようこそ」内のIBM iタスク・ページリンクをクリックして、「IBM i タスク」を表示し、さらにIBM Web Ad
ministration for i の「http」をクリックして、表示された画面で「新規Web Servicesサーバーの作成」をクリックする(図表6)。

次の画面では、サーバー名を指定して「次へ」をクリックする(図表7)。

サーバーがlistenするアドレスと使用するポートの指定画面はデフォルトのままで、「次へ」をクリックする。続いてサーバー用サブシステムの指定画面が表示されるが、デフォルトのままで先に進む(図表8)。

サーバージョブの実行に必要なユーザーIDを選択して、「次へ」をクリックする(図表9)。

構成情報のサマリーページが表示されるので、「完了」をクリックして、作成を終了する(図表10)。

Web サービスの配置
次に、作成したWeb サービス・サーバーに新規サービスを配置していく。
RESTFul Webサービスとして、図表11のSQLステートメントを配置していこう。

まず、左側のナビゲーター・バーにある「新規サービスの配置」をクリックする(図表12)。

Web サービスのタイプは「REST」、さらに「SQL as a Web service」を選択する。デフォルト・スキーマ(ライブラリー名)などを適宜指定して、「次へ」をクリックする(図表13)。

リソース名を指定する画面が表示されるので、ここでは「customers」と指定する。ここで指定したものが URIで使用される。指定が終わったら、「次へ」をクリックする(図表14)。

セキュリティの指定画面が表示される。今回はデフォルトのまま、「次へ」をクリックする(図表15)。

RESTで呼び出されるSQL文を追加する画面が表示されるので、表の下にある「追加」ボタンをクリックする(図表16)。

プロシージャー名と実行するSQL文を指定して、画面内部の「続行」をクリックする(図表17)。

追加されたことを確認して、「次へ」をクリックする(図表18)。

今回は全レコードを戻すので、SQL Result typeは「Multi-row result set」を選択して、「次へ」をクリックする(図表19)。

次の画面では、HTTP 要求メソッドに「GET」、返される出力メディア・タイプに「*JSON」をそれぞれ指定して、「次へ」をクリックする(図表20)。

ユーザーを適宜指定して、「次へ」をクリックする(図表21)。

構成が終了したので、「完了」をクリックする(図表22)。

次に表示される画面で最新表示ボタンをクリックし、追加したサービスの状況が「実行中」になれば、設定はすべて完了である。
では実際に、このサービスにブラウザからアクセスしてみよう。URIは、サービスのプロパティをクリックして表示される「ベース・リソースURL」である(図表23、図表24)。


今回はGETの例を紹介したが、もちろんPOST、PUTおよびDELETEメソッドも記述できる。
上記の例は、以下のページを参考に作成した。その他の HTTP メソッドの指定方法も紹介しているので参考にしてほしい。
Create REST APIs based on SQL statements
https://developer.ibm.com/tutorials/creating-rest-apis-based-on-sql-statements/
IBM iは IWS を経由して、ILE プログラム/サービス・プログラム、およびSQL文をWebサービスとして公開できる。これからのマイクロサービスを考えていくうえで、ぜひ知ってほしい機能だ。
ただ、公開といってもインターネットから自由にアクセスさせるというだけでなく、社内で自由にアクセス可能なWebサービスという位置づけでもよい。
IBM i は他のサーバーとは一線を画すと思われがちだが、このWebサービスでアクセスできることを考えれば、これからのマイクロサービス時代においても、その中心を担えるサーバーであると言えるだろう。
さらに数十年に渡って蓄積されたデータを安定的に運用しているDb2 for iをもつIBM iのほうが、他のサーバーより抜きん出ていると言っても過言ではない。
よりオープンな環境への移行
いかがだっただろうか。一口にSQLといっても、思っていたより多くのことがSQLインターフェースを通して実現できると感じられたのではないだろうか。
IBM iではSQLの重要性がますます高まっていくので、これを機会に今回紹介したさまざまな機能をぜひ試してほしい。
今回はとくに触れなかったが、DDSで作成したデータベース・ファイルをSQLで処理できる(ALTER TABLE でフィールドの追加もできる)ように、SQLで作成したテーブルをRPGのF仕様書に指定して使用することもできる。
つまり、RPGがまだ動いているからと言って、DDSを使用したファイル作成手法を今後も残さねばならないわけではまったくない。
データベース・エンジンの機能拡張はSQLを中心に今後も実施されていくことになるので、データベースの作成もDDSからSQL(DDL:Data Definition Language)に移行していくことを検討していきたい。
既存の物理ファイルから、そのファイルを作成するためのSQL文を生成するツールもACSのスキーマで提供されているので、一度試してみてはどうだろうか。
DDSはIBM i特有のソース・ファイルのメンバーに保存されるが、SQL文にすればテキスト・ファイルなどに保存できるので、GitなどのVCS(Version Control System) でバージョン管理することも簡単になる。
UDTFやストアード・プロシージャーを登録する際に使用するCREATE FUNCTIONやCREATE PROCEDUREもテキスト・ファイルに保存可能なので、環境が許せば FF RPGもDDLもCREATE文も、すべてVisual Studio Codeでコーディングおよびバージョン管理することを推奨したい。
今後、外部サーバーおよびWebサービスとの連携は当然のものとして要求されてくる。それに答えるためにも、他システムとの共通言語であるSQLに少しでも慣れておき、開発環境のプラットフォームに依存しないスタンダートな手法に1日も早く移行していきたい。

著者
小川 誠氏
1989年、エス・イー・ラボ入社。その後、1993年にティアンドトラストに入社。システム/38 からIBM iまで、さまざまな開発プロジェクトに参加。またAS/400、IBM iの機能拡張に伴い、他プラットフォ ームとの連携機能開発も手掛ける。IBM i関連の多彩な教育コンテンツの作成や研修、セミナーなども担当。2021年6月から現職。