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 :

Envoi d'un xml dans soap [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut Envoi d'un xml dans soap
    Bonjour,

    Je suis occupé à essayer de consommer un web service java en php.
    Mon problème est que je n'arrive pas à formater l'enveloppe (le XML) comme le fournisseur du web service le demande à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0" encoding="UTF-8"?>
    <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" >
       <env:Body>
          <memberChoiceRequest xmlns="http://xxxx.dto.beans.business.ws.xxxx.be">
             <federal>2909373</federal>
             <birthdate>20020708</birthdate>
             <controlDate>20120806</controlDate>
             <rl>N</rl>
          </memberChoiceRequest>
       </env:Body>
    </env:Envelope>
    L'enveloppe que j'envoie est structuré de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0" encoding="UTF-8"?>
    <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://xxxx.dto.beans.business.ws.xxxx.be">
       <env:Body>
          <ns1:memberChoiceRequest>
             <ns1:federal>2909373</ns1:federal>
             <ns1:birthdate>20020708</ns1:birthdate>
             <ns1:controlDate>20120806</ns1:controlDate>
             <ns1:rl>N</ns1:rl>
          </ns1:memberChoiceRequest>
       </env:Body>
    </env:Envelope>
    Et donc, j'ai une erreur de type Wrong Version et VersionMismatch.
    Alors ma question est si je génère l'enveloppe (XML), est-ce que je peux l'envoyer et si oui comment ?

    Merci,

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Est-ce que tu te sers de SoapClient ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Est-ce que tu te sers de SoapClient ?
    Oui, voici le 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
     
    $soap_options =  array(
             'soap_version'=>SOAP_1_2,
            'cache_wsdl' => WSDL_CACHE_NONE,
            'trace' => 1,
            'exceptions '=>0,
            'proxy_host' => $proxy,
            'proxy_login' => $user_proxy,
            'proxy_password' => $pass_proxy,
            'proxy_port' => $port_proxy
             );
     
    $client = new SoapClient( $wsdl,$soap_options);
     
    $param = array ('federal' => $federal, 'birthdate'=> $birthdate, 'controlDate' => $controlDate, 'rl'=>$rl);  //memberChoice method
     
    $response = $client->memberChoice($param);
    Et voici l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Fatal error: Uncaught SoapFault exception: [soap:Sender] Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'federal'. One of '{"http://xxxx.dto.beans.business.ws.xxxx.be":federal}' is expected.  in /var/www/temp/Dev Karim/fsmb/ws2.php:57
    Stack trace:
    #0 /var/www/temp/Dev Karim/fsmb/ws2.php(57): SoapClient->__call('memberChoice', Array)
    #1 /var/www/temp/Dev Karim/fsmb/ws2.php(57): SoapClient->memberChoice(Array)
    #2 {main}
      thrown in /var/www/temp/Dev Karim/fsmb/ws2.php on line 57

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    D'accord donc le problème j'imagine c'est que le namespace n'est pas déclaré au même endroit, ton serveur s'attends à le voir sur memberChoiceRequest et SoapClient le mets normalement sur l'enveloppe (et donc ajoute NS1 un peu partout).

    A mon avis, et à moins de pouvoir éditer le WSDL, tu peux peut être t'en sortir en surchargeant la méthode __doRequest de SoapClient. Tu trouvera quelques exemples sur la page du manuel.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    D'accord donc le problème j'imagine c'est que le namespace n'est pas déclaré au même endroit, ton serveur s'attends à le voir sur memberChoiceRequest et SoapClient le mets normalement sur l'enveloppe (et donc ajoute NS1 un peu partout).

    A mon avis, et à moins de pouvoir éditer le WSDL, tu peux peut être t'en sortir en surchargeant la méthode __doRequest de SoapClient. Tu trouvera quelques exemples sur la page du manuel.
    Merci pour ta réponse, j'ai l'impression de voir le bout du tunnel

    Je ne maîtrise pas l'orienté objet mais je plus ou moins le principe de surcharge par contre je ne vois pas quels paramètres ($request, $loaction, etc...) je dois modifier pour résoudre le problème de namespace.
    Un petit indice ?

    Merci !

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est $request qu'il faut manipuler, tu peux le décortiquer et le reconstruire avec DOMDocument.

    Exemple:
    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
    class CustomSoapClient extends SoapClient {
     
        function __doRequest($request, $location, $action, $version) {
            $dom = new DOMDocument('1.0', 'UTF-8');
            $dom->preserveWhiteSpace = false;
            $dom->loadXML($request);
     
     
            // ici, utiliser les fonctions DOM pour
            // mettre la requête dans "le bon sens"
     
            $request = $dom->saveXML();
            return parent::__doRequest($request, $location, $action, $version);
        }
    }
    NB: je n'ai pas la moindre idée de si ça va marcher ou pas (normalement y'a pas de raison).

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Problème résolu grace à un pete script trouver sur php.net.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class MSSoapClient extends SoapClient {
     
        function __doRequest($request, $location, $action, $version) {
            $namespace = "http://tempuri.com";
     
            $request = preg_replace('/<ns1:(\w+)/', '<$1 xmlns="'.$namespace.'"', $request, 1);
            $request = preg_replace('/<ns1:(\w+)/', '<$1', $request);
            $request = str_replace(array('/ns1:', 'xmlns:ns1="'.$namespace.'"'), array('/', ''), $request);
     
            // parent call
            return parent::__doRequest($request, $location, $action, $version);
        }
    }
    Merci Benjamin

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

Discussions similaires

  1. Envoi d'un xml dans soap php
    Par lepotier dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 12/08/2012, 18h42
  2. [PHP 5.2] Envoi de données en XML dans une socket
    Par saturnino dans le forum Langage
    Réponses: 2
    Dernier message: 10/09/2009, 10h03
  3. Réponses: 5
    Dernier message: 05/04/2008, 13h51
  4. Réponses: 1
    Dernier message: 04/04/2008, 09h08
  5. [SOAP][C#]envoi d'un flux xml en SOAP
    Par prez dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 25/04/2005, 17h57

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