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

Zend Framework PHP Discussion :

Zend_Soap_Client et XML request


Sujet :

Zend Framework PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Par défaut Zend_Soap_Client et XML request
    Bonjour à tous.

    je suis en train de me battre avec un épineux problème et j'en arrive presque à la déduction que c'est impossible à réaliser (mais cette déduction ne me satisfait que fort peu).

    Je commence l'histoire depuis le début.


    Il me faut envoyer via webservice des informations récoltées dans ma base de données. Jusque là, rien de bien complexe.
    J'ai donc créer un classe avec une fonction "sendRequest" pour envoyer ma requete (le client étant défini dans mon constructeur):

    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
    function __construct($config = array()) {
            $options = array(
                'soap_version' => SOAP_1_1, 
                //'features' => SOAP_SINGLE_ELEMENT_ARRAYS
            );
     
            $this->client = new Zend_Soap_Client($this->_url, $options);
            $auth = new stdClass();
            $auth->Username = $this->Username;
            $auth->Password = $this->Password;
     
              $header = new SoapHeader($this->namespace,"Credentials", $auth);
              $this->client->addSoapInputHeader($header,true);
     
        }
     
    function sendRequest($action, $data, $logThis = true) {
            $file = APPLICATION_PATH . $this->logFile . '-'. date("Ymd"). '.log';
            try {
                var_dump($data);
                $retour = $this->client->$action($data);
                if ($logThis === true) {
                    file_put_contents($file, '[' . date('Y-m-d H:i:s') . '] SENDED : ' . "\n" . $this->client->getLastRequest() . "\n" . print_r($retour, true) . "\n", FILE_APPEND);
                }
            } catch (Exception $ex){
                file_put_contents($file, '[' . date('Y-m-d H:i:s') . '] EXCEPTION : ' . "\n" . $ex->getMessage() . "\n" . print_r($data, true) . "\n", FILE_APPEND);
                throw new Exception($ex->getMessage());
            }
            return $retour;
        }
    Ce qui, je l'avoue fonctionne très bien quand $data est une sdtClass.

    MAIS (car il y a un mais, quand même), j'ai une information qui dois se répéter.
    Oui, selon l'xml d'exemple que le destinataire m'envoie, j'ai une balise qui se répète comme 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
    ...<InterestedCars>
    <InterestedCar>
       <Model>i10</Model>
       <OrderBrochure></OrderBrochure>
       <OrderExtras></OrderExtras>
       <RequestTestdrive>1</RequestTestdrive>
    </InterestedCar>
    <InterestedCar>
       <Model>New Santa Fe</Model>
       <OrderBrochure></OrderBrochure>
       <OrderExtras></OrderExtras>
       <RequestTestdrive>1</RequestTestdrive>
    </InterestedCar>
    </InterestedCars>...
    (je ne mets pas l'XML intégralement, juste le passage intéressant, pour des raisons de confidentialité).

    Cas que je ne sais pas reproduire avec mon objet stdClass (car il acceptera pas 2 paramètres différents portant le nom InterestedCar) .
    J'ai bien entendu essayer d'utiliser un array pour mon paramètre InterestedCar mais ça ne passe pas.


    J'ai donc pensé à LA solution qui me semblait tout indiquée: passer non pas une stdClass mais un xml directement.

    Mais voilà, visiblement la validation de mon soap le rejete, car il considère que j'envoie juste la première balise et pas le reste ....

    cherchant sur le net, je tombe sur ceci : http://stackoverflow.com/questions/1...ing-soapclient qui me propose d'envoyer un SimpleXMLElement, chose que je fait, à l'aide d'un var_dump au préalable, il me confirme bien l'entièreté de mon xml mais ... dans mon fichier de log j'obtiens dans mon getLastRequest mon enveloppe ... vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="ZZZZZZZ"><SOAP-ENV:Header><ns1:Credentials><ns1:Username>XXXXXX</ns1:Username><ns1:Password>YYYYYY</ns1:Password></ns1:Credentials></SOAP-ENV:Header><SOAP-ENV:Body><ns1:AddCarPackage><ns1:request/></ns1:AddCarPackage></SOAP-ENV:Body></SOAP-ENV:Envelope>
    Alors que mon <ns1:request/> devrait être remplis d'une Balise, englobant, entre autre, ma balise InterestedCars.


    Ma question est donc principalement:
    Comment puis-je avec un Zend_Soap_Client passer directement le xml, partiel (juste mon SOAP-ENV:Body) ou intégral?
    Ou alors comment reproduire une balise dans l'envoie xml à l'aide de mon stdClass (ou array)?

    Est-ce seulement possible? j'imagine que oui.

    j'espère avoir fournis assez d'information pour vous permettre de comprendre mon soucis (que je le traine depuis 3 jours)
    Merci d'avance de votre aide.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Bonjour,

    Ça ne réponds pas à ta question, mais j'ai du mal à voir pourquoi envoyer du XML et pas un tableau de stdClass à la place ?

    Sinon pour le XML, si tu le protèges via htmlspecialchars ça devrait le faire considérer comme une simple chaîne, que tu pourras "reconstruire" sous forme de structure XML par l'application qui consomme ton service.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Par défaut
    je ne peux pas envoyer une simple stdClass car mon client me demande de répéter le paramètre InterestedCar pour autant de fois que j'ai ce renseignement en DB pour un client précis.

    Avec une stdClass; je ne peu avoir que 1 fois le paramètre InterestedCar (logique en fait).



    Pour envoyer le XML avec htmlspecialchars, je n'ai pas la main mise sur la façon de réceptionner le webservice (autre société) et donc je ne peux pas leur demander de modifier la façon dont ils traitent les données.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Citation Envoyé par AntaresJon Voir le message
    Avec une stdClass; je ne peu avoir que 1 fois le paramètre InterestedCar (logique en fait).
    Oui, c'est pour ça que je parle de tableau de stdClass, chaque entrée contenant un stdClass qui décrit un InterestedCar.

    Pour envoyer le XML avec htmlspecialchars, je n'ai pas la main mise sur la façon de réceptionner le webservice (autre société) et donc je ne peux pas leur demander de modifier la façon dont ils traitent les données.
    Ils recevront une chaîne XML prête à être parsée comme un XML, mais si ils s'attendent à un objet déjà manipulable c'est sûr que ça ne pourra pas marcher... d'ailleurs j'ai un doute, c'est possible que SoapClient protège les données tout seul comme un grand.

    D'ailleurs pour info dans le lien sur stack overflow, la personne qui réponds ne parle pas d'envoyer un SimpleXmlElement, mais la chaîne xml associée (retour de la méthode asXML()).

    Si dans ton cas tu envoies directement le SimpleXmlElement, cette classe n'étant probablement pas définie dans le WSDL de ton WebService, pas étonnant que ça pose soucis.

    Après j'ai très peu d'expérience en WS SOAP, aussi je peux rater une information évidente.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Par défaut
    Oui, c'est pour ça que je parle de tableau de stdClass, chaque entrée contenant un stdClass qui décrit un InterestedCar.
    ok, j'avais pas compris.
    Mais un array de stdClass est visiblement transformé en balise aussi, et donc j'ai doit à mes balise "0", "1", "2" ce qui est refusé par le soap, car pas valide selon le WSDL. (Je spécule, mais le résultat de mes test est que la balise est envoyée vide)

    Oui, il me semblait aussi que c'était seulement le string qu'il envoie et pas l'objet ...
    je commence à douter de la possibilité de ce que je veux faire, sans bonne fois de l'autre coté. Il va falloir leur demander un développement à eux :s



    Merci pour tes réponses et ta patience

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    You're welcome, à tout hasard tu as testé différentes options de configuration comme celles présentées ici : http://php.net/manual/fr/soapclient.soapclient.php

    Du genre SOAP_USE_XSI_ARRAY_TYPE ou SOAP_SINGLE_ELEMENT_ARRAYS... car je me demande si le comportement de mapping des tableaux n'est pas configurable.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Par défaut
    oui, d'ailleurs il est même encore en commentaire dans mon code le SOAP_SINGLE_ELEMENT_ARRAYS .

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Par défaut
    J'ai enfin résolu mon problème.
    (c'était comme prévisible, une broutille .... )

    Dans InteresedCars il me fallait passer un array SANS CLEF, SOAP allait donc ainsi lui même comprendre que de cet array découle les InteresedCar (sans doute car c'est la seule balise XML qui se répète) ...
    Bref, je ne pensais pas le pouvoir de compréhension de SOAP aussi grand, je l'ai sous-estimé.


    Je passe donc en résolu

    Merci encore du temps passé à chercher avec moi.

  9. #9
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Merci d'avoir mis à jour le topic, toujours sympa d'avoir connaissance du dénouement

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

Discussions similaires

  1. xml request ff pas ie
    Par Alex35 dans le forum ASP
    Réponses: 4
    Dernier message: 15/05/2007, 15h21
  2. [AJAX] reponse xml http request
    Par Alex35 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 24/04/2007, 11h16
  3. [AJAX] [XmlHttpRequest] [XML] [Request]
    Par sbernard dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/11/2006, 17h08
  4. XML Http Request
    Par ouam81 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/06/2006, 19h25

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