0

jax-ws や axis などのフレームワークを使用せずに Web サービスを利用したいと考えています。この記事を確認すると、リクエスト xml を作成する必要があることがわかりました。wsdl を解析してリクエスト xmlを動的に作成する方法はありますか? xsd のXSInstanceを確認しましたが、

wsdlsでそれを使用する方法がわかりません: Web サービスには複数の操作がある可能性があり、いくつかのパラメーターに基づいてそれらのいずれかの要求 xml を作成する必要があります

4

1 に答える 1

0

理由もなく存在しないフレームワークもありますが、ルートを順を追って確認したい場合は、まず WSDL コントラクトで定義されているメソッドを確認し、メッセージ部分に含まれるパラメーターをメソッドに追加する必要があります。WSDL コントラクトと SOAP メッセージの関係を示すために、リンクの WSDL ファイルが機能しないため、http: //www.tutorialspoint.com/wsdl/wsdl_example.htm から取得した WSDL コントラクトの例を使用します。

<definitions name="HelloService"
   targetNamespace="http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns="http://schemas.xmlsoap.org/wsdl/"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:tns="http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">

   <message name="SayHelloRequest">
      <part name="firstName" type="xsd:string"/>
   </message>
   <message name="SayHelloResponse">
      <part name="greeting" type="xsd:string"/>
   </message>

   <portType name="Hello_PortType">
      <operation name="sayHello">
         <input message="tns:SayHelloRequest"/>
         <output message="tns:SayHelloResponse"/>
      </operation>
   </portType>

   <binding name="Hello_Binding" type="tns:Hello_PortType">
   <soap:binding style="rpc"
      transport="http://schemas.xmlsoap.org/soap/http"/>
   <operation name="sayHello">
      <soap:operation soapAction="sayHello"/>
      <input>
         <soap:body
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            namespace="urn:examples:helloservice"
            use="encoded"/>
      </input>
      <output>
         <soap:body
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            namespace="urn:examples:helloservice"
            use="encoded"/>
      </output>
   </operation>
   </binding>

   <service name="Hello_Service">
      <documentation>WSDL File for HelloService</documentation>
      <port binding="tns:Hello_Binding" name="Hello_Port">
         <soap:address
            location="http://www.examples.com/SayHello/">
      </port>
   </service>
</definitions>

WSDL ファイルには、サービス、バインディング、ポート タイプ、操作、メッセージの各部分が含まれています。

このサービスは、指定された URL にバインドし、WSDL コントラクトで提示された操作を提供する実際の Web サービスを定義します。portType は、着信メッセージと発信メッセージのポートを定義し、メッセージ セグメントは、送受信されるメッセージに期待されるパラメーターと戻り値を定義します。バインディング自体は、rpcまたはdocumentここでもencoded、またはliteral- この設定は、実際の SOAP 本体がどのように見えるかに影響します - 詳細: http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/

さらに、WSDL ファイルには、メッセージ パラメーターまたは戻り値の型を定義する xsd へのリンクを含めるか、コントラクト内に xsd 定義全体を含めることができます。

Java では、SayHelloRequest のメソッド宣言は次のようになります。public String sayHello(String firstName);ただし、SOAP ベースのサービスを呼び出すには、次のように XML (SOAP) メッセージをリッスン サービスに送信する必要があります。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"    
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/1999/XMLSchema">
   <soapenv:Header/>
   <soapenv:Body>
       <SayHelloRequest>
           <firstName xsi:type="xsd:string">Test</firstName>
       </SayHelloRequest>
   </soapenv:Body>
</soapenv:Envelope>

したがって、フレームワークなしで WSDL から SOAP メッセージを作成することは可能ですが、テーブルにもたらされるオーバーヘッドに対処する必要があります。さらに、安全のために自分で xsd を検証する必要があります。

この知識があれば、最初にサービス部分を抽出し、次にバインディングとポート タイプ (定義されたエンコーディングを使用)、最後に重要なこととして、各操作の入力メッセージと出力メッセージを使用して定義された操作を抽出する独自のパーサーを作成できます。これらのパラメーターがどの型であるかを知るには、xsd 型をさらに調べて、類似の Java クラスを見つける必要があります。

HTH

于 2013-10-22T20:46:58.933 に答える