web-dev-qa-db-ja.com

相対WSDL soap:addressの場所

WSDLの場所を基準にして、または少なくともサーバーを基準にして、SOAP:addressの場所をWSDLに含めることはできますか?たとえば、私は書きたいです:

<soap:address location="https://exampleserver.com/axis2/services/ExampleService" />

なので:

<soap:address location="/axis2/services/ExampleService" />

これにより、テストサーバーなどの複数のサーバーへの展開をより高速に行うことができます。また、axis2cの場合、自分のサービスをHTTPまたはHTTPSの両方から使用したい場合、サービスを使用する開発者は、デフォルトの場所「?WSDL」からWSDLを単純にインポートできないため、困難になります。

16
Mihai

WSDLは、Webサービスと対話するために必要なメッセージフォーマット、タイプ、パラメータなどをクライアントに説明します。これは WSDL2C などのツールで使用され、対話に必要なコードを生成します。

ただし、サービスをHTTPまたはHTTPSで公開しても、クライアントスタブコードは同じです。 エンドポイントアドレスごとにクライアントスタブを再生成しません。クライアントは同じままで、変化するのはアクセスポイントです。

このアドレスは、生成されたクライアントコードでハードコード化しないでください。クライアントアプリケーション内で構成可能なURLである必要があります。

確かに、WSDL内で指定されたURLがあるので、開発サーバーにWebサービスをデプロイして、ステージングして次に本番環境に移行するのは面倒です。エンドポイントは環境ごとに異なります(HTTP + HTTPSの場合は2倍になる可能性があります)。ただし、コードを再生成しないため、この時点では開発者は影響を受けません。

Webサービスへのアクセスに関しては、たとえそれが絶対的または相対的なものであっても、異なるアドレス(開発サーバー、ステージングサーバー、および本番サーバー用)が存在します。したがって、クライアント構成へのアクセスポイントを管理する必要があるため、WSDL内に相対アドレスを設定することがどのように役立つかはわかりません。

8
user159088

WSDLを取得するには2つの方法があります。

ハードコーディングされたwsdlが提供される場所、たとえば:

https://hostname/contextname/services/myAPIService/myAPI.wsdl

生成されたwsdlが提供される別の例:

https://hostname/contextname/services/myAPIService?wsdl

動的オプションを使用する場合は、次のコードを使用します。

req.getRequestURL().toString();

生成されたWSDLで使用されるURLを取得します。このコードは、ListingAgentクラス(パッケージorg.Apache.axis2.transport.http内)にあります。

質問で述べたように、相対的な場所が必要な場合は、複数のサーバーで使用する必要があるため、動的オプションを使用する必要があります。

動的オプションで私が見つけた1つの問題は、元のWSDLで場所がHTTPを使用している場合、生成された場所では、HTTPSを使用してアクセスしても、引き続きHTTPを使用することです。 (これは、私のプロジェクトが使用しているバージョン1.5で発生します)

もう1つの問題は、ロードバランサーを使用している場合です。生成されたWSDLは、バランサーではなく最終サーバーの場所で生成されるためです。このためのオプションは、AxisServletクラスとListingAgentクラスを拡張して、上記のコードを置き換えることです。

長い検索の後、私はほぼ確信しているsoap:addresslocation属性は絶対URLでなければなりません。開発、テスト、本番などの異なる環境で作業する場合、これはさらに複雑になります。

おそらく、回避策は、クライアント側で、構成ファイル(例:https://exampleserver.com)とWSDLの最後の部分(例:/axis2/services/ExampleService)を組み合わせて、絶対パスを構築します。前者では、環境を切り替えることができます。

3
bluish