2011-08-11 8 views
14

私は、WSDLの場所からの相対的な、または少なくともサーバーとの相対的な関係で、WSDLにsoap:addressの場所を持つことができますか?私が書きたい例えば :相対的なWSDLの石鹸:アドレスの場所

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

として:

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

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

+0

私のサービスを使用している開発者は、wsdlをデフォルトの場所「WSDL」からインポートできないため、_lifeが難しくなります_この部分はわかりません。相対的アドレスではなくWSDLに絶対アドレスがあると、人生はなぜ難しいのですか? –

+0

あなたは1つのアドレスしか持たず、2つのアドレスが必要です(1つはhttps用、もう1つはhttp用)。 – Mihai

+0

私はwebservicesを消費するとき、私は完全にSOAPアドレスを無視し、クライアントでこれを無効にします。サーバーを書くときは、無作為ではあるが有効なものを書いてください。 –

答えて

7

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

サービスをHTTPまたはHTTPSで公開しても、クライアントのスタブコードは同じになります。 各エンドポイント・アドレスのクライアント・スタブを再生成しません。クライアントは変わらないアクセスポイントです。

このアドレスは、生成されたクライアントコードでハードコードされるべきではありません。クライアントアプリケーション内の設定可能なURLである必要があります。

確かに、WSDL内にURLが指定されているため、Webサービスをデベロッパーサーバーにデプロイした後、ステージングして次にプロダクションにデプロイするときに迷惑になります。エンドポイントは各環境で異なります(HTTP + HTTPSの場合は2を掛けてもかまいません)が、コードを再生成しないため開発者に影響はありません。

Webサービスにアクセスする際には、何か絶対的なものであっても、別のアドレス(dev、staging、prodの各サーバー)があります。だから、クライアント・コンフィギュレーションにアクセス・ポイントを管理しなければならないので、WSDL内に相対アドレスを持たせるとどのように役立つのか分かりません。

+2

PHPでは、Webサービスにアクセスする簡単な方法は、SoapClientコンストラクタでWSDLの場所を指定することです。サービスアドレスはwsdlから取得されます。正しくないものがwsdlにある場合、サービスクライアントは正しいものを手動で指定する必要があります。アドレスをwsdlから動的に変更しない限り、httpとhttpsの両方でサービスを使用する場合は、間違っていると確信しています。 – Mihai

3

長い検索の後に私はほとんどsoap:addresslocation属性が絶対URLであることを確信しています。これは、開発、テスト、プロダクションなど、さまざまな環境で作業する場合、状況がより複雑になります。

クライアント側では、設定ファイル(例:https://exampleserver.com)とWSDLの最終部分(例:/axis2/services/ExampleService)からURLの最初の部分を読み取り、これらを組み合わせて絶対パスを構築することがあります。前者は、環境間で切り替えることができます。

+0

これは私が探しているものです。しかし、私はそれを行うように見えることはできません。 – elcool

4

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

ハードコードされたWSDLは、例えば、提供しています

一つは:

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

と生成されたWSDLは、例えば、提供された別の1:

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

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

req.getRequestURL().toString(); 

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

あなたがあなたの質問で言及したところから、相対的な場所を持つ必要がある場合は、それを複数のサーバーで使用する必要があるため、動的オプションを使用する必要があります。

ダイナミックオプションで見つかった1つの問題は、元のWSDLでHTTPを使用していて、HTTPSを使用していてもHTTPを使用するということです。 (これは、私のプロジェクトで使用しているバージョン1.5で発生します)

ロードバランサを使用している場合、生成されたWSDLはバランサの代わりに最終的なサーバの位置で生成されるためです。このためのオプションは、AxisServletクラスとListAgentクラスを拡張して上記のコードを置き換えることです。

関連する問題