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

Bibliothèques et frameworks PHP Discussion :

[Web Service][SOAP] récupérer les données d'un complexType


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut [Web Service][SOAP] récupérer les données d'un complexType
    Bonjour à tous.

    Alors voilà, cela fait un moment que j'avais essayé de placer des complexType dans mon fichier WSDL, mais je n'avais pas réussi après maintes recherches et tests. J'ai laissé çà de côté, et la comme j'ai un peu de temps je m'y suis remis. Et je n'y arrive toujours pas...
    J'ai compris l'utilité du classmap mais comment bien le manipuler ?
    Citation Envoyé par koopajah
    Le classmap sert a faire un mapping entre les types de ton WSDL et tes classes PHP pour stocker le résultat.
    http://www.developpez.net/forums/sho...light=classmap

    Donc si vous avez un exemple tout simple sous la main, ou un lien vers une doc précise (c'est rare), je suis tout à fait preneur

    Merci pour votre aide.

  2. #2
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Les documentations sur les wsdl et leur utilisation en PHP ne sont pas monnaie courante (dans d'autres langages non plus d'ailleurs).
    J'ai réussi a faire fonctionner le mien à force de trifouiller le WSDL et le code PHP dans tous les sens jusqu'à ce que ca marche et j'avoue n'avoir pas TOUT compris au pourquoi du comment.

    Dans tous les cas, lorsque ton WSDL passe plus d'un type en paramètre de ton webservice il vaut mieux se créer un type complexe (composé de type simple) et lui associer son équivalent en PHP.

    Récemment j'avais lu une news a propos de WSDL class generator, je ne sais pas du tout ce que ca vaut mais tu peux essayer. Sinon il y a aussi Construire un service web en php 5

    Une chose a bien savoir : commencer avec des choses SIMPLES! Il y a plusieurs problemes possibles : le serveur, le client, le wsdl, les classes php, le classmap. Et il vaut mieux avoir des choses TRES simples pour commencer et les compliquer au fur et a mesure (j'avais tenté un complex type qui était lui meme un tableau de complextype et j'en suis vite revenu a un complex type contenant simplement un int pour débuter)

    Ensuite utilises bien les fonctions conseillées dans le thread que tu cites et qui permettent de savoir ce qui se passe sur le serveur.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Je suis déjà allé sur les 2 liens proposés, d'ailleurs le 2eme est très bien il m'a fait comprendre pas mal de choses. Mais dans son exemple il n'y a que un seul element dans son complexType.
    Et sinon je préfère créer moi même le fichier WSDL pour comprendre au maximum, même si ca ressemble plus à du bourrage de crâne par moments

    J'ai déjà un exemple simple qui fonctionne, pour situer un peu, voila un bout de mon 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
            <wsdl:message name="CreateCustomerRequest">
    		<wsdl:part name="id" 		type="xsd:int"/>
    		<wsdl:part name="lname" 	type="xsd:string"/>
    		<wsdl:part name="fname"		type="xsd:string"/>
    		<wsdl:part name="age"		type="xsd:int"/>
    		<wsdl:part name="tv"		type="xsd:int"/>
    		<wsdl:part name="internet" 	type="xsd:boolean"/>
    		<wsdl:part name="vod"		type="xsd:boolean"/>
    		<wsdl:part name="ppv"		type="xsd:boolean"/>
    		<wsdl:part name="games"		type="xsd:boolean"/>
    		<wsdl:part name="serv"		type="xsd:boolean"/>
    	</wsdl:message>
    	<wsdl:message name="CreateCustomerResponse">
    		<wsdl:part name="return" type="xsd:SOAP-ENC:Array"/>
    	</wsdl:message>
    La fonction CreateCustomer renvoie 2 paramètres, l'id et un code de retour.
    Et comme tu le dis :
    Dans tous les cas, lorsque ton WSDL passe plus d'un type en paramètre de ton webservice il vaut mieux se créer un type complexe (composé de type simple) et lui associer son équivalent en PHP.
    J'aimerais bien faire passer un complexType au lieu de ces 10 paramètres. Même si cela fonctionne ainsi, j'ai envie de comprendre comment ca se passe pour l'associer en PhP. Surtout que j'en aurais surement besoin prochainement.

    En tout cas, je vais reprendre au début, refaire un exemple simple comme tu dis, et je vais voir.


    Et sinon pour ceci ?
    In response to comment by Nathan O'Sullivan about returning (or passing) a complex type, you can also use the stdClass() object.

    Assume you define a complex type like so:

    <xsd:complexType name="TestType">
    <xsd:all>
    <xsd:element name="A" type="xsd:string" />
    <xsd:element name="B" type="xsd:int" />
    <xsd:element name="C" type="xsd:boolean" />
    </xsd:all>
    </xsd:complexType>

    To use an object in place of an array you can do:

    $test = new stdClass();
    $test->A = "test string";
    $test->B = 45;
    $test->C = false;

    $result = $client->Test($test);
    C'est une méthode à la brutale ?

  4. #4
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Pour ta dernière question je pense que oui, il vaut mieux te créer ta propre classe.

    Extraits de mon WSDL :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsd:complexType name="monType">
      <xsd:sequence>
        <xsd:element name="Command"  type="xsd:string" />
        <xsd:element name="Response" type="xsd:string" />
      </xsd:sequence>
    </xsd:complexType>

    Classe PHP associée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class monType
    	{
    	public 	$Commande;		
    	public	$Response;
    	}
    Création du 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
    	// First step : disable the cache
    	ini_set("soap.wsdl_cache_enabled", "0");
     
    	// Define a mapping between WSDL's type and PHP's classes
    	$classmap = array('monType'     => 'monType');
     
    	// Link the SoapClient with our WSDL and our classmap
    	$clientSOAP = new SoapClient
    		(
    		dirname(__FILE__) . "/../WSDL/myServer.wsdl",
    		array
    			(
    			"trace"      => 1,
    			"exceptions" => 0,
    			'classmap' => $classmap
    			)
    		);

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Bon j'avais testé juste après ton message, mais ca ne marchait point. Donc une nouvelle fois j'ai reporté, avec du recul ca passe toujours mieux, sauf que desfois on a pas le temps pour cela, et c'est mon cas maintenant ^^

    Donc j'ai repris du début, j'ai fait un truc tout simple :
    Je prends en paramètre 2 nombres (a et b) et je renvoie leur somme. Difficile de trouver moins compliqué.

    J'ai un soucis, je ne reçois que le nombre a, le nombre b ne passe pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Add ($a, $b) 
    {
    	$bla = $a + $b;
    	return $bla;
    }
    Même quand je fais ceci, cela me renvoie rien du tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Add ($a, $b) 
    {
    	return $b;
    }
    Donc j'ai testé pas mal de choses, mais rien de fonctionne... Je vous passe mon code, si vous avez le temps pour y jeter un coup d'oeil, je vais continuer à bosser dessus de mon côté.

    Déclaration du serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $server = new SoapServer('Webservice.wsdl', array('soap_version' => SOAP_1_1,'encoding' => 'utf-8'));
    $server->setClass('myWebService');
     
    class myWebService 
    {
    	function Add ($a, $b) 
    	{
    		$bla = $a + $b;
    		return $bla;
    	}
    }
    Création du Client, et appel de la fonction Add :
    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
    class AddRequest {
    	public $number_a;
    	public $number_b;
    }
    class AddResponse {
    	public $return_add;
    }
     
    ini_set("soap.wsdl_cache_enabled", "0");
    $classmap = array ('AddRequest' => 'AddRequest', 'AddResponse' => 'AddResponse');
    $client = new SoapClient('Webservice.wsdl', array ('trace' => 1, 'exceptions' => 0, 'classmap' => $classmap));
     
    $res = $client->Add($nb_a,$nb_b);
     
    if (is_soap_fault($res))
    	echo trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
    else
    	echo "Le total fait : $res";
    Et le pavé pour la fin... le WSDL ! Je le met en entier désolé... mais il me faut des yeux extérieurs pour capter la moindre petite erreur "à la con" (si je puis me permettre ^^) :
    Code xml : 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
    <?xml version="1.0" encoding="utf-8"?>
     
    <wsdl:definitions name="WebService"
    targetNameSpace="urn:WebService"
    xmlns:tns="urn:WebService"
    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="http://schemas.xmlsoap.org/wsdl/http/">
     
     
    	<wsdl:types>
    		<xsd:schema elementFormDefault="qualified" targetNamespace="urn:WebService">
     
    			<xsd:complexType name="AddRequest">
    			  <xsd:sequence>
    				<xsd:element minOccurs="1" maxOccurs="1" name="number_a" type="xsd:int" />
    				<xsd:element minOccurs="1" maxOccurs="1" name="number_b" type="xsd:int" />
    			  </xsd:sequence>
    			</xsd:complexType>
     
    			<xsd:complexType name="AddResponse">
    			  <xsd:sequence>
    				<xsd:element minOccurs="1" maxOccurs="1" name="return_add" type="xsd:int" />
    			  </xsd:sequence>
    			</xsd:complexType>
     
    		</xsd:schema>
    	</wsdl:types>
     
     
    	<wsdl:message name="AddSoapIn">
    		<wsdl:part name="parameters" element="tns:AddRequest" />
    	</wsdl:message>
    	<wsdl:message name="AddSoapOut">
    		<wsdl:part name="parameters" elemebt="tns:AddResponse" />
    	</wsdl:message>
     
     
    	<wsdl:portType name="WebServPorts">		
    		<wsdl:operation name="Add">
    			<wsdl:input  message="tns:AddSoapIn"/>
    			<wsdl:output message="tns:AddSoapOut"/>
    		</wsdl:operation>
    	</wsdl:portType>
     
     
    	<wsdl:binding name="WebServBinding" type="tns:WebServPorts">
    		<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
     
    		<wsdl:operation name="Add">
    			<soap:operation soapAction="AddAction"/>
    			<wsdl:input>
    				<soap:body use="literal" />
    			</wsdl:input>
    			<wsdl:output>
    				<soap:body use="literal" />
    			</wsdl:output>
    		</wsdl:operation>
     
    	</wsdl:binding>
     
     
    	<wsdl:service name="WebServService">
            <wsdl:port name="WebServPorts" binding="typens:WebServBinding">
    			<soap:address location="http://localhost/v0.420.ComplexTypeTests/webservice.php"/>
    		</wsdl:port>
    	</wsdl:service>
     
     
    </wsdl:definitions>

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Bon je suis pratiquement sûr que le problème vient de mon fichier WSDL.
    J'ai essayé plusieurs trucs, placés mes definitions de complexType dans des <element name="..">, j'ai testé de changer le mode de transport des données, en document/literal, rpc/encoded...
    Puisque a priori, placer plus de <part> dans un <element> n'est pas conforme à la norme WS-I, donc... ma méthode de base vue dans au début du topic, n'est pas conforme...

    Je nage et je me noie, j'ai vraiment besoin d'aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Requete Web HTML pour récupérer les données dans Excel
    Par jbonneval dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 24/11/2016, 16h14
  2. [Web Service][SOAP] Compression des données avec NuSOAP ?
    Par lasdou15 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 17/04/2008, 12h14
  3. [Web Service][SOAP] Récupérer des paramètres dans l'entête
    Par Dadou dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 24/01/2008, 13h51
  4. [Web Service][SOAP] Données persistentes et connexion à la base de donnée
    Par Asmodean dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 15/05/2007, 15h00
  5. [Web Service][SOAP] Problemes d'envoi de donnée
    Par _Froggy_ dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/03/2006, 16h08

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