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 :

Php5 et Soap


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut Php5 et Soap
    Bonjour,

    J'essaye de connecter un site web à un web-service. Je développe donc un client soap.

    Dans les spécs techniques du web-service, il est expliqué que l'authentification à ce web-service se fait dans les header des requetes Soap. On me donne un exemple de requete:
    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
     
    POST /2011/01/01/ffip.asmx HTTP/1.1
    Host: soap.ffip.fr
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "GetExport"
     
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Header>
        <AuthenticationInfo xmlns="http://soap.ffip.fr/2011/01/01/ffip.wsdl">
          <softwareVersionKey xmlns="">string</softwareVersionKey>
          <softwarePassword xmlns="">string</softwarePassword>
          <realtorKey xmlns="">string</realtorKey>
          <userLogin xmlns="">string</userLogin>
          <userPassword xmlns="">string</userPassword>
          <cultureName xmlns="">string</cultureName>
        </AuthenticationInfo>
      </soap:Header>
      <soap:Body>
        <GetExport xmlns="http://soap.ffip.fr/2011/01/01/ffip.wsdl">
          <idSoftware xmlns="">string</idSoftware>
          <AuthenticationInfo xmlns="">
            <softwareVersionKey>string</softwareVersionKey>
            <softwarePassword>string</softwarePassword>
          </AuthenticationInfo>
        </GetExport>
      </soap:Body>
    </soap:Envelope>
    De mon coté, quand je construit ma requete Soap en mettant dans le header les informations nécessaire, ça me construit ça: (j'utilise la classe php http://php.net/manual/fr/class.soapclient.php )
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://soap.ffip.fr/2011/01/01/ffip.wsdl" xmlns:ns2="NAMESPACE">
    	<SOAP-ENV:Header>
    		<ns2:AuthenticationInfo>
    			<item>
    				<key>SoftwareVersionKey</key>
    				<value>truc</value>
    			</item>
    			<item>
    				<key>SoftwarePassword</key>
    				<value>machin</value>
    			</item>
    		</ns2:AuthenticationInfo>
    	</SOAP-ENV:Header>
    	<SOAP-ENV:Body>
    		<ns1:GetExport/>
    	</SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    Et quand j'envoi cette requete, je recupère une belle erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    soap:Client401 - SoftwareVersionKey is empty.
    Le code de mon client soap ("GetExport" est une des méthodes fournie par le web-service):
    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		= 'http://soap.ffip.fr/2011/01/01/ffip.asmx?WSDL';
    $Auth		= array(
    				'SoftwareVersionKey'=>$SoftwareVersionKey,
    				'SoftwarePassword'=>$SoftwarePassword,
    			);
    $Header		= new SoapHeader($Wsdl,'AuthenticationInfo',$Auth,false);
    $Service	= new SoapClient($Wsdl,array("trace" => 1));
    $Service	->__setSoapHeaders($Header);
    try{
    	$Service	->GetExport();
    }
    catch(SoapFault $Fault){
    	echo "SOAP Fault : ".$Fault;
    }
    Ainsi voila ma question: la structure de ma requête n'étant pas exactement la même que la requête qui m'est donnée en exemple. Le problème vient-il de là, ou le serveur soap est-il censé savoir "tout lire"?
    Et y'a-til d'autres classes php qui me permettraient de construire la requête comme sur l'exemple?

    Merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    T'as pas a envoyer de XML, montre ton code

  3. #3
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut
    J'envois pas de XML "en dur": ce que je te montre je le recupère via l'onglet "Réseau" de Firebug.
    J'ai édité le 1er post pour y mettre le code Php

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    ne met rien dans le namespace

  5. #5
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut
    Si j'enlève le Namespace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $Header = new SoapHeader('','AuthenticationInfo',$Auth,false);
    quand je vérifie ce que j'envoi au serveur soap avec "$ClientSoap->__getLastRequest()", c'est vide.

    Quand je laisse une valeur au namespace, j'obtient le 2nd XML posté dans le premier post. Mais enfait, pourquoi enlever le namespace?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Visible dans ta requete le namespace est faux, il attend : http://soap.ffip.fr/2011/01/01/ffip.wsdl
    par contre je trouve ça bizarre qu'il fasse key .. value

  7. #7
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut
    Ok merci stealth35.

    J'ai trouvé ça: http://www.developpez.net/forums/d85...-headers-soap/

    J'ai pu enlever les value/key, mais j'ai toujours la même erreur.
    Par contre je remarque un truc: dans l'exemple de requete soap qui m'est donné, on retrouve dans le <body> les paramètres d'authentification. Hors dans ce que j'ai fais moi, ces paramètres je let met bien dans le header, mais pas dans le body.
    Comment je peux faire pour changer mon body? Concretement, passer de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <SOAP-ENV:Body>
       <ns1:GetExport/>
    </SOAP-ENV:Body>
    A ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <SOAP-ENV:Body>
          <ns1:GetExport/>
          <AuthenticationInfo xmlns="">
            <softwareVersionKey>string</softwareVersionKey>
            <softwarePassword>string</softwarePassword>
            <realtorKey>string</realtorKey>
            <userLogin>string</userLogin>
            <userPassword>string</userPassword>
            <cultureName>string</cultureName>
          </AuthenticationInfo>
    </SOAP-ENV:Body>

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Oui c'est assez contradictoire, si tu veux mettre ça dans le body il faut faire une requete normale et passer l'auth en paramètre,
    par contre y'a pas de GetExport dans le ton WSDL

  9. #9
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut
    Si si, il y a un GetExport, ligne 658 du WSDL.
    Je vais continuer à chercher, mais merci en tout cas

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    en effet, donc il attend 2 paramètres, idSoftware et AuthenticationInfo, donc pas besoin du Header

  11. #11
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut
    Problème résolu.
    Pour ceux que ça interesseraient:

    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
     
    $Wsdl	 = "http://soap.machin.fr/.../truc.wsdl";
    $Auth = array(
    	"softwareVersionKey" => $SoftwareVersionKey,
    	"softwarePassword"   => $SoftwarePassword
    );
    $Header = new SoapHeader($Wsdl,'AuthenticationInfo',$Auth,false);
     
    try{
    	$ClientSoap	= new SoapClient($Wsdl,array("trace" => 1));
    	$ClientSoap	->__setSoapHeaders($Header);
    }
    catch(SoapFault $Fault){
    	echo "SOAP Header Fault : ".$Fault;
    }
     
    try{
    	$ClientSoap -> GetExport(array("idSoftware"=>"50"));
    }
    catch(SoapFault $Fault){
    	echo "SOAP Query Fault : ".$Fault;
    }

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

Discussions similaires

  1. php5 webservice soap
    Par piotrowski-s dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 06/08/2012, 19h10
  2. [Web Service][SOAP] Erreur avec php5 et soap
    Par lehic dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 02/08/2011, 17h23
  3. Hébergement gratuit PHP5 avec SOAP
    Par youkielkanish dans le forum Gratuit
    Réponses: 2
    Dernier message: 12/06/2010, 11h59
  4. Réponses: 2
    Dernier message: 22/01/2007, 21h51
  5. [Web Service][SOAP] WSDL/PHP5/SOAP: Renvoyer un tableau
    Par Netman dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 19/05/2006, 19h08

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