2016-10-21 3 views
1

....SOAPクライアントは実際にWSDLを使用する必要がありますか?私はそうのようなHTTPリクエストのボディとしてSOAPエンベロープのXMLペイロードを送信しSOAPクライアントの例を見てきました

String payload=""" 
    <soapenv:Envelope> 
     <soapenv:Header/> 
      <soapenv:Body> 
       Some soap crapola 
    </soapenv:Body> 
    </soapenv:Envelope> 
    """ 

    HttpPost httpPost = new HttpPost("somecraapysoapwebsevice.com/biteme"); 

    StringEntity entity = new StringEntity(payload); 
    httpPost.setEntity(entity); 
    httpPost.setHeader("Accept", "text/xml"); 
    httpPost.setHeader("Content-type", "text/xml"); 

    HttpResponse response = httpclient.execute(httpPost); 

このコードは、WSDLを気にしません。このアプローチに問題はありますか?

また、WSDLを使用してJavaクラスを生成し、要求をそのように送信すると、サーバーは受信したものが上記とは異なるものとして認識しますか?

答えて

2

のようなツールを使用してテストすることができます

  1. 呼び出すサービスのスキーマ/ wsdlが変更された場合は、SOAP要求を作成するコードにその変更を反映させる必要があります。 WSDLを使用する場合は、更新WSDL /スキーマを使用してデータバインダを再実行するだけです。
  2. 文字列を使用してXMLを作成して解析することは良い考えではありません。 HTTP/SOAPリクエストで送信する前に、DOMを使用してシリアル化する必要があります。

SOAPサービスでは、WSDL /データバインディングを使用するクライアントと、SOAP要求を作成するコードの違いは他の方法では認識されません。要求が要求スキーマと一致し、SOAP-Action HTTPヘッダーを設定している限り、正常であるはずです。

場合によっては、WSDLを使用しないという良い議論があります。コンポーネントがメッセージ・ブローカー(ミドルウェアなど)で、さまざまなメッセージ・タイプのロードを受け取り、転送する必要があります。 WSDLの定義。

1

SOAPは主に何百ものSOAPサービスを備えたエンタープライズ環境で使用され、自動化されたクライアントスタブの生成が必要です。

nullable/non-nullableフィールド、複雑なフィールド、コレクションなどのすべての制限を考慮して、すべてのDTOオブジェクトで特定のWSDLからクライアントスタブを生成する方が簡単です。

コントラクトに数十種類の異なるタイプのフィールドが含まれていて、それらの多くが独自のフィールドを持つコレクションまたは複合型である場合、どのように手動でCreateContractリクエストのエンベロープを作成しますか? ボディをPOJOに変換する必要があるときにGetContractを返す

単一のパラメータで単一のメソッドを呼び出すだけであれば、パラメータのプレースホルダでシンプルなエンベロープを簡単にハードコードすることができます。それはあなた次第です。

WSDLは、クライアントとサーバーの間の単なる契約です。サーバーの場合、要求本体がどのように構成されているか、手作業で生成されたコードでも、自動生成されたコードでも構いません。要求が契約サーバーに準拠する場合はそれを受け入れる必要があります。

あなたは常にこのようなSOAPリクエストの作成は固有の問題ではありませんが、いくつかの落とし穴があるWSDLとの一貫性を保つためにあなたの手なされた要求をチェックし、SoapUI

+0

あなたが何を意味しているのか分かりましたが、あなたは私の質問の一部に答えましたが、私はそれを編集して2番目の部分を追加しました。あなたは私にあなたの考えを教えてください。 – AbuMariam

+0

@AbuMariam私は上記の答えで私の意見を説明しました。 Morten Jorgensenも良い答えを出しました。 –

関連する問題