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

Langage PHP Discussion :

[WebService] Passage d'objets en paramètre


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Points : 89
    Points
    89
    Par défaut [WebService] Passage d'objets en paramètre
    Bonjour,

    Tout d'abord, un excellente année à tous !

    Et maintenant mon problème
    j'ai créé un webservice en dotnet(c#) dans lequel j'ai une méthode (pushContact) qui reçoit un objet en paramètre.

    Voici l'essentiel de mon code
    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
     
    class Contact
    {
    	public $firstName;
    	public $lastName;
    	public function __construct()
    	{
    	} 
    } 
     
    $client = new SoapClient($WDSL, array( 'trace'=>true, "classmap"=>array('Contact'=>'Contact'), 'soap_version'=>SOAP_1_2, 'uri'=>$WS_NAMESPACE) );
     
    $param = new SoapVar($contact, SOAP_ENC_OBJECT, "Contact");
    //"c" est le nom du paramètre dans la définition de la méthode pushContact
    $result = $client->pushContact( new SoapParam($param,"c") );
    //la méthode pushContact renvoie un booléen
    var_dump($result);
    A tous les coups, je reçois pushContact
    Dans le webservice, j'enregistre les erreurs, la voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    La référence d'objet n'est pas définie à une instance d'un objet.
    //En anglais = Object reference not set to an instance of an object.
    Après plusieurs recherches, je suis tombé sur le post http://fr.php.net/manual/en/function...call.php#76831, j'ai essayé de le comprendre et de l'appliquer à mon problème mais ça ne marche pas.

    j'ai récupéré la dernière requête envoyé au webservice (avec $client->__last_request) et j'obtiens :
    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
     
    <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://mon.webservice.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <env:Header>
    	<ns1:CredentialHeader>
    		<ns1:login>philippe</ns1:login>
    		<ns1:password>test</ns1:password>
    	</ns1:CredentialHeader>
    </env:Header>
    <env:Body>
    	<ns1:pushContact xsi:type="Contact">
    		<ns1:firstName>test</ns1:firstName>
    		<ns1:lastName>test</ns1:lastName>
    	</ns1:pushContact>
    </env:Body>
    </env:Envelope>
    Avez-vous déjà été confronté à ce problème ?
    Pouvez-vous m'aider à le résoudre ?

    grand merci,

    Phil-

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Es-tu sûr que l'erreur ne provient pas de ton script .Net ? Pour le vérifier tentes de débugger l'application.

    Sinon tu peux tenter d'utiliser la méthode soapCall ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $client = new SoapClient($WDSL, array( 'trace'=>true, "classmap"=>array('Contact'=>'Contact'), 'soap_version'=>SOAP_1_2, 'uri'=>$WS_NAMESPACE) );
     
    $contact = new Contact();
    // Peut etre tenter deux techniques différentes pour valoriser les propriétés ?
    $param = new SoapVar($contact, SOAP_ENC_OBJECT, "Contact");
    $params = array(new SoapParam("John","firstName"), $param);
     
    $client->__soapCall("pushContact", array('parameters' => $params))
    Pourrais-tu nous montrer ton script c# ?

  3. #3
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Points : 89
    Points
    89
    Par défaut
    J'ai essayé en utilisant la méthode soapCall mais l'erreur apparait toujours

    Au début, je me suis dit que l'erreur venait du webservice, donc j'ai supprimé tout le traitement de la méthode pushContact et je n'ai plus que ceci :
    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
     
    [WebMethod]
        [SoapHeader("authentification")]
        public bool pushContact(Contact c)
    	{
        	try
        	{
    	    	this.DebugIntextFile("","log-"+DateTime.Now.ToString("ddMMyyyy") + ".txt",c.firstName + " " + c.lastName);
        		return true;
        	}
        	catch(Exception e)
        	{
     
        		this.DebugIntextFile("","log-"+DateTime.Now.ToString("ddMMyyyy") + ".txt",e.Message);
        		this.DebugIntextFile("","log-"+DateTime.Now.ToString("ddMMyyyy") + ".txt",e.Source);
        		this.DebugIntextFile("","log-"+DateTime.Now.ToString("ddMMyyyy") + ".txt",e.StackTrace);
        		return false;
        	}
        }
    A tout les coups, il passe dans le catch
    La méthode DebugIntextFile écrit dans un fichier ce qui est contenu dans son 3ème paramètre.

    Voici la classe Contact
    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
    using System;
    using System.Xml.Serialization;
     
    namespace contactWebservice
    {
    	/// <summary>
    	/// Description of Contact.
    	/// </summary>
    	[Serializable]
    	[XmlRoot ("Contact") ]
    	public class Contact
    	{
    		public string firstName;
    		public string lastName;
     
    		public Contact()
    		{
    		}
    	}
    }

    J'ai récupéré le contenu de la requête et elle est différente au niveau du body :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://.../">
    <env:Header><ns1:CredentialHeader>
    <ns1:login>philippe</ns1:login>
    <ns1:password>test</ns1:password>
    </ns1:CredentialHeader>
    </env:Header>
    <env:Body>
    	<ns1:pushContact>
    		<ns1:Contact xsi:nil="true"/>
    	</ns1:pushContact>
    </env:Body>
    </env:Envelope>

  4. #4
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Points : 89
    Points
    89
    Par défaut
    J'ai trouvé la solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $contact = new Contact();
    $contact->firstName = "Tintin";
    $contact->lastName = "Milou";
    $param = new SoapVar($contact, SOAP_ENC_OBJECT, "Contact", null, null, $WS_NAMESPACE);
    $wrapper->Contact = $contact;
    $params = new SoapParam($wrapper, "Contact");
    $result = $client->__soapCall("pushContact", array('parameters' => $params));
    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
    <xmp>
    <?xml version="1.0" encoding="UTF-8"?>
    <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://.../">
    <env:Header>
    	<ns1:CredentialHeader>
    		<ns1:login>philippe</ns1:login>
    		<ns1:password>test</ns1:password>
    	</ns1:CredentialHeader>
    </env:Header>
    	<env:Body>
    	<ns1:pushContact>
    		<ns1:Contact>
    			<ns1:firstName>test</ns1:firstName>
    			<ns1:lastName>test</ns1:lastName>
    		</ns1:Contact>
    	</ns1:pushContact>
    	</env:Body>
    </env:Envelope>
    </xmp>

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

Discussions similaires

  1. Passage d'Objet en paramètre d'un formulaire
    Par wadoo dans le forum IHM
    Réponses: 9
    Dernier message: 03/07/2008, 09h54
  2. Passage d'objet en paramètre de DLL
    Par nek_kro_kvlt dans le forum Langage
    Réponses: 22
    Dernier message: 22/07/2007, 19h50
  3. passage d'objet en paramètre
    Par chilokan dans le forum Delphi
    Réponses: 6
    Dernier message: 07/05/2007, 21h29
  4. [WD10]Passage d'objet en paramètres de methode
    Par Isildur dans le forum WinDev
    Réponses: 25
    Dernier message: 26/03/2007, 17h35
  5. [DLL] Passage d'objet en paramètre
    Par TitiFr dans le forum Langage
    Réponses: 4
    Dernier message: 20/08/2005, 23h18

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