WDScでのRPGウェブ・サービスの作成とテスト
本稿では、SOAP (Simple Object Access Protocol)ベースのウェブ・サービスをWDSc中でRPGサービス・プログラムのソースコードから作成し、テストする方法について説明します。私の説明で使用する例ではWDSc 7.0を使用しています。これより前のバージョンのWDScを使用する場合は手順が若干異なるかもしれません。
RTNCUSTWSというウェブ・サービスのソースコードを図1に示します("SystemiNetwork.com"からもダウンロードできます)。使用しているSystem i 上にQIWSライブラリがあればこのソースコードはそのままで動作するはずです。モジュールを作成してからサービス・プログラムを作成します。
CRTSRVPGM SRVPGM(<your lib>/RTNCUSTWS)
MODULE(<your lib>/RTNCUSTWS)
EXPORT(*ALL)
QCUSTCDTファイルはQIWSライブラリ中にあるサンプル・ファイルです。このファイルには3つのプロシージャがあり、それぞれが簡単なSQL文をSCUSTCDTに対して実行します。各プロシージャは結果として数値を返します。WDScで作成されたウェブ・サービスはIBM Toolbox for Javaを元にしたもので、戻り値として数値またはvoidのみがサポートされています。
最初のプロシージャReturnOpnBalにはパラメータが2つあります。2文字のお客様状態フィールドは入力用パラメータで、9×2の数値フィールドは特定の状態における発注のオープン・バランス用のフィールドです。この2つ目のパラメータを使用してウェブ・サービスから本当に必要とする情報を戻します。ReturnOpnBalは数値を返しますので、SQLCOD中のSQL文の結果を返すことにしました。プロシージャの戻り値を他に使用しないのであれば、SQL文の完了状態を示すような正常終了/異常終了情報を返す目的に使用することもできます。
2番目のReturnMaxLmtというプロシージャはファイル中で最大の信用値をもつ最初の顧客を返します。このプロシージャには入力パラメータはありませんし、数値を返すだけですので、プロシージャの戻り値は問題ありません。
3つ目のプロセスReteurnStateは最多の顧客を持つ2文字の顧客状態を返す必要があります。入力パラメータはありませんが、ReturnStateは状態を文字変数で返さなければなりませんのでパラメータが必要になります。また実行効率を向上させるためだけに、特定の状態にある顧客の数を戻り値として使用しています。
いろいろなタイプのパラメータや戻り値を使用してプロシージャ統合とウェブ・サービスで利用可能な柔軟性を説明してきました。実用アプリケーションを成功させるために私がいつも最低限お勧めしているのは、正常終了または異常エラー・コードを返すことでウェブ・サービスの呼び出し側がウェブ・サービスの実行が正常に終了したのかを認識できるようにしておく、ということです。それではWDSc内でウェブ・サービスのコードを作成してテストする方法について説明しましょう。
図2に示した通り、リモート・システム・エクスプローラー(RSE: Remote Systems Explorer)を使用して必要なソース・メンバーを探し、それを右クリックして[ウェブ・サービス|ウェブ・サービスの作成]を選択します。図3に示す[ウェブ・サービス]ウィンドウで[クライアント・タイプ]縦スライド・メーター(A)を[クライアントのテスト]まで移動します。次に一番下(B)の3つのオプションを選択し、[完了]をクリックします。すると不思議なことに、これだけでウェブ・サービスをテストする準備が整いました。
図4にiSeriesのリストを示します。ここで一番重要な情報はPCMLファイルのアドレス情報を含んでいる"プログラム・インタフェース・ストリーム・ファイル"・エントリ(A)です。ウェブ・サービスを作成したときにエラーが発生していれば、その原因を調査する場所の1つがこのPCMLファイルです。
ウェブ・サービスが作成されると[ウェブ・サービス・テスト・クライアント]ビューが表示されます。メソッドとしてここに表示されているすべてのプロシージャをここからテストすることができます。リスト中の最初の4つのメソッドはテスト用に生成されたものです。
RPGプログラムから生成された各プロシージャには2つのメソッドがある点に注意してください。1つのメソッドはテスト・クライアントに対して情報を返し、XML形式を取り除きます。もう1つのメソッドはその名前の一部に_XMLがついていて、メソッドが返すデータ形式はXMLとなっています。図5にはreturnstate_XMLメソッドが紹介されています。入力フレーム(A)は(RPGプログラムからの) pSTATEを示していますが、思い出していただけるとおわかりの通り、私の例ではこれを戻り値として使用しています。ここまでくれば[起動]をクリックするだけで私が作成したサービス・プログラム中のReturnStateプロシージャをウェブ・サービスが呼び出します。結果フレーム(B)に返ってきた情報をXMLで示してあります。または図6に示す通り、ReturnStateメソッドを使用すると結果フレーム(A)はXMLのコーディングは表示せずにプロシージャの戻り値とpSTATEの変数値だけを表示します。
図7にReturnOpnBalメソッドを示します。入力フレーム(A)では状態としてTXを入力し、オープン・バランスが戻り値として使用されているにもかかわらずそのデフォルトを0にセットしました。このアプリケーションは多少扱いづらく、数値変数を初期化しないとうまく動作しません。数値変数が初期化されていないと、結果フレームが「exception: java.lang.NumberFormatException」というエラーを表示します。これで思い出すのが、RPGの10進数データのエラーです。図7の結果フレームではプロシージャの戻り値が0であるかたまはソースコードにあるSQLCODのどちらかになっています。サービス・プログラムはpSTATEを変更しませんのでその値はTXのままですが、pOPNBALはサービス・プログラムからの戻り値を示しています。
ウェブ・サービスをテストするもう1つの方法はウェブ・サービス・エクスプローラを使用する方法です。同じウェブ・サービスに対するウェブ・サービス・エクスプローラ・ビューを図8に示します。ウェブ・サービス・エクスプローラを起動する方法は2つあります。1つ目はウェブ・パースペクティブからプロジェクト・エクスプローラ・ビューを使用するという方法です。プロジェクト・エクスプローラではJSR-109 Web Servicesの下にウェブ・サービスが見つかるはずです。[サービス]フォルダを開き、自分のウェブ・サービスを見つけて右クリックし[ウェブ・サービス・エクスプローラでテスト]を選択します。もう1つの方法は、WSDLファイルのある場所でどこでもよいので右クリックし、[ウェブ・サービス・エクスプローラでテスト]を選択するという方法です。
ウェブ・サービス・エクスプローラではテスト方法が必要ではありませんので、3つのプロシージャに対して6つのメソッドがあるだけです。ウェビ・サービス・テスト・クライアントの場合と同様で、1つのメソッドのグループはXMLコードを返します。あの_XML名を返すメソッドです。もう1つのメソッドのグループはXMLコードを削除して値を単純に返します。図8に示したナビゲータ・フレーム(A)にはメソッドなどのウェブ・サービスの情報が表示されます。アクション・フレーム(B)では必要に応じて入力パラメータを入力してウェブ・サービスを起動します。状態セクション(C)にはウェブ・サービスを起動した結果が表示されます。図9に示したTCP/IPモニター・ビューも応答時間(A)を調べたりSOAPエンベロープ(B)全体を見たりするのに便利なものであることがわかりました。
ここでご紹介した比較的簡単な紹介記事から、ウェブ・サービス・テスト・クライアント・ビューを使用してもウェブ・サービス・エクスプローラを使用しても、サーバー・ベースのサービス・プログラムを使用してWDScからウェブ・サービスを作成し、テストするのが容易であることがおわかりいただけるでしょう。