Next Page

1

Previous Page

スレッド: WEBservice SOAP2

作成日: 08/20/13 04:42 PM

返信: 10

IGA


新米


入会日: 08/20/13

投稿数: 12

WEBservice SOAP2
08/20/13 4:42 PM

はじめての投稿です。不手際がありましたらご指摘をお願いします。
------
環境は、RHELinux, Apache, CF10-Enterprize.Tomcat,
CFINVOKE WEB Service で外部システムに接続しようとしています。
接続先は .Net SOAP2 です。 CF10 発売前は CFMX6.1 => Java => 先方、とJavaモジュールを挟んで接続していました。
CF10 でやっとJavaモジュールなく、接続しようとしたのですが、「WSDL のサービス要素に指定されているポートが見つかりませんでした。 」とエラーになります。 wsdl:service の port には1つのみnameがあり、CFで名前指定 serviceport しなくてもいいはず。serviceport 指定するとそのようなポート名はない、と。
CFコードは、
<cfinvoke webservice="http://consumer.***.com/***/***Service.svc?wsdl&quot;
method="GetRates"
returnvariable="retInv">
<cfinvokeargument name="request" value="#xmlRequest#" />
</cfinvoke>
method="GetRates" は、wsdl:operation の name値です。
value= は、先方から指定のあったXML書式です。Javaモジュールでは動作しているので間違いはないはずです。


また、Administrator の WEB サービスで、「WEBサービスのバージョンを選択」と「WEBサービスのバージョンを更新」とありますが、1CF で 1つのバージョンなのでしょうか、それともWEBサービス追加ごとに指定できるのでしょうか。
ちなみに、AdminのWEBサービス登録でも上記WSDLはエラーとなり登録できませんでした。ブラウザでは正常にWSDL定義が表示されます。

ふと思うのですが、上記の CFINVOKE では WEBサービスのバージョンは 1 , 2 のどちらで先方へ接続しに行くのでしょうか。

いくつも質問が入ってしまい失礼しました。 分けて質問した方が良かったのでしょうか。
ご存じの方がいらっしゃいましたらお教えください。宜しくお願います。
* Last updated by: IGA on 8/20/2013 @ 5:49 PM *

Link | Top | Bottom

AXL


長老


入会日: 02/02/08

投稿数: 246

RE: WEBservice SOAP2
08/21/13 3:06 AM

>> Administrator の WEB サービスで、「WEBサービスのバージョンを選択」と「WEBサービスのバージョンを更新」とありますが、1CF で 1つのバージョンなのでしょうか、それともWEBサービス追加ごとに指定できるのでしょうか。

サーバー、アプリケーション、コンポーネントレベルで指定可能。
詳細はオフィシャルドキュメントで。

http://help.adobe.com/ja_JP/ColdFusion/10.0/Developing/WSe61e35da8d318518-2fbb29ff1353e865893-7fff.html

http://help.adobe.com/ja_JP/ColdFusion/10.0/Developing/WSe61e35da8d318518-2fbb29ff1353e865893-8000.html


>> 上記の CFINVOKE では WEBサービスのバージョンは 1 , 2 のどちらで先方へ接続しに行くのでしょうか。

Application.cfc で設定していなければ、サーバー(アドミニストレーター)設定のバージョンを使用しているはずですよ。
優先順位: コンポーネント - アプリケーション - サーバー(一番低い)


アドミニストレーターで Web Service の登録ができないということなので、利用に必要な情報が正確か欠けているものがないかもう一度しっかり確認した方がいいみたいですね。


試しに、アドミニストレーターから以下の Web Service が登録できるか試してみてください。

Web Service Name: GeoIPService
WSDL URL: http://www.restfulwebservices.net/wcf/GeoIPService.svc?wsdl

登録できなければ、ColdFusion が ファイアウォールなどで接続をブロックされていないか調べてみてください。 登録できるならやっぱり問題は、Web Service の利用情報だと思うんですが。
* Last updated by: AXL on 8/21/2013 @ 3:19 AM *

Link | Top | Bottom

IGA


新米


入会日: 08/20/13

投稿数: 12

RE: WEBservice SOAP2
08/21/13 3:28 AM

AXL様、

早速のご回答、ありがとうございます。助かります。
教えていただきましたGeoIPService のwsdlは、Admin WEBサービスに登録することができました。

ブラウザでwsdlが表示され、AdminにWEBサービスとして登録できないので、まずはこちらの設定をもう少し調べてみます。
因みに、接続先は http://consumer*****.***.***.com/***/***/R***.svc?wsdl
先方がIPでブロックしているかもしれませんので、他の方が見れるかどうかは未確認です。

これからご指定のオフィシャルサイトを見てみます。
有難うございます。
* Last updated by: IGA on 9/5/2013 @ 2:05 PM *

Link | Top | Bottom

IGA


新米


入会日: 08/20/13

投稿数: 12

RE: WEBservice SOAP2
08/21/13 6:11 AM

AXL様

アプリケーションレベルで Axis2 を指定したところ状況が変わりました。
SOAPで先方にはつながっているようです。 有難うございます !!

---
状況1:エラー「Web サービス parameter 名 OTA_VehAvailRateRQ が、与えられた parameter {parameters} 内で見つかりません。 」となりました。
cfinvokeargument name="parameter" を name="OTA_VehAvailRateRQ" とすることでこのエラーは無くなりました。 argumentのnameが影響するのですね。 Axis1 (CFMX6.1)の時は影響しなかったと思うのですが。
---
状況2:状況1の後に発生したエラー「parameter {OTA_VehAvailRateRQ={<soapenv:Envelope xmlns:ns="...(CFXMLで作成しtoString()した渡す内容)...</soapenv:Envelope>}} を持つ Web サービスオペレーション GetRates が見つかりません」となりました。
WSDLを見る限りでは、<wsdl:operation name="GetRates"> とあり、
cfinvoke も method="GetRates" 、
XML形式で先方へ渡すデータ(これは無関係かも!?)も「 ... <soapenv:Header/><soapenv:Body><ns:GetRates> ...」となっているので問題ないとは思うのですが、、、。
---
状況2の状態で、wssettings.style をデフォルトwrapped以外のdocumentも試しましたが結果は変わらずでした。

先方の仕様は変更できないので、こちら側プログラムで対応するしかないのですが、他に考えられることは何か思いつきますでしょうか。


因みに、接続できているJavaプログラムはこんな感じです。 SOAPAction ってCFでは不要なのでしょうか。
oURL = new URL(_sURL); // _sURLは wsdlのURLで最後の?wsdl がありません
con = (HttpURLConnection) oURL.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-type", "text/xml; charset=utf-8");
con.setRequestProperty("SOAPAction", _sActionURL); // _sActionURLは http://www.opentravel.org/OTA/2003/05/OTA2010A.RateService/GetRates
con.setDoOutput(true);
con.setDoInput(true);
reqBytes = p_request.getBytes("UTF-8"); // p_requestは、先方へ渡すXML書式をtoString()したもの
reqStream = con.getOutputStream();
reqStream.write(reqBytes);
reqStream.flush();


宜しくお願いいたします。
* Last updated by: IGA on 8/21/2013 @ 7:06 AM *

Link | Top | Bottom

AXL


長老


入会日: 02/02/08

投稿数: 246

RE: WEBservice SOAP2
08/22/13 1:02 AM

getRates の input parameter は タイプが
org.opentravel.www.ota._2003._05.OTA_VehAvailRateRQ_type0
みたいですが、これは XML 形式を使っているんですよね。 wsdl にもそれに関する情報がないので。

そこをもう一度確認して、 getRates に適切な値をパス出来れば問題なさそうですけどね。

Link | Top | Bottom

IGA


新米


入会日: 08/20/13

投稿数: 12

RE: WEBservice SOAP2
08/22/13 11:23 AM

AXL様、ありがとうございます。

パラメータの内容はXML形式です。開始タグと閉じるタグのペアは問題なく、XML形式がズレていることはないはずです。

getRates に渡っているはずのパラメータ値の先頭部分は、
---
<soapenv:Envelope xmlns:ns=""http://www.****************/05";" xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/";"><soapenv:Header/><soapenv:Body><*******> <************** PrimaryLangID=""EN"" Target=""Production"" Version=""2.000"" xmlns=""http://**"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance";" xsi:schemaLocation=""http://*/***.xsd""> <POS> (以下、業務内容にあった構造)
---
値内の ダブルクォートが2つ "" 続いているのは、ログファイルに出力した内容をLinux 上で表示(tailコマンド)しているのでエスケープされた結果です。本来の値は、ダブルクォート1つです。
この値をJavaプログラムでも使っているので、CFでのCFINVOKEARGUMENTパラメータ渡しと
CF で、
ws2010A = CreateObject("java", "OTAWS");
ret = ws2010A.invokeWS(erviceURL, "get", pRequest); //pequest は xmlパラメータ値
と、した場合の違いがどこに関係しているのか、、、、なのでしょうか。
んー、わからない。。。。

AXLさん、みなさん、本当にありがとうございます。
* Last updated by: IGA on 9/5/2013 @ 2:07 PM *

Link | Top | Bottom

AXL


長老


入会日: 02/02/08

投稿数: 246

RE: WEBservice SOAP2
08/23/13 12:14 AM

SoapUI を使ってみては。 この件のような問題解決の手助けになると思いますよ。
無料版と Pro バージョンがありますが、14日間お試し期間のある Pro バージョンでテストすることをお勧めします。

あと Web Service 関連の Ben Nadel の ブログも何かヒントになるような。

http://www.bennadel.com/blog/1809-Making-SOAP-Web-Service-Requests-With-ColdFusion-And-CFHTTP.htm

Link | Top | Bottom

IGA


新米


入会日: 08/20/13

投稿数: 12

RE: WEBservice SOAP2
08/23/13 3:49 AM

AXL様

情報、ありがとうございます。

SoapUI の使用、Ben Nadelブログの確認、少し時間が必要かと思いますので、
今日、明日の返信できないかもしれません。
しばしお時間を。。。

ありがとうございます。

Link | Top | Bottom

AXL


長老


入会日: 02/02/08

投稿数: 246

RE: WEBservice SOAP2
08/27/13 11:08 PM

<soapenv:Envelope xmlns...... の部分は Soap Request で
ColdFusion では createObject や cfinvoke を使えば、自動で生成してくれるので気にしなくていいんですけどね。

なのでそれを getRates の input parameter には使えないですよ。

Web Service の提供元からの API に関するドキュメントなどをもう一度確認してみてください。

もし <soapenv:Envelope xmlns...... をそのまま使いたいのなら
cfinvoke ではなく Ben Nadel のように cfhttp を使うべきですよ。

createObject を使った簡単な Web Service のサンプルを作ってみたので参考まで。

http://pastebin.com/DGz9M2dE


もうアドレスの部分は必要ないのでパブリックな Web Service でないなら編
集しておいた方がいいですよ。
* Last updated by: AXL on 8/27/2013 @ 11:20 PM *

Link | Top | Bottom

IGA


新米


入会日: 08/20/13

投稿数: 12

RE: WEBservice SOAP2
09/05/13 2:10 PM

AXL様

ご連絡が遅くなり失礼しました。
(他の問題に捕まっております。。。)

サンプルまで作っていただき本当にありがとうございます。
試してみ返信いたします。

以前のアドレス部分はマスクしました。有難うございます。

Link | Top | Bottom

IGA


新米


入会日: 08/20/13

投稿数: 12

RE: WEBservice SOAP2
09/15/13 3:48 PM

ALX様

お世話になりります。大変遅くなり失礼しました。
簡単なコードでログを吐き出しながらいろいろと試しと見ましたがうまくいきませんでした。
突き当たったエラーは「指定のポートが見つかりませんでした」例外エラーでした。
--------
XML電文の先頭(下記)は削除しました。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:ns="http://www.***.org/***/2003/05";><soapenv:Header/><soapenv:Body><ns:GetRates>

コードは、
<cfscript>
wsAddr = "http://*******.****.com/***/***A/***Service.svc?wsdl";
ws = createObject("webservice", "#wsAddr#");
ret2010A = ws.GetRates(requestStringXml);
soapRequest = getSOAPRequest(ws);
soapResponse = getSoapResponse(ws);
</cfscript>

2行目の createobject で例外が発生しました。
WSDLを見る限りサービスは1つなので自動でポートは決定されるはずですが。。。
試しに次の2通りのポートを指定し試しましたが結果は同じでポートが見つからないとのこと。
ws = createObject("webservice", "#wsAddr#", "BasicHttpBinding_OTA2010A.RateService");
ws = createObject("webservice", "#wsAddr#", "RateService");

なかなか難しいものです。。。。
いろいろとありがとうございます。

Link | Top | Bottom

Next Page

1

Previous Page

新規投稿

ログイン して返信して下さい。