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] PHP5 SOAP => Modification et formatage des headers SOAP


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 41
    Points
    41
    Par défaut [Web Service] PHP5 SOAP => Modification et formatage des headers SOAP
    Bonjour,
    Je dois développez un appli php pour se connecter à un webservice (serveur AXIS).
    On m'a fournit une appli VB qui tourne sur laquelle je me base.
    Mon soucis c'est qu'en PHP le login + password ne semble pas être bon.

    Code 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <?php
     
    $url_mm="http://ws.xxxxxx:7777/xxxxx/xxxxx/xxxxxx?wsdl";
     
    $params = array (
                            'trace'    => 1
                    );
     
    $ns = 'xxxxxx'; //Namespace of the WS.
     
    $client = new SoapClient($url_mm, $params);
     
    $headerbody = array(
                            'user'=>'xxxxx',
                            'Password'=>'xxxxx'
    );
     
    $header = new SOAPHeader($ns, 'Principal', $headerbody);
     
    $client->__setSoapHeaders($header);
     
     
            $client->__soapCall(
                                    'getMakes',
                                    array(
                                                    'FR',
                                                    'FR',
                                                    1,
                                                    new soapVar(
                                                            '2009-12-12',
                                                            XSD_DATE
                                                    )
                                    )
    );
     
    ?>
    Le code VB qui fonctionne pour une autre methode, envoi le xml suivant:
    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
      Dim requeteSOAP As String = "<?xml version=" + """1.0"" encoding=""utf-8""?>" + ControlChars.Lf
            requeteSOAP += "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">" + ControlChars.Lf
            requeteSOAP += "<soapenv:Header>" + ControlChars.Lf
            requeteSOAP += "<ns1:Principal soapenv:mustUnderstand=""0"" xmlns:ns1=""xxxxxxxx"">" + ControlChars.Lf
            requeteSOAP += "<ns1:user>xxxxxx</ns1:user>" + ControlChars.Lf
            requeteSOAP += "<ns1:password>xxxxxx</ns1:password>" + ControlChars.Lf
            requeteSOAP += "</ns1:Principal>" + ControlChars.Lf
            requeteSOAP += "<ns2:underlying-user soapenv:mustUnderstand=""0"" xmlns:ns2=""xxxxxx""></ns2:underlying-user>" + ControlChars.Lf
            requeteSOAP += "</soapenv:Header>" + ControlChars.Lf
            requeteSOAP += "<soapenv:Body>" + ControlChars.Lf
            requeteSOAP += "<getModels soapenv:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">" + ControlChars.Lf
            requeteSOAP += "<targetMarket xsi:type=""xsd:string"">FR</targetMarket>" + ControlChars.Lf
            requeteSOAP += "<transactionMarket xsi:type=""xsd:string"">FR</transactionMarket>" + ControlChars.Lf
            requeteSOAP += "<vehicleType xsi:type=""xsd:int"">"+ vehicleType +"</vehicleType>" + ControlChars.Lf
            Dim strDate As string = DateTime.Now.ToString("yyyy-MM-dd")
            requeteSOAP += "<searchDate xsi:type=""xsd:date"">"& strDate &"</searchDate>" + ControlChars.Lf
            requeteSOAP += "<registrationDate xsi:type=""xsd:date"">"+ RegDate +"</registrationDate>" + ControlChars.Lf
            requeteSOAP += "<yearModel xsi:type=""xsd:int"">"& Request.Form("cmbMillesimes") &"</yearModel>" + ControlChars.Lf
            requeteSOAP += "<makeOID xsi:type=""xsd:int"">"+ makeOID +"</makeOID>" + ControlChars.Lf
            requeteSOAP += "</getModels>" + ControlChars.Lf
            requeteSOAP += "</soapenv:Body>" + ControlChars.Lf
            requeteSOAP += "</soapenv:Envelope>"
    Le code xml généré capturé par tcpdump
    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
    POST /xxxxx/xxxxx/xxxxxxx HTTP/1.1
    Host: ws.xxxxxx:7777
    Connection: Keep-Alive
    User-Agent: PHP-SOAP/5.2.6-1+lenny3
    Content-Type: text/xml; charset=utf-8
    SOAPAction: ""
    Content-Length: 914
    
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="xxxxxxxx" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Header>
    <ns1:Principal>
    <item><key>user</key><value>xxxx</value></item>
    <item><key>Password</key><value>xxxx</value></item>
    </ns1:Principal>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
    <ns1:getMakes>
    <targetMarket xsi:type="xsd:string">FR</targetMarket>
    <transactionMarket xsi:type="xsd:string">FR</transactionMarket><vehicleType xsi:type="xsd:int">1</vehicleType>
    <searchDate xsi:type="xsd:date">2009-12-12</searchDate><registrationDate xsi:nil="true"/>
    <yearModel xsi:nil="true"/>
    </ns1:getMakes>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    Est-ce que mon soucis viendrait du fait que ce qui est envoyé en PHP pour le user et password contient les balises item et value en + comparé à VB?
    Si oui comment puis-je faire pour enlever ses balises? ou au mieux procédé comme le VB, c'est à dire fournir le même xml à ce web service


    Merci beaucoup

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    ça a l'air oui...

    essaie plutôt ça pour $headerbody :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $headerbody = array('xxxxx','xxxxx');
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Ce n'est pas mieux ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <ns1:Principal>
    <xsd:string>xxxx</xsd:string>
    <xsd:string>xxxxxx</xsd:string>
    </ns1:Principal>

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $headerbody->user = 'xxxxx';
    $headerbody->password= 'xxxxx';
    Et là ?

    PS: Dans ton premier exemple, tu as mis une majuscule à password. Peut-être que c'était bon aussi...
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $headerbody->user = 'xxxxx';
    $headerbody->password= 'xxxxx';
    Et là ?

    PS: Dans ton premier exemple, tu as mis une majuscule à password. Peut-être que c'était bon aussi...
    En effet j'avais mis un "P" au lieu d'un "p" mais cela n'est pas la cause ^^

    Et pourquoi:
    $headerbody n'est pas un objet

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Ca marcheeeeeeeeeeeee
    Un grand merci

    mais je voudrais tout de même comprendre la raison de cette manipulation si possible

    Pourquoi $headerbody->user = 'xxxxx'; ??
    Ce n'est pas un objet pourtant alors pourquoi cela fonctionne t'il ^^

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    $headerbody est ce que tu en fais.

    En écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $headerbody->user = 'xxxxx';
    $headerbody->password= 'xxxxx';
    PHP comprend qu'il doit le transformer en objet. D'autant plus que $headerbody n'existe pas avant...

    La librairie PhpSoap te permet de manipuler des objets à la place du XML brut ou même d'un tableau... Sers en toi pour faire du code "plus propre"...

    Bon courage !
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Pour généraliser, PHP est un langage à typage faible. En gros une variable s'adapte à ce qu'on lui affecte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $var = 106; //integer
    $var= '106'; //string
    $var = 106.00; //float
     
    var_dump($var);
    Affiche :
    float(106)
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    $headerbody est ce que tu en fais.

    En écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $headerbody->user = 'xxxxx';
    $headerbody->password= 'xxxxx';
    PHP comprend qu'il doit le transformer en objet. D'autant plus que $headerbody n'existe pas avant...

    La librairie PhpSoap te permet de manipuler des objets à la place du XML brut ou même d'un tableau... Sers en toi pour faire du code "plus propre"...

    Bon courage !
    Ce que je n'avais pas compris, c'était surtout pourquoi il attendait un objet plutôt qu'un array ^^
    Et tu trouves que mon code n'est aps assez propre ? ^^ ou c'est juste pour les prochains dev?

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Pour le dev en général, ton code n'est pas brouillon sauf l'indentation mais je suppose que c'est dû au copier/coller...
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

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

Discussions similaires

  1. [Web Service] PHP5 SOAP => no SOAPAction header!
    Par ssc37 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/01/2010, 10h55
  2. [Web Service] PHP, soap et type complex
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 01/07/2009, 16h58
  3. [Web Service] Serveur SOAP - NuSOAP ou php_soap (natif)
    Par alexfrere dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 19/01/2009, 11h43
  4. [Web Service] PHP & SOAP - web service
    Par Gregory.M dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/12/2008, 13h07
  5. Web Service Adressing SOAP Asynchone
    Par miryame dans le forum Services Web
    Réponses: 2
    Dernier message: 23/11/2006, 12h52

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