我是一个分配给复活旧肥皂界面的SOAP新手。我已将soap服务移植到新路径上的新tomcat上(并保持客户端不变)。我发送请求: 的的http:// MYSERVER:8181 /肥皂/ SoapTest WSDL 我回来了:
<wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
xmlns:ns3="http://schemas.xmlsoap.org/wsdl/soap/http"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.mycompany.com/SoapTest"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="SoapTestService"
targetNamespace="http://www.mycompany.com/SoapTest">
<wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
namespace="http://webservices.mycompany.com"></wsdl:import>
<wsdl:binding name="SoapTestServiceSoapBinding" type="ns1:SoapTest">...</wsdl:binding>
<wsdl:service name="SoapTestService">...</wsdl:service>
</wsdl:definitions>
似乎很有希望。对导入位置 SoapTest?wsdl = SoapTest.wsdl 的请求会返回:
<wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
xmlns:ns2="http://jaxb.dev.java.net/array" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="SoapTest"
targetNamespace="http://webservices.mycompany.com">
<wsdl:types>
<xs:schema xmlns:tns="http://webservices.mycompany.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://webservices.mycompany.com" version="1.0">
<xs:complexType name="sessionObj">
<xs:sequence>
<xs:element name="code" type="xs:int"/>
<xs:element name="id" type="xs:long"/>
<xs:element minOccurs="0" name="role" type="xs:string"/>
<xs:element minOccurs="0" name="username" type="xs:string"/>
</xs:sequence>
</xs:complexType>
... (and so on)
因此客户端可以接收成员xs名称:类型关联但似乎不是 - 或者不应用它们。那是......
HUH ..经过审核,我看到xs被用作命名空间但是xmlns:xsd被定义了?怎么会发生这种情况?
ZSI客户端查询(从Windows,如果这有什么不同)到此接口(Linux)接收包含预期数据有效负载的响应,但随后将每个数据项映射到单独的“属性” - 产生通用属性列表。
我期待一个类型化成员列表,每个属性都转换为xs类型(例如int,long,string,上面的字符串),对吗?
提前感谢任何线索。
答案 0 :(得分:1)
鉴于您没有提供足够的信息来解决当前的实际问题,我将基于您是 newb 的基础,因此将我的答案包含在我发现的相关部分中你的问题。
您的主要Web服务在WSDL http:// myserver:8181 / soap / SoapTest?wsdl 中描述,它包含对父WSDL的导入。此父WSDL包含可由主服务绑定的服务定义。
似乎很有希望。对导入位置的请求 SoapTest?wsdl = SoapTest.wsdl返回: ..
从上面提供的文档定义中,导入:
<wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
namespace="http://webservices.mycompany.com">
</wsdl:import>
注入父 WSDL 文件,该文件包含与您的服务相关的所有元素和属性的架构定义。这意味着对它进行独立调用,将显示xs
命名空间定义。有关架构和数据类型的更多信息,请参阅here。
HUH ..经过审核,我看到xs被用作命名空间但xmlns:xsd 定义?怎么会发生这种情况?
是的,架构不是作为单独的文件定义的,而是作为 WSDL 的一部分定义的。它在<wsdl:types>
标记之间定义:
<wsdl:types>
<xs:schema xmlns:tns="http://webservices.mycompany.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://webservices.mycompany.com" version="1.0">
[..]
</wsdl:types>
有关ZSI绑定和存根生成的更多信息,请参阅here。
答案 1 :(得分:0)
来自ZSI文档:
如果调用的操作返回ComplexType,则必须提供typecode信息,以告知ZSI如何反序列化响应。
为了让ZSI透明地将返回的复杂类型反序列化为Person实例,必须将定义类及其类型代码的模块附加到ZSI.Path列表。通过将类作为参数传递给Binding.Receive()方法,也可以显式告诉ZSI使用哪个类和类型代码。第一种方法通常是首选方法,特别是对于公开分布的库。
从WSDL和XML Schema生成代码是ZSI提供访问WSDL服务的第二种方式。给定WSDL服务的路径,生成两个文件,一个“服务”文件和一个“类型”文件,然后可以使用它们来访问服务。