Web services Soap WSDL ComplexType被发布为错误的参数类型

Web services Soap WSDL ComplexType被发布为错误的参数类型,web-services,soap,xsd,wsdl,Web Services,Soap,Xsd,Wsdl,我有一个服务器(SoapUI)应答WSDL请求 发送测试请求时,我的服务器代码接收到一个参数列表,但我试图实现的是一个复杂类型的单个参数,例如: { ingredient_id => INT something => STRING ... } 我的类型如下: <wsdl:types> <xsd:schema targetNamespace="/ingredient"> <xsd:element name="

我有一个服务器(SoapUI)应答WSDL请求

发送测试请求时,我的服务器代码接收到一个参数列表,但我试图实现的是一个复杂类型的单个参数,例如:

{
 ingredient_id   => INT
 something       => STRING
 ...
}
我的类型如下:

  <wsdl:types>
    <xsd:schema targetNamespace="/ingredient">
      <xsd:element name="getIngredientInfo" type="tns:IngredientRequest"></xsd:element>
      <xsd:element name="getIngredientInfoResponse" type="tns:ingredient"></xsd:element>

      <xsd:complexType name="ingredient">
        <xsd:sequence>
            <xsd:element name="ingredient_id" type="xsd:int" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="ingredient_name" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_gm" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_vegan" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_vegetarian" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="author_id" type="xsd:int" block="#all" minOccurs="1" maxOccurs="1"></xsd:element>
        </xsd:sequence>
      </xsd:complexType>

      <xsd:complexType name="IngredientRequest">
        <xsd:sequence>
            <xsd:element name="ingredient_id" type="xsd:int"></xsd:element>
            <xsd:element name="something" type="xsd:string"></xsd:element>
        </xsd:sequence>
      </xsd:complexType>

    </xsd:schema>
  </wsdl:types>

有人能帮助我理解为什么WSDL让SoapUI将参数作为简单参数列表而不是单个复杂参数发送吗

编辑:序列标签可能有问题,但我找不到问题所在,只是需要一些光线。 提前谢谢


当然,我就在这里:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions
  name="ingredient"
  targetNamespace="/ingredient"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:tns="/ingredient"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
    <xsd:schema targetNamespace="/ingredient">
      <xsd:element name="getIngredientInfo" type="tns:IngredientRequest"></xsd:element>
      <xsd:element name="getIngredientInfoResponse" type="tns:ingredient"></xsd:element>

      <xsd:complexType name="ingredient">
        <xsd:sequence>
            <xsd:element name="ingredient_id" type="xsd:int" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="ingredient_name" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>

            <xsd:element name="status_gm" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_vegan" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_vegetarian" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="author_id" type="xsd:int" block="#all" minOccurs="1" maxOccurs="1"></xsd:element>
        </xsd:sequence>
      </xsd:complexType>


      <xsd:complexType name="IngredientRequest">
        <xsd:sequence>
            <xsd:element name="ingredient_id" type="xsd:int"></xsd:element>

            <xsd:element name="something" type="xsd:string"></xsd:element>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="getIngredientInfoRequest">
    <wsdl:part element="tns:getIngredientInfo" name="parameters"/>
  </wsdl:message>
  <wsdl:message name="getIngredientInfoResponse">

    <wsdl:part element="tns:getIngredientInfoResponse"
        name="parameters" />
  </wsdl:message>
  <wsdl:portType name="ingredient">
    <wsdl:operation name="getIngredientInfo">
      <wsdl:input message="tns:getIngredientInfoRequest"/>
      <wsdl:output message="tns:getIngredientInfoResponse"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ingredientSOAP" type="tns:ingredient">

    <soap:binding style="document"
        transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="getIngredientInfo">
        <soap:operation
            soapAction="http://entropy.homelinux.org/kasak/" />
        <wsdl:input>
            <soap:body use="literal" />
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" />
        </wsdl:output>

    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ingredient">
    <wsdl:port binding="tns:ingredientSOAP" name="ingredientSOAP">
      <soap:address location="http://entropy.homelinux.org/kasak/"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>


仍然没有提示:(

我不认为WSDL类型(IngredEnterQuest)是问题所在,您能否显示完整的WSDL,特别是您正在测试的操作,如果它接受IngredEnterQuest类型的数组,那么这就是答案,为什么SOAP UI会发送参数列表。

您需要用“Document/literal-wrapped”-样式。这些WSDL样式有点混乱,但是一个很好的比较

本质上,您需要将
complexType
包装到
元素中:

<element name="IngredientInfo">
  <complexType>
    <sequence>
            <element name="ingredient_id" type="xsd:int"></xsd:element>
            <element name="something" type="xsd:string"></xsd:element>
    </sequence>
  </complexType>
</element>
因此,生成的SOAP消息包含
IngredientInfo元素
,作为SOAP正文的唯一子元素:

<soap:envelope>
    <soap:body>
        <IngredientInfo>
            <ingredient_id>42</ingredient_id>
            <something>"What is..."</something>
        </IngredientInfo>
    </soap:body>
</soap:envelope>

42
“什么是……”

在使用您的WSDL使用我的SOAP UI生成示例请求之后,确定这里是我看到的

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ing="/ingredient">
   <soapenv:Header/>
   <soapenv:Body>
      <ing:getIngredientInfo>
         <ingredient_id>?</ingredient_id>
         <something>?</something>
      </ing:getIngredientInfo>
   </soapenv:Body>
</soapenv:Envelope>

?
?

如图所示,它只创建了一个getIngredientInfo请求对象,没有数组。请确认,如果需要,请尝试使用最新版本的SOAP UI!

我的理解是,您目前有以下内容(我正在用Java进行web服务调用,因此我将在其中举例):

但是,您真正想要的是:

IngredientRequest ingredientRequest = new IngredientRequest(3, "something");
SOAPCaller.getIngredientInformation(ingredientRequest);
尝试Wierob建议的方法导致第一种情况是为我生成的。不幸的是,我发现实现第二种情况的唯一方法是进行额外的封装,这很混乱(生成了额外的类)。但是,它允许发送单个对象并返回单个对象,而不是返回多个对象。下面是一个示例:

<!-- assume the including of your complex types from above -->
<xsd:element name="getIngredientInfo" >
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="ingredient" type="tns:IngredientRequest" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

<xsd:element name="getIngredientInfoResponse" >
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="ingredientResponse" type="tns:ingredient" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>


当然!在下一个回答中,我们将跟随完整的注释。为什么在WSDL中和SOAP请求中都是
成分id
IngredientRequest ingredientRequest = new IngredientRequest(3, "something");
SOAPCaller.getIngredientInformation(ingredientRequest);
<!-- assume the including of your complex types from above -->
<xsd:element name="getIngredientInfo" >
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="ingredient" type="tns:IngredientRequest" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

<xsd:element name="getIngredientInfoResponse" >
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="ingredientResponse" type="tns:ingredient" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>