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] SOAP et PHP


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut [Web Service] SOAP et PHP
    Hello

    snif... oui je sais programmer en php mais là j'arrive pas à comprendre comment marche SOAP

    j'ai besoin d'utiliser ce service
    http://gepir.gs1.org/v31/router.asmx?op=GetItemByGTIN

    mais je comprends pas comment ça marche,... combien de paraètres passer etc,...

    la seule chose que je sais, cest que je veux passer le code 3274080005003 et obtenir le résultat en français

    j'ai déjà fait ça en PHP mais impossible d'aller plus loin sans que ça plante grrr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $soapClient = new SoapClient("http://gepir.gs1.org/v31/router.asmx?wsdl");
    (whouaaou 1 ligne )

    merci d'avance pour votre aide
    Phil

  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
    Attrape les SOAP Fault avec un try catch. Active les traces sur ton client SOAP et tu y verra plus clair dans les échanges et les raisons possibles d'échec. Et puis pense à activer le reporting d'erreur !

    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
    <?php
    ini_set('display_errors', 1);
    ini_set('error_reporting', -1);
     
    $client = new SoapClient('service.wsdl', array('trace' => 1));
     
    try {
        $client->foo('bar');
    }
    catch (SoapFault $fault) {
        var_dump(
            $client->__getLastRequest(),
            $client-> __getLastResponse()
        );
        trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_WARNING);
    }
    Regarde la doc la prochaine fois: http://php.net/manual/en/soapclient.soapclient.php

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Merci pour la réponse et désolé pour le message précédant,...

    j'ai vraiment du mal à comprendre la logique SOAP, j'trouve qu'il y a peu de documentation comparé à ce qu'on peut trouver pour le PHP par exemple

    J'vais essayer ton code et essayer de comprendre

    Encore merci

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Donc ! c'est déjà mieux !

    en cherchant les fonctions j'obtiens ça

    GepirVersion2Response GepirVersion2(GepirVersion2Request $parameters)
    gepirParty GetPartyByGLN(GetPartyByGLN $partyGln)
    gepirParty GetOwnerOfGLN(GetOwnerOfGLN $ownerGln)
    gepirParty GetPartyByGTIN(GetPartyByGTIN $partyGtin)
    gepirParty GetPartyBySSCC(GetPartyBySSCC $partySscc)
    gepirParty GetPartyByName(GetPartyByName $requestData)
    gepirItem GetItemByGTIN(GetItemByGTIN $requestItem)
    gepirStatistics GetStatistics(GetStatistics $requestStat)
    gepirAuthorization GetAuthorization(GetAuthorization $requestAuthorization)
    SessionAuthorizeResponse SessionAuthorize(SessionAuthorize $parameters)
    GepirVersion2Response GepirVersion2(GepirVersion2Request $parameters)
    gepirParty GetPartyByGLN(GetPartyByGLN $partyGln)
    gepirParty GetOwnerOfGLN(GetOwnerOfGLN $ownerGln)
    gepirParty GetPartyByGTIN(GetPartyByGTIN $partyGtin)
    gepirParty GetPartyBySSCC(GetPartyBySSCC $partySscc)
    gepirParty GetPartyByName(GetPartyByName $requestData)
    gepirItem GetItemByGTIN(GetItemByGTIN $requestItem)
    gepirStatistics GetStatistics(GetStatistics $requestStat)
    gepirAuthorization GetAuthorization(GetAuthorization $requestAuthorization)
    SessionAuthorizeResponse SessionAuthorize(SessionAuthorize $parameters)
    j'utilise le code 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
    ini_set('display_errors', 1);
    ini_set('error_reporting', -1);
     
    $client = new SoapClient('http://gepir.gs1.org/v31/router.asmx?wsdl', array('trace' => 1));
     
    try {
        $client->__soapCall("GetPartyByGTIN",array('GetPartyByGTIN' => "3011360004420"));
    }
    catch (SoapFault $fault) {
        var_dump(
            $client->__getLastRequest(),
            $client-> __getLastResponse()
        );
        trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_WARNING);
    }
    mais il me retourne du XML soap (avant il mettait invalid method) et là il dit:
    Warning: SOAP Fault: (faultcode: soap:Server, faultstring: Server was unable to process request. ---> Object reference not set to an instance of an object.)

    j'me suis jamais senti aussi nul grrrr

    merci d'avance pour vos réponses

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Ah !!!

    j'ai mis ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $client->__soapCall("GetPartyByGTIN","3011360004420","FR");
    et il me dit maintenant : SoapClient::__soapCall() expects parameter 2 to be array

    je régresse -> ça confirme que le code avant était correcte avec un array

    Mais je comprends pas pourquoi il refuse les arguments que je lui passe dans le tableau ,...

    c'est possible qu'ils aient un prob sur leur serveur ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Bon là je comprends pas !
    j'ai fait exactement ce qu'ils disent sur les forums

    $client->__soapCall("GetPartyByGTIN",array("partyGtin" => "3011360004420"));

    et j'obtiens
    Object reference not set to an instance of an object.

    comment savoir si le prob vient de mon côté ou du serveur ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Bon quand j'appelle la fonction GepirVersion2 j'obtiens une réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    stdClass Object
    (
        [GepirVersion2Result] => stdClass Object
            (
                [any] => <GEPIR01 xmlns="" Version="1.0"><HEAD><T0095>7600001001001</T0095><T0093>0</T0093><T0232>1</T0232></HEAD></GEPIR01>
            )
     
    )
    mais les autres marchent pas,... vous pensez que c'est le service du serveur qui marche pas ou est-ce que j'ai fait une erreur ?


  8. #8
    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 toujours compliqué de savoir lequel du client ou du serveur fais n'importe quoi. Mon conseil: télécharge le wsdl du serveur et fais quelques tests avec SoapUI par exemple ou carrément en implémentant un serveur à toi en PHP qui réponds des trucs aléatoires et/ou déterministes. ça te permettra de savoir qui du serveur ou du client ne respecte pas la définition du webservice.

    Concernant Soap::__soapCall, c'est un alias de Soap::__call en fait (ou alors c'est l'inverse, d'ailleurs on s'en fout).
    Le principe est le suivant:
    • soit tu utilise __call avec $client->methode($parm1,$parm2,$parm3)
    • soit tu utilise __soapCall avec $client->__soapCall('method', array($parm1,$parm2,$parm3))

    c'est tout bête

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    merci mais sans te demander de faire le truc à ma place,
    tu en penses quoi de ce web service ? j'ai l'impression qu'il disent qu'iol ne peut être exécute que sur une machine locale, pas sur leur serveur,...


  10. #10
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Le message "Object reference not set to an instance of an object" fait fortement au NullReferenceException du .NET. Donc à priori, cette exception venait surement du web service. Le serveur a eu une exception, et t'a juste renvoyé le message d'erreur qu'il a eu (pas très bavard, mais c'est normal).
    Après, s'il s'est mal comporté, c'est peut être aussi que tu lui as donné des paramètres bizarres en entrée, et que lui ne prenait pas la peine de les vérifier...

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    merci pour la réponse, mais si j'ai regardé les données attendues en entrée et il n'y en as qu'une pour cette fonction,...

    j'ai passé plus de 3 jours à chercher !! et j'arrive pas à trouver, c'est pour ça que je vous demande votre aide,...

    pourriez-vous regarder http://gepir.gs1.org/v31/router.asmx et me dire ce que vous en pensez ? SVP ?

  12. #12
    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
    Aaah la bonne vieille absence de validation

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Quoi de leur côté ? le wsdl n'est pas valide ?
    c'est donc côté serveur non ?

  14. #14
    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
    Comme j'ai dit plus haut, valide le WSDL avec des outils comme SOAPUI

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Merci mais ça m'apporte quoi ? je vais faire la validation comme tu dis mais si c'est pas valide, c'est inutilisable ?

    et puis je suis un client -> que faire si il a un prob sur leur serveur ?

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Bon,...

    j'ai essayé de faire comme dans les exemples qu'ils donnent :

    POST /V31/router.asmx HTTP/1.1
    Host: gepir.gs1.org
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length

    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlnssi="http://www.w3.org/2001/XMLSchema-instance" xmlnssd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Header>
    <gepirRequestHeader xmlns="http://www.gepir.org/">
    <requesterGln>string</requesterGln>
    <cascade>int</cascade>
    </gepirRequestHeader>
    </soap12:Header>
    <soap12:Body>
    <GetPartyByGTIN version="decimal" xmlns="http://www.gepir.org/">
    <requestedGtin>string</requestedGtin>
    <requestedGtin>string</requestedGtin>
    <requestedLanguages>
    <language>language</language>
    <language>language</language>
    </requestedLanguages>
    </GetPartyByGTIN>
    </soap12:Body>
    </soap12:Envelope>
    avec ce 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $client = new SoapClient('http://gepir.gs1.org/v31/router.asmx?wsdl', array('trace' => 1));
     
    try {
     
    	$header = new SoapHeader(
    		'http://gepir.gs1.org/v31/',
    		'gepirRequestHeader',
    		array(
    			'requesterGln' => "3011360004420",
    			'cascade' => 1
    		)
    	);
     
    	$client->__setSoapHeaders($header);
     
    	$response = $client->GetPartyByGTIN(
    		1.0,	
    		array(
    			'requestedGtin' => "3011360004420",
    			'requestedLanguages' => array(
    				'language' => "FR"
    			)
    		)
    	);
     
    	print_r($response); 
    }
    ça marche toujours pas, mais j'envoie bien ce qu'ils demandent,...
    je ne sais pas si il faut préciser la version de SOAP (ils disent qu'il y a une les version 1.1 et 1.2)

    et puis il y a la version (1.0), c'est l'attribut d'une balise et je sais pas comment le faire passer,...

    sinon toujours la même erreur : j'en peux plus,... bon allons voir la validation,..

  17. #17
    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
    T'auras pas vraiment le choix, s'ils veulent pas patcher (tu dois pour ça leur coller un ticket s'ils ont un outil de ticketing), tu devra t'adapter.

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    Ouaaaaa !!!!!!!!!!!!!!!!!

    ça marche avec le logiciel !!!

    j'ai mis ça et ça m'envoie la réponse !!!
    maintenant il faut que je comprenne ce qui se passe avec php et comment envoyer ce message

    il affiche "Request 1" dans l'arbre, il faut que je l'appelle ?

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gep="http://www.gepir.org/">
    <soapenv:Header>
    <gep:gepirRequestHeader>
    <!--Optional:-->
    <gep:requesterGln>3011360004420</gep:requesterGln>
    <!--Optional:-->
    <gep:cascade>1</gep:cascade>
    </gep:gepirRequestHeader>
    </soapenv:Header>
    <soapenv:Body>
    <gep:GetPartyByGTIN version="1.0">
    <!--Zero or more repetitions:-->
    <gep:requestedGtin>3011360004420</gep:requestedGtin>
    <!--Optional:-->
    <gep:requestedLanguages>
    <!--Zero or more repetitions:-->
    <gep:language>0</gep:language>
    </gep:requestedLanguages>
    </gep:GetPartyByGTIN>
    </soapenv:Body>
    </soapenv:Envelope>

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    il envoie ça en entête
    il faut je j'ajoute quelquechose dans mon code ?

    POST http://gepir.gs1.org/v31/router.asmx HTTP/1.1
    Accept-Encoding: gzip,deflate
    Content-Type: text/xml;charset=UTF-8
    SOAPAction: "http://www.gepir.org/GetPartyByGTIN"
    Content-Length: 777
    Host: gepir.gs1.org
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 7
    Points
    7
    Par défaut
    ok je crois que je comprends : php envoie ce code, c'est pas du tout la même chose grrrr

    pourquoi ajoute-il des "key" "value" "ns2" ?
    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
     
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.gepir.org/" xmlns:ns2="http://gepir.gs1.org/v31/">
    <SOAP-ENV:Header>
    <ns2:gepirRequestHeader>
    <item>
    <key>requesterGln</key>
    <value>3011360004420</value>
    </item>
    <item>
    <key>cascade</key>
    <value>1</value>
    </item></ns2:gepirRequestHeader>
    </SOAP-ENV:Header>
     
    <SOAP-ENV:Body>
    <ns1:GetPartyByGTIN/>
    <param1>
    	<item>
    		<key>requestedGtin</key>
    		<value>3011360004420</value>
    	</item><item>
    		<key>requestedLanguages</key>
    		<value>
    			<item>
    				<key>language</key>
    				<value>FR</value>
    			</item>
    		</value>
    	</item>
    </param1>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Web Service][SOAP] Débutant PHP/NuSOAP
    Par tintin72 dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 20/02/2014, 21h17
  2. [Web Service][SOAP] client php et web service windev
    Par pev15 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 28/05/2010, 13h48
  3. [Web Service] SOAP serveur PHP client J2EE
    Par mejdi331 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 12/02/2009, 03h08
  4. [Web Service] SOAP en php-cli sous win
    Par vallica dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 12/09/2008, 10h03
  5. [Web Service][SOAP] Tableau php et type complexe ?
    Par tintin72 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 18/06/2007, 11h31

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