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

Web & réseau Delphi Discussion :

Client SOAP Delphi, serveur PHP, problème de types


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 43
    Par défaut Client SOAP Delphi, serveur PHP, problème de types
    Bonjour,

    J'ai un serveur SOAP PHP qui envoi au client Delphi un tableau associatif.
    Etant débutant dans le domaine, je n'ai aucune idée de la manière dont je peux récupérer ce tableau.

    Code php du serveur :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	/**
    	 * Retourne la liste des utilisateurs
    	 *
    	 * @return Array
    	 */
    	public function getUtilisateur()
    	{
    		$utilisateur = new Default_Model_Table_Utilisateur();		
    		return $utilisateur->getAll();
    	}

    Voici la structure du tableau :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    array(2) { [0]=> array(3) { ["id"]=> string(1) "1" ["identifiant"]=> string(6) "damien" ["password"]=> string(6) "damien" } 
    [1]=> array(3) { ["id"]=> string(1) "2" ["identifiant"]=> string(4) "toto" ["password"]=> string(4) "toto" } }

    En delphi, j'ai pensé à un TStringList, mais les types ne sont pas compatibles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      result := TStringList.Create();
      result := GetSoaptestPort().getUtilisateur();
    Auriez-vous une piste sur la manière d'exploiter le web service en delphi ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Tu utilises l'importateur WSDL de Delphi, je suppose, tu as donc un fichier qui a été généré avec les types qu'il te faut utiliser !

    Les Objets SOAP en Delphi sont tous hérités de TRemotable, le client lui étend IInvokable, il y a tout un mécanisme de sérialisation depuis et vers le SOAP !
    Les tableaux, sont de simple "array of" contenant des objets !

    Tu NE dois PAS créer les objets en retour d'une fonction !
    C'est une grave erreur, dans tous les cas, faire un Create puis une ré-affectation derrière, c'est fuite mémoire assuré !
    Sinon les objets sont typés, tu ne peux pas affecter un objet dans un autre par magie (comme en PHP)

    comme tu as utilisé l'importateur,Je te conseille de jouer avec les options de l'importateur, pour forcer la création d'objet Params et Result !
    un truc genre "Un param. de sortie est Return"

    Je te conseille aussi de cocher "dérouler des paramètres littéraux"

    Il faut par contre penser à libérer les objets !
    Si tu récupères un tableau, il te faudra le parcourir
    Si tu as utiliser un Result, sa libération provoquera la libération du tableau implicitement
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 43
    Par défaut
    Bonjour ShaiLeTroll,

    Merci pour toutes ces précisions qui m'ont bien aidé. Le problème venait effectivement de la déclaration du WSDL. Avec un WSDL correctement formaté, tout ce passe sans aucun problèmes et sans difficultés.

    Je poste quand même ce que j'ai fait au cas ou quelqu'un rencontrerait le même problème.
    (le code n'est pas propre, c'est juste pour faire des tests )

    Mon serveur est codé avec PHP avec le framework de Zend.
    Petite précision, il faut déclarer cette strategy :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');

    Voici ma class métier en PHP, celle qui est appelé par le client delphi.
    Code php : 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
     
    <?php
    class Soaptest {
     
    	/**
    	 * Retourne un tableau de toto
    	 *
    	 * @return string[]
    	 */
    	public function getUser()
    	{
    		$user = array("damien", "jean", "luc", "de larue");
    		return $user;
    	}
     
    	/**
    	 * Retourne un utilisateur
    	 *
    	 * @return utilisateur
    	 */
    	public function getUtilisateur()
    	{
    		$utilisateur = new utilisateur(2, 'damien');
     
    		return $utilisateur;
    	}
     
     
    	/**
    	 * Retourne un tableau d'utilisateur
    	 *
    	 * @return utilisateur[]
    	 */
    	public function getLesUsers()
    	{
    		$lesUsers = array(new utilisateur(2, 'damien'), new utilisateur(3, 'jean'));
    		return $lesUsers;
    	}
    }


    Et enfin, la partie delphi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var
      i : integer;
      lesUsers : ArrayOfUtilisateur;
    begin
     
    //Recupère les utilisateurs
     lesUsers := GetSoaptestPort().getLesUsers();
     
    //Parcours + Insertion dans une listBox
    for i := Low(lesUsers) to High(lesUsers) do
       ListUtilisateur.Items.Add(lesUsers[i].identifiant);
    end;

    Encore merci ShaiLeTroll

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Pense à libérer les Utilisateurs un par un, comme tu récupères un tableau, il ne doit pas y avoir de libération automatique !
    En utilisant un objet Return (voir option), en libérant l'objet, cela libère les éléments du tableau aussi !

    Pense aussi au bouton
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. SOAP: serveur PHP / client Perl
    Par hobeur dans le forum Modules
    Réponses: 0
    Dernier message: 16/06/2010, 13h32
  2. [Tchat] Serveur Php / Client Delphi
    Par Aloneghost dans le forum Web & réseau
    Réponses: 2
    Dernier message: 13/03/2009, 21h40
  3. [Web Service] SOAP serveur PHP client J2EE
    Par mejdi331 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 12/02/2009, 03h08
  4. Client Java (applet) - Serveur PHP ?
    Par nico_ayci dans le forum Services Web
    Réponses: 3
    Dernier message: 05/04/2008, 20h13
  5. Java en client d'un serveur PHP
    Par trollchichon dans le forum Services Web
    Réponses: 14
    Dernier message: 26/11/2007, 14h25

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