Précédent   Forum du club des développeurs et IT Pro > PHP > Bibliothèques et frameworks > Services Web
Services Web Forum d'entraide pour les services Web en PHP, qui permettent de créer et de consommer facilement des webservices (génération de WSDL etc.). Exemples : SOAP, NuSOAP, REST, SCA-SDO... Avant de poster -> Cours webservices
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/12/2012, 18h03   #1
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
Par défaut 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 :
$soapClient = new SoapClient("http://gepir.gs1.org/v31/router.asmx?wsdl");
(whouaaou 1 ligne )

merci d'avance pour votre aide
Phil
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 13h29   #2
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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 :
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
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 14h11   #3
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
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
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 15h26   #4
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
Donc ! c'est déjà mieux !

en cherchant les fonctions j'obtiens ça

Citation:
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 :
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
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 15h38   #5
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
Ah !!!

j'ai mis ça

Code :
$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 ?
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h15   #6
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
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 ?
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h58   #7
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
Bon quand j'appelle la fonction GepirVersion2 j'obtiens une réponse :

Code :
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 ?

Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 17h17   #8
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 19h57   #9
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
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,...

Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 22h11   #10
Climoo
Membre éclairé
 
Homme Clément
Développeur informatique
Inscription : décembre 2006
Messages : 234
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2006
Messages : 234
Points : 318
Points : 318
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...
Climoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 11h52   #11
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
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 ?
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 11h56   #12
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
Aaah la bonne vieille absence de validation
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 12h52   #13
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
Quoi de leur côté ? le wsdl n'est pas valide ?
c'est donc côté serveur non ?
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 13h17   #14
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
Comme j'ai dit plus haut, valide le WSDL avec des outils comme SOAPUI
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 13h31   #15
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
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 ?
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 13h35   #16
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
Bon,...

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

Citation:
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 :
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,..
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 13h35   #17
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 13h45   #18
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
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 ?

Citation:
<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>
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 13h50   #19
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
il envoie ça en entête
il faut je j'ajoute quelquechose dans mon code ?

Citation:
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)
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 14h05   #20
Philos15
Invité de passage
 
Inscription : octobre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 28
Points : 2
Points : 2
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 :
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>
Philos15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h32.


 
 
 
 
Partenaires

Hébergement Web