jax-ws や axis などのフレームワークを使用せずに Web サービスを利用したいと考えています。この記事を確認すると、リクエスト xml を作成する必要があることがわかりました。wsdl を解析してリクエスト xmlを動的に作成する方法はありますか? xsd のXSInstanceを確認しましたが、
wsdlsでそれを使用する方法がわかりません: Web サービスには複数の操作がある可能性があり、いくつかのパラメーターに基づいてそれらのいずれかの要求 xml を作成する必要があります
1 に答える
理由もなく存在しないフレームワークもありますが、ルートを順を追って確認したい場合は、まず 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