从xsd创建一个Web服务请求xml

时间:2013-10-22 20:02:48

标签: java xml web-services xsd wsdl

我想在不使用任何框架(如jax-ws或axis)的情况下使用Web服务。通过检查此article,我知道我需要创建请求xml 。 有没有办法让我解析wsdl并创建请求xml 动态?我已经检查了XSInstance的xsd,但不确定如何将它与wsdls一起使用

注意:网络服务可能有多个操作,我需要根据某些参数为其中任何一个创建请求xml

1 个答案:

答案 0 :(得分:0)

有些框架不是没有理由的 - 但是如果你想一步一步地走这条路线,首先应该看一下WSDL合约中定义的方法,并将消息部分中包含的参数添加到方法。为了展示WSDL契约和SOAP消息之间的关系,我使用了从http://www.tutorialspoint.com/wsdl/wsdl_example.htm获取的示例WSDL契约,因为链接中的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文件包含以下部分:服务,绑定,portType,操作,消息。

该服务定义绑定到指定URL的实际Web服务,并提供WSDL合同中提供的操作。 portType定义传入和传出消息的端口,消息段定义接收和发送的消息所期望的参数和返回值。绑定本身可以是rpcdocument,也可以是encodedliteral - 此设置将影响实际SOAP正文的外观 - 更多信息:{{ 3}}

此外,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