0

我是一个 SOAP 新手,负责恢复旧的肥皂接口。我已将soap 服务移植到新路径上的新tomcat 上(并保持客户端不变)。我发送请求: http://myserver:8181/soap/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 名称:类型关联,但似乎不是 - 或没有应用它们。那是 ...

呵呵.. 经审查,我看到 xs 被用作命名空间,但定义了 xmlns:xsd?这怎么可能发生?

对此接口 (Linux) 的 ZSI 客户端查询(来自 Windows,如果这有任何区别)接收包含预期数据有效负载的响应,然后将每个数据项映射到单独的“属性” - 生成通用属性列表。

我期待一个类型化成员的列表,每个属性都转换为它的 xs 类型(例如上面的 int、long、string、string),对吗?

提前感谢任何线索。

4

2 回答 2

1

鉴于您没有为手头的实际问题提供足够的信息,我将基于您是新手这一点,因此将我的答案包含在我认为与您的问题相关的部分中。

您的主要 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名称空间定义。有关架构和数据类型的更多信息,请参见此处

呵呵.. 经审查,我看到 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 绑定和存根生成的更多信息,请参见此处。

于 2012-04-20T17:33:23.577 回答
0

来自 ZSI 文档:

如果调用的操作返回一个 ComplexType,则必须提供类型代码信息以告诉 ZSI 如何反序列化响应。

为了让 ZSI 透明地将返回的复杂类型反序列化为 Person 实例,定义类及其类型代码的模块必须附加到 ZSI.Path 列表中。也可以通过将类作为参数传递给 Binding.Receive() 方法来显式地告诉 ZSI 使用什么类和类型代码。第一种方法通常是首选方法,特别是对于公开​​分发的库。

从 WSDL 和 XML 模式生成代码是 ZSI 提供的访问 WSDL 服务的第二种方式。给定 WSDL 服务的路径,会生成两个文件,一个“服务”文件和一个“类型”文件,然后可以使用它们来访问该服务。

于 2012-04-19T11:09:29.390 回答