我想在不使用任何框架(如jax-ws或axis)的情况下使用Web服务。通过检查此article,我知道我需要创建请求xml 。
有没有办法让我解析wsdl并创建请求xml 动态?我已经检查了XSInstance的xsd,但不确定如何将它与wsdls一起使用
注意:网络服务可能有多个操作,我需要根据某些参数为其中任何一个创建请求xml
答案 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定义传入和传出消息的端口,消息段定义接收和发送的消息所期望的参数和返回值。绑定本身可以是rpc
或document
,也可以是encoded
或literal
- 此设置将影响实际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