我想在不使用 jax-ws 或轴等任何框架的情况下使用 Web 服务。通过查看这篇文章,我知道我需要创建请求 xml。有没有办法让我解析 wsdl 并动态创建请求 xml ?我已经检查了XSInstance的 xsd 但不知道如何将它与 wsdls 一起使用
注意:Web 服务可能有多个操作,我需要根据某些参数为其中任何一个创建请求 xml
1 回答
有些框架是无缘无故不存在的——但如果你想一步一步走,你应该先看看 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 文件包含以下部分:服务、绑定、端口类型、操作、消息。
该服务定义了绑定到指定 URL 并提供 WSDL 合同中呈现的操作的实际 Web 服务。portType 定义传入和传出消息的端口,消息段定义接收和发送消息的期望参数和返回值。绑定本身可以是rpc
ordocument
和 hereencoded
或者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 类。
高温高压