2009-09-04 6 views
2

J'ai un serveur (SoapUI) qui répond à des demandes de WSDL.Soap WSDL ComplexType en cours de publication en tant que type d'argument incorrect

Lors de l'envoi des demandes de test, mon code serveur reçoit une liste des arguments, mais je suis en train de réaliser est un seul argument, de type complexe, par exemple:

{ 
ingredient_id => INT 
something  => STRING 
... 
} 

Mes types sont les suivants:

<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> 

quelqu'un peut me aider à comprendre pourquoi WSDL fait SoapUI envoyer les arguments comme une liste de simp les arguments, au lieu d'un seul argument complexe?

EDIT: Il pourrait y avoir un problème avec la balise de séquence, mais je ne trouve pas le problème là-dedans, juste besoin de lumière. Merci d'avance!


Bien sûr, je l'ai ici:

<?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> 

ont encore aucune indication sur ce :(

Répondre

10

Vous devez écrire votre WSDL dans le style "Document/littéral enveloppé". Ces styles WSDL sont un peu confus mais here est une bonne comparaison.

Essentiellement, vous aurez besoin d'envelopper votre complexType dans un element:

<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> 

et spécifiez ce element à envoyer comme un message

<message name="getIngredientInfoRequest"> 
    <part name="parameters" element="IngredientInfo"/> 
</message> 

Ainsi, le message SOAP résultant contient ce la IngredientInfo-element comme le seul enfant du corps SOAP:

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

Pourquoi "ingredient_id" est-il dans le WSDL et "ingredient" dans la requête SOAP? –

1

Je ne pense pas que type WSDL (IngredientRequest) est la question, pouvez-vous affiche le WSDL complet, en particulier l'opération que vous testez si elle accepte un tableau de type IngredientRequest, alors c'est la réponse, pourquoi l'interface utilisateur SOAP envoie une liste d'arguments

+0

Sure Thing! Suivra le commentaire complet dans la réponse suivante –

0

Ok après avoir utilisé votre WSDL pour générer une demande d'échantillon à l'aide de mon interface SOAP est ici ce que je vois

<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> 

Ainsi, comme on le voit la création d'une seule requête getIngredientInfo objet ne tableaux. S'il vous plaît confirmer, essayez d'utiliser la dernière version de l'interface utilisateur SOAP si nécessaire!

0

Je crois comprendre que vous avez actuellement quelque chose comme ce qui suit (je fais un appel de service Web en Java, donc je vais par exemple en elle):

SOAPCaller.getIngredientInformation(3, "something"); 

Cependant, ce que vous vraiment comme est la suivante:

IngredientRequest ingredientRequest = new IngredientRequest(3, "something"); 
SOAPCaller.getIngredientInformation(ingredientRequest); 

Essayer quelque chose comme ce qui a causé Wierob suggéré le premier cas être ce qui a été généré pour moi. Malheureusement, le seul moyen que j'ai trouvé pour atteindre le second est de faire de l'encapsulation supplémentaire qui est désordonnée (des classes supplémentaires sont générées). Pourtant, cela permet d'envoyer un seul objet et de renvoyer un seul objet plutôt qu'un nombre d'objets. Voici un exemple:

<!-- 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> 
Questions connexes