RPG開発者のためのIBM i モダナイゼーション入門!
RDi とWeb APIで新しい開発の世界を楽しもう - 第 6 回 -
はじめに
出村:「前回は、Web APIとはなにかについてお話しました。実際に、IWSサーバーの作成やサンプルAPIを試しましたがどうでしたか?」
松田:「IBM i において、新しい世界が見えた気がしました。APIをうまく活用できればお客様ごとの悩みも解決できそうですよね!」
渡邊:「そうですね。特に、事例にあったLINEとの連携などはエンドユーザーからも馴染みの深いアプリなので今後どんどん増えそうですよね。」
出村:「IWSで作成できるAPIには、SQLで作る方法とILE RPGで作る方法の2種類があります。まずは、SQLで作成する方法からやってみましょう!」
前提
出村:「BDSYAINPという物理ファイルから、社員番号で検索し、社員名とカナとメールアドレスを抽出するAPIを作成します。物理ファイルの定義は以下の通りです。この後の実践で実際に、社員番号100番のデータを使用します。本記事を見ながら試される方は、社員番号100番のデータは作成しておきましょう。」
■物理ファイルの定義
ライブラリ:TSTAPI(ライブラリはお手元の環境で作成ください。)
物理ファイル:BDSYAINP

社員マスタファイルのソース内容は、下記よりダウンロードいただけます。
物理ファイル作成に関して、下記SQL文の実行でも作成が可能です。
【BDSYAINP】
CREATE TABLE TSTAPI.BDSYAINP (
SYAIBN NUMERIC(4, 0) NOT NULL DEFAULT 0 ,
SYAINM CHAR(30) CCSID 5026 NOT NULL DEFAULT '' ,
SYAIKN CHAR(20) CCSID 5026 NOT NULL DEFAULT '' ,
MAILMA CHAR(64) CCSID 290 NOT NULL DEFAULT '' ,
PRIMARY KEY( SYAIBN ) )
RCDFMT BDSYAINR ;
INSERT INTO TSTAPI.BDSYAINP (SYAIBN, SYAINM, SYAIKN, MAILMA)
VALUES
(99, '関戸 音葉', 'セキド オトハ', 'G7OM4HTO@test.com'),
(100, '飯塚 麻世' , 'イイツカ マヨ', 'IdaK47Vm@test.org'),
(101, '久野 晴菜', 'クノ ハルナ', 'k7Az3k@sample.co.jp')
;
REST APIをSQLで実装する
出村:「まず、今回作成するAPIのリクエストURLは以下のようになります。設定の中で定義していきますが、少し解説すると【syaininfo2】がAPIの名称で、syainnoというパラメータを受け取って結果を返してくれます。」

松田:「いよいよですね。リクエストの結果として得られるJSONはどのようなものですか?」
出村:「良い質問ですね。結果として得られるJSONは以下を想定しています。【syainno=xxx】でリクエストした社員番号に対する応答として、社員名とカナとメールアドレスがレスポンスとして得られます。」

渡邊:「では、早速始めましょう。」
出村:「まず、IBM Web Administrator for i を開き(※)、Application Serverのタブをクリックします。上部メニューから前回作ったIWSサーバを選択しましょう。次に左側のメニューから、【新規サービスの配置】をクリックします。」
※接続用URL
http://(サーバーのIPアドレス):2001/HTTPAdmin

出村:「次に、Webサービス・タイプの指定で【REST】を確認し、Webサービス実装の指定で、【WebサービスとしてのSQL】を選択します。」

松田:「Webサービス・タイプには【SOAP】もあるのですね。」
出村:「今ではRESTが主流になり、SOAPが使われることが少なくなりました。通信相手がSOAPしか対応していない場合は、SOAPで作る必要があります。今回はRESTで進めましょう。【データベースシステム】はDBがある場所を指定します。今回は同一サーバー内なので、【localhost】のままで、【デフォルト・スキーマ】と【ライブラリリスト】には、今回のDBが配置されているライブラリ【TSTAPI】を指定しましょう。命名規則は業界標準の【*SQL】のままで良いので、【次へ】をクリックします。」

出村:「次の画面では、リソース名を指定します。リクエスト時のURLの一部になりますので、考慮した名前を付けましょう。ここでは、【syaininfo2】を指定し【次へ】をクリックします。」
渡邊:「確かにリクエストの一部になるのであれば、わかりやすい名前にしておく必要がありますね。」
出村:「はい。本番のREST APIサーバを作るときは、複数のリクエストをやり取りするのが一般的ですから、後から分からなくならないようにしたいですね。」


出村:「次の画面では、通信方法と認証方式を指定します。セキュア転送は【はい】にするとリクエストはhttpsに、【いいえ】はhttpになります。httpsの場合は、別途サーバー証明書の準備が必要です。認証方式は【*NONE】は認証無し、【*BASIC】はBASIC認証になります。BASIC認証以外の方法も実装できます。今回は、セキュア転送を【いいえ】、認証方式は【*NONE】を指定して【次へ】をクリックします。」
渡邊:「BASIC認証はIDとパスワードで認証する方式なので、現在はあまり使われなくなってきていますね。他の方法にも対応しているのは安心ですね。」

出村:「次の画面では、実装するSQLステートメントを設定します。【追加】をクリックすると以下の画面に変わります。プロシージャ―名の内容は自由に設定して構いませんが【getBySyainNo】としましょう。SQLステートメントは、社員番号で社員名とカナとメールアドレスを取得するSQL文を書きます。【TRIM】については、得られた結果の余計なブランクを削除するもので、【as】により結果のカラム名をJSONに表示される項目名に変更します。カラム名に小文字を含む場合は、カラム名をダブルクォーテーションで囲みましょう。冒頭でご紹介した以下の赤枠の部分です。」


松田:「SQLに不慣れな方は、下記画像のようにACSの【SQLスクリプトの実行】を使うと作りやすいですね!e-BEELLNET.comに記事がありますので、参照してみてください。」

e-BEELLNET.com「ACSでSQLを便利に使おう:その2 - SQLの事例集などありませんか?-」
https://www.e-bellnet.com/category/technology/2305/2305-03.html
出村:「【続行】をクリックすると、SQL文の?を認識して、自動的にパラメータ名【PARAM00001】がセットされます。【次へ】をクリックしましょう」

出村:「ここでは結果が1行になるため、SQL結果タイプは単一行結果セットを選択します。そのほかの項目は、デフォルトのままでOKなので、【次へ】で先に進みます。」

出村:「この画面では、パラメータの受け渡しについての設定を行います。HTTP要求メソッドが【GET】であることを確認して、入力パラメータマッピングで、入力ソースを【*QUERY_PARAM】を選択し、IDに【syainno】を入力します。入力することでパラメータ名【PARAM00001】をID【syainno】に付け替えています。【syainno】については、URLで指定するパラメータ【syainno=社員番号】のようにになります。【次へ】をクリックします。」
松田:「URLで【PARAM00001】が出てきたら、わかりにくいですよね。この画面では様々な項目がありますが、どのような内容ですか?」
出村:「ここでは説明しきれないので、詳しく知りたい方はベル・データの【BcoreAPI-HUB内製化支援パック】というサービスを活用ください。お客様にWebAPIの内製化を支援するサービスです。」


出村:「この画面では、作ったSQL文を実行するユーザを指定します。今回は【サーバのユーザIDを使用】を選択します。これは、前回の記事でIWSを構築する時に指定した【IWSUSER】となります。」
渡邊:「【既存のユーザIDを指定】を選んだらどうなりますか?」
出村:「このIBM i で作成済みのユーザを指定することができます。【次へ】をクリックしましょう。」

出村:「設定が完了し確認できる画面になります。各タブをクリックして内容を確認しましょう。修正したい場合は【戻る】で修正可能です。確認が完了したら【完了】をクリックします。」
松田:「修正できるのはありがたいですね。」

出村:「【完了】をクリックすると、設定した情報に従い、REST APIを作成します。しばらくすると、インストール中になり、完了すると実行中に切り替わって完成です。」

出村:「できあがったサービスをクリックしてプロパティを開くと、【一般】タブにアクセスするURLが【ベース・リソースURL】として表示されます。これを使って、APIにアクセスしてみましょう。前回同様、VSCodeから試しましょう。」

出村:「まず、エクスプローラーで【syaininfo.http】というファイルを作り、右クリックしてプログラムから開くで、【VSCode】を指定して開きます。」
松田:「なぜ、拡張子がhttpなのですか?」
出村:「良い質問ですね。拡張子をhttpとすることで、VS Codeが拡張機能であるREST クライアントの機能を自動的に有効にしてくれるんです。REST クライアントについては、第5回をご確認ください。」
松田:「なるほど、そういう理由なのですね。」

出村:「先ほどのhttpファイルへVSCode上でGETを書いてから、IWSの画面にて【ベース・リソースURL】の内容をコピーペーストし、パラメータ【?syainno=100】を追記します。【?】でパラメータを区切る方法が、前述の【QUERY PARAMETER】です。複数のパラメータを記載する場合は【&】で区切りましょう。ここでは、社員番号100番の情報を取り出そうと思います。」

出村:「このままでは実行ができないので、セキュリティの変更をする必要があります。画面下部の【制限モード】をクリックします。」

出村:「【信頼済みウィンドウ内】の【信頼する】をクリックすることにより、作成した【syaininfo.http】を信頼できるものに変更することができます。」
渡邊:「【制限モード】を解除については、以下の記事が参考になりますね。」
Visual Studio Codeの制限モード解除について
https://qiita.com/otooto/items/2e7551ff7ea2bb214a42

出村:「画面下部の制限モードが消えますので、タスクを実行できるようになります。」

出村:「【syaininfo.http】のタブに切り替えると、画像内赤枠の通りSend Requestが表示されるようになります。Send Requestで実行してみましょう。」

松田:「右側に実行結果が表示されました。物理ファイルから【飯塚 麻世】というレコードが抽出されましたね。」
出村:「レスポンスヘッダという実行結果の応答のヘッダ部分と、JSONで書かれた応答が表示されていますよ。」

次回予告
出村:「今回はSQLを使ってREST APIを実装する方法を学びましたが、いかがでしたか?」
松田:「前回、APIとは何かを学んだわけですが、実践してみることでますますモダナイズを加速させる要素であるということが実感できました。今回、印象に残ったのはやはりREST APIを使ってDb2 for i のデータを参照するという新体験ができたことですね。ウィザードで入力するだけで実装できるのでとっても簡単でした!」
渡邊:「そうですね。特に、SQLを使用する方法は、オープン系のエンジニアにとってもハードルは高くない気がします。この方法を使って、より複雑なリクエスト内容も作れそうです。次回も楽しみですね。」
出村:「お二人とも、今回APIを実際に使ってみるというステップまで進みました。もちろん使い方としてはこれだけではありません。次回は、ILE RPGを使ってREST APIを作成していきます。」
次号へつづく

出村 宏志
ベル・データ株式会社 アプリケーションビジネス本部DX推進部
1995年ベル・データ㈱に入社
1999年より約15年ほどIBM i のインフラエンジニアを経験し、その後アプリケーション開発に従事。キャンプで焚火をしながらボーっとするのが最近の楽しみです。

渡邊 隆
ベル・データ株式会社 アプリケーションビジネス本部DX推進部
ネットワーク、オープン、セキュリティ、DX関連のプリセールス、構築、サポートを経て、現在はDX推進部に所属。工場DXソリューションを担当しながら、初挑戦のIBM i に格闘中。休日は、クラッシックピアノの練習や仲間との弾き合い会を楽しんでいます。

松田 三奈
ベル・データ株式会社 アプリケーションビジネス本部DX推進部
新卒よりインフラエンジニアとしてPowerサーバーのリプレイスに従事し、現在はDX推進部に所属。休日は、カフェ巡りや旅行など天候に関わらず外に出てアクティブに活動することが好きです。
あわせて読みたい記事

RPG開発者のためのIBM i モダナイゼーション入門!
RDi とWeb APIで新しい開発の世界を楽しもう - 第 6 回 -

RPG開発者のためのIBM i モダナイゼーション入門!
RDi とWeb APIで新しい開発の世界を楽しもう - 第 5 回 -

RPG開発者のためのIBM i モダナイゼーション入門!
RDi とWeb APIで新しい開発の世界を楽しもう - 第 4 回 -
