【GeneXus Tips】SOAPサービスの使い方


お久しぶりです、kudoです

今回は、過去にSOAPについて書いたような気がしていただけのSOAP通信について書きたいと思います。

GeneXusでは簡単にSOAPを利用したWebサービスの作成やSOAPサービスを利用するシステムを作成することが出来ます。

と、Wikiにも書かれているのですが
作り方はともかく、使い方には落とし穴があります。

まず、作り方は

1.SOAPサービスにしたい処理を通常のプロシージャと同じように作成
SOAPオブジェクトのソースコード
2.1で作成したプロシージャの”Mainprogram”プロパティを”True”に
  ”Call protocol”プロパティを”SOAP”に変更
SOAPオブジェクトのプロパティ

以上です。

後は、サービスを配置したURLで作成したSOAPプロシージャ
(上記の例ではC#で作成していたので”ax002_soap_pg.aspx”というサービスになる)
にアクセスするだけです。

そして問題の使い方ですが

ただ呼ぶだけなら、難しくないのですが
その難しくない方法をとってしまうと

・SOAP通信のエラーハンドリングが行えない
・ExternalObject内にサービスのURLを持っている

と言う問題があります。

一つ目のエラーハンドリングが問題なのは当たり前ですが
二つ目の問題も、SOAPサービスの開発も一緒に行っている場合は
テストサイトが変わるたびにビルドをしなければ行けないため
大きなプロジェクトになるほど対処が面倒になってしまいます。

上記が今回問題としているSOAPサービスを使う上での落とし穴です。

では、どうやって対処するかと言うと

“Location”というデータタイプを利用することで解決することが出来ます。
詳しくはココを・・・と書きたいのですが
海外のWikiでも簡単にしか書かれていないので自分なりにまとめてみました。

1.SOAPを呼ぶオブジェクトで、Locationデータタイプの変数を作成
2.Locationデータの取得と設定を行う
SOAPのロケーション
ここで
「どの名前のロケーションを取得し」「どのURLを参照して」「エラー処理をどうすか」
を設定します。
3.ロケーションのエラーハンドリングを行う

・・・

・・

肝は見ての通り2です。

まず、「GetLocation」と言う関数に対象となるSOAPサービス(ExternalObject)の名前を渡し、LocationDataを受け取ります。

次に、使用するサービスを指定するためLocationDataTypeの
「Host」「BaseUrl」「Port」
にサービスの
「ホスト名」「ホスト名以降のURL」「ポート番号(未指定は80)」
を設定します。
ここで設定しない場合は、ExternalObject内に記述されているURLが利用されます。

最後はSOAPのエラーハンドリングを行うためLocationDataTypeの
“CancelOnError”プロパティを2に設定します。
このプロパティには0~2の値が指定できますが
SOAP通信の場合、以下のような動作になります

0:処理のキャンセル、サーバーエラー(HTTP500)
1:0と同じ動作(SOAPサービス側とクライアント側で動作が異なる)
2:SOAP通信がエラーになっても処理を継続し「GetSoapError」「GetSoapErrorMsg」
  でエラー情報を取得できる

以上の設定を行ってから、SOAPサービスを呼び出し
「GetSoapErr」をつかったエラーハンドリングが可能となります。