IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

APIs XML Discussion :

[WSDL] Probléme de passage d'un type matrice à double tableaux


Sujet :

APIs XML

  1. #1
    Membre régulier

    Inscrit en
    Mai 2002
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 93
    Points : 85
    Points
    85
    Par défaut [WSDL] Probléme de passage d'un type matrice à double tableaux
    Bonjour à tous,
    J'essaie de créer une API Webservice SOAP en utilisant SoapServer, je construis mon WSDL manuellement et je n'ai aucun probléme avec ça, sauf à une éxception prés:

    J'ai une fonction qui retourne une matrice à double tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Array
    (
        [football] => Array
            (
                [0] => Array
                    (
                        [0] => Array
                            (
                                [key] => name
                                [value] => EST
                            )
     
                        [1] => Array
                            (
                                [key] => score
                                [value] => 21
                            )
     
                    )
     
                [1] => Array
                    (
                        [0] => Array
                            (
                                [key] => name
                                [value] => ESS
                            )
     
                        [1] => Array
                            (
                                [key] => score
                                [value] => 22
                            )
     
                        [2] => Array
                            (
                                [key] => extra
                                [value] => 1
                            )
     
                    )
     
                [2] => Array
                    (
                        [0] => Array
                            (
                                [key] => name
                                [value] => CSS
                            )
     
                        [1] => Array
                            (
                                [key] => faxNumber
                                [value] => 88991122
                            )
     
                    )
     
            )
     
    )
    J'ai formaté mon WSDL de sorte à obtenir ceci en reponse à un appel webservice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:PBErMi" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="urn:PB10" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
       <SOAP-ENV:Body>
          <ns1:getAccountHistory>
             <return xsi:type="ns2:TgetHistoryResponse">
                <response xsi:type="ns2:ThistoryResponse">
                   <football SOAP-ENC:arrayType="ns2:Tresponse[3]" xsi:type="ns2:ThistoryContainer">
                      <item SOAP-ENC:arrayType="ns2:TresponseElement[2]" xsi:type="ns2:Tresponse">
                         <item xsi:type="ns2:TresponseElement">
                            <key xsi:type="xsd:string">name</key>
                            <value xsi:type="xsd:string">EST</value>
                         </item>
                         <item xsi:type="ns2:TresponseElement">
                            <key xsi:type="xsd:string">score</key>
                            <value xsi:type="xsd:string">21</value>
                         </item>
                      </item>
                      <item SOAP-ENC:arrayType="ns2:TresponseElement[3]" xsi:type="ns2:Tresponse">
                         <item xsi:type="ns2:TresponseElement">
                            <key xsi:type="xsd:string">name</key>
                            <value xsi:type="xsd:string">ESS</value>
                         </item>
                         <item xsi:type="ns2:TresponseElement">
                            <key xsi:type="xsd:string">score</key>
                            <value xsi:type="xsd:string">22</value>
                         </item>
                         <item xsi:type="ns2:TresponseElement">
                            <key xsi:type="xsd:string">extra</key>
                            <value xsi:type="xsd:string">1</value>
                         </item>
                      </item>
                      <item SOAP-ENC:arrayType="ns2:TresponseElement[2]" xsi:type="ns2:Tresponse">
                         <item xsi:type="ns2:TresponseElement">
                            <key xsi:type="xsd:string">name</key>
                            <value xsi:type="xsd:string">CSS</value>
                         </item>
                         <item xsi:type="ns2:TresponseElement">
                            <key xsi:type="xsd:string">faxNumber</key>
                            <value xsi:type="xsd:string">88991122</value>
                         </item>
                      </item>
                   </football>
                </response>
             </return>
          </ns1:getAccountHistory>
       </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    Ceci est mon code WSDL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    <definitions name="PB" targetNamespace="urn:PB10"
    	xmlns:typens="urn:PB10"
    	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    	xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    	xmlns="http://schemas.xmlsoap.org/wsdl/">
     
    	<!-- Types  -->
     
    	<types>
    	    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" 
    	    	targetNamespace="urn:PB10" elementFormDefault="qualified" attributeFormDefault="qualified">
     
    			<xsd:complexType name="TresponseElement">
    				<xsd:all>
    				  <xsd:element name="key" type="xsd:string"/>
    				  <xsd:element name="value" type="xsd:string"/>
    				</xsd:all>
    			</xsd:complexType>
     
    			<xsd:complexType name="Tresponse">
    		        	<xsd:complexContent>
    					<xsd:restriction base="soapenc:Array">
    				    		<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:TresponseElement[]"/>
    			    		</xsd:restriction>
    		    		</xsd:complexContent>
    		    	</xsd:complexType>
     
    			<xsd:complexType name="ThistoryContainer">
    		        	<xsd:complexContent>
    					<xsd:restriction base="soapenc:Array">
    					    	<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:Tresponse[]"/>
    			    		</xsd:restriction>
    		   		</xsd:complexContent>
    			</xsd:complexType>
     
    			<xsd:complexType name="ThistoryResponse">
    				<xsd:all>
    					<xsd:element minOccurs="0" maxOccurs="1" name="football" type="typens:ThistoryContainer"/>
    					<xsd:element minOccurs="0" maxOccurs="1" name="basketball" type="typens:ThistoryContainer"/>
    					<xsd:element minOccurs="0" maxOccurs="1" name="volleyball" type="typens:ThistoryContainer"/>
    					<xsd:element minOccurs="0" maxOccurs="1" name="handball" type="typens:ThistoryContainer"/>
    				</xsd:all>
    			</xsd:complexType>
     
    			<xsd:complexType name="TgetHistoryResponse">
    				<xsd:all>
    					<xsd:element minOccurs="0" maxOccurs="1" name="response" type="typens:ThistoryResponse"/>
    				</xsd:all>
    			</xsd:complexType>
     
    		</xsd:schema>
    	</types>
     
    	<!-- Messages for PB Web API  -->
     
    	<message name="getInput">
    		<part name="key" type="xsd:string" />
    		<part name="sync" type="xsd:boolean" />
    		<part name="player" type="xsd:string" />
    	</message>
     
    	<message name="getHistoryResponse">
    		<part name="return" type="typens:TgetHistoryResponse" />
    	</message>
     
    	<!-- Port for PB Web API -->
     
    	<portType name="PB10Port">
    		<operation name="getAccountHistory">
    			<input message="typens:getInput" />
    			<output message="typens:getHistoryResponse" />
    		</operation>
    	</portType>
     
     
    	<!-- Binding for PB Web API - RPC, SOAP over HTTP -->
     
    	<binding name="TriTuxBinding" type="typens:PB10Port">
    		<soap:binding style="rpc"
    			transport="http://schemas.xmlsoap.org/soap/http" />
    		<operation name="getAccountHistory">
    			<soap:operation soapAction="urn:PBErMi" />
    			<input>
    				<soap:body use="encoded" namespace="urn:PBErMi"
    					encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    			</input>
    			<output>
    				<soap:body use="encoded" namespace="urn:PBErMi"
    					encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    			</output>
    		</operation>
    	</binding>
     
      <!-- Endpoint for PB Web API -->
    	<service name="PBService">
    		<port name="PB10Port" binding="typens:TriTuxBinding">
    			<soap:address location="http://localhost/PB/soapapi/"/>
    		</port>
    	</service>
    </definitions>
    En utilisant des clients de test tel que
    • soapUI (Java)
    • wsdl_client (C)
    • la classe SoapClient (php)

    je n'ai pas eu de probléme pour interpreter le retour de getAccountHistory().

    Le probléme est localisé avec Java et .Net, avec un client .Net, l'appel au WSDL est effectué avec succés (donc le WSDL est valide), sauf que l'appel au service getAccountHistory() genere une exception :
    Il existe une erreur dans le document XML (2, 758)
    (Ligne 2, colonne 758) pointe sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    football SOAP-ENC:arrayType="ns2:Tresponse[3]" xsi:type="ns2:ThistoryContainer ...
    Plus de détails sur l'exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"Le type spécifié n'était pas reconnu : nom='Tresponse', espace de noms='urn:PB10' à <football xmlns=''>."}

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 39
    Points : 31
    Points
    31
    Par défaut Réponse trouvée
    Bonjour,

    Je rencontre le même type de problème, avez vous trouvé une solution ?

    Cordialement,
    B.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    c'est peut être trop tard , mais ça peut toujours servir
    dans wsdl, quand on déclare un tableau , il faut que le nom de celui ci soit de la manière : arrayOfType
    dans le cas ci-desssous la déclaration pour un tableau de TresponseElement doit être comme suit:
    <xsd:complexType name="ArrayOfTresponseElement">
    <xsd:complexContent>
    <xsd:restriction base="soapenc:Array">
    <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:TresponseElement[]"/>
    </xsd:restriction>
    </xsd:complexContent>
    </xsd:complexType>
    donc il y a une r^gle à suivre pour le nom à donner pour le nouveau type.
    http://msdn.microsoft.com/fr-fr/library/bb469924.aspx

Discussions similaires

  1. [Syntaxe] problème de passage de type en argument
    Par coyotte507 dans le forum C++
    Réponses: 2
    Dernier message: 25/05/2007, 15h50
  2. Problème avec les champs de type table
    Par devdev dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/12/2004, 16h05
  3. problème de passage de paramêtre sous mozilla
    Par mat10000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/09/2004, 10h48
  4. problème de passage de texte avec getvariable
    Par VincentB dans le forum Flash
    Réponses: 2
    Dernier message: 12/01/2004, 18h35
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo