2008/07/08

[coldfusion]SOAP通信できた!!

昨日、Bugle Diary: [coldfusion]ひょっとしたらという記事で、webサービスを使えるかもしれないということを書いたのですが、なんと、なんと、SOAP通信ができたのです。(マジ超うれしい♪)

geoapという、ある特定の住所(自宅住所や会社のある場所)の最寄り駅をSOAPを使って取得できるサービスがあるのですが、呼び出せるかどうか、チャレンジ。

まずは、体験認証キーをゲット!!

SOAPといっても、httpのgetリクエストをしていることと同じなので、CreateObjectを使って通信をすることにしました。

<cfscript>
ws = CreateObject("webservice","http://dev.geoap.jp/geoap_trial/geoap_trial.asmx?wsdl");
ret = ws.UserCertification(UserKey="体験認証キー",Password="hoge");
writeouput(ret); //「正常終了」を返す。
ret = ws.MapOfAdrAndScale(Address="住所", Scale=2000);
writeoutput(ret.StatusMsg); //「ユーザ認証を行ってください。」を返す。
</cfscript>

ここまで難なく書けたのですが、MapOfAdrAndScaleが正常に終了しているかどうか、返り値を出力したところ、「ユーザ認証を行ってください。」というメッセージが登場して、異常終了してしまいました。

「う~ん、なぜだろー。。。 orz」

結論からいうと、毎回、毎回、メソッドのたびに違うセッションで取りに行ってしまうため、前に認証をしても認証情報が残っていないため意味がないということがわかりました。

で、どーすれば、セッションを確保できるのかなーとぐぐっていたら、ナイスな答えがありました。

ws.setMaintainSession(true); // required so axis will do cookies

via:How to set Cookies in ColdFusion SOAP requests

この記事によると、CreateObjectで、webserviceを使った場合、できたオブジェクトは、org.apache.axis.client.Stubクラスとして扱うことができるということなんですね。

なので、セッションを保持したい場合は、上のソースを追加すればオッケーということなんだなー。

以上を踏まえて、ソースはこのようになります。

<cfscript>
ws = CreateObject("webservice","http://dev.geoap.jp/geoap_trial/geoap_trial.asmx?wsdl");
ws.setMaintainSession(true);
ret = ws.UserCertification(UserKey="体験認証キー",Password="hoge");
ret = ws.MapOfAdrAndScale(Address="住所", Scale=2000);
</cfscript>

これを実行してみると、無事に、リターン値を取得することができました。

今回のポイントとしては、セッションを保持したい場合は、CreateObjectでwebserviceを使った後、セッションを保持する「オブジェクト名.setMaintainSession(true)」がいるということなんですね。

0 コメント:

コメントを投稿