お久しぶりです、kudoです
今回は、過去にSOAPについて書いたような気がしていただけのSOAP通信について書きたいと思います。
GeneXusでは簡単にSOAPを利用したWebサービスの作成やSOAPサービスを利用するシステムを作成することが出来ます。
と、Wikiにも書かれているのですが
作り方はともかく、使い方には落とし穴があります。
まず、作り方は
1.SOAPサービスにしたい処理を通常のプロシージャと同じように作成
2.1で作成したプロシージャの”Mainprogram”プロパティを”True”に
”Call protocol”プロパティを”SOAP”に変更
以上です。
後は、サービスを配置したURLで作成したSOAPプロシージャ
(上記の例ではC#で作成していたので”ax002_soap_pg.aspx”というサービスになる)
にアクセスするだけです。
そして問題の使い方ですが
ただ呼ぶだけなら、難しくないのですが
その難しくない方法をとってしまうと
・SOAP通信のエラーハンドリングが行えない
・ExternalObject内にサービスのURLを持っている
と言う問題があります。
一つ目のエラーハンドリングが問題なのは当たり前ですが
二つ目の問題も、SOAPサービスの開発も一緒に行っている場合は
テストサイトが変わるたびにビルドをしなければ行けないため
大きなプロジェクトになるほど対処が面倒になってしまいます。
上記が今回問題としているSOAPサービスを使う上での落とし穴です。
では、どうやって対処するかと言うと
“Location”というデータタイプを利用することで解決することが出来ます。
詳しくはココを・・・と書きたいのですが
海外のWikiでも簡単にしか書かれていないので自分なりにまとめてみました。
1.SOAPを呼ぶオブジェクトで、Locationデータタイプの変数を作成
2.Locationデータの取得と設定を行う
ここで
「どの名前のロケーションを取得し」「どの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」をつかったエラーハンドリングが可能となります。