Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/04/2008, 16h52   #1
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 597
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 597
Points : 123
Points : 123
Par défaut [SOAP] Pb connexion webservice avec __soapCall

Bonjour,

Je galère pour me connecter à un webservice.
L'entreprise m'a donné un exemple de fichier xml d'entrée
afin de tester si tout fonctionne.
Je me connecte de cette façon:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
try{
$client = new SoapClient($address ,array('trace'=> 1,'soap_version'=> 'SOAP_1_1'));
 
$xml_return = $client->__soapCall('nom_methode', array($xml_string, "login","mdp"));
}
catch(SoapFault $fault)
{
echo $fault;
  echo "Reponse: ".htmlspecialchars($client->__getLastResponse());
}
mais j'ai toujours la même erreur:
Citation:
Not enough message parts were received for the operation
D'habitude ça fonctionne mais là rien à faire.
J'ai appelé la personne qui s'occupe du webservice mais
apparemment elle voit pas d'où ça pourrait venir.

Quelqu'un aurait une idée ?

Merci
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 10h37   #2
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Bonjour.

Je pense que c'est la syntaxe pour l'appel avec __soapcall().
Perso je fais toujours comme ceci :

Code php :
1
2
3
4
 
$params = array ('login' => $login,
			'password' => $password);
$result = $client -> __soapCall('LaMethode', array ($params));
Le 'login' et 'password' dans mon array $params, correspond aux noms des paramètres qu'il faut passer dans la méthode 'LaMethode'.

Enfin en tout cas je pense que ca vient de là. Ton message d'erreur indique qu'il reçoit mal les données que tu envoies.
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 14h55   #3
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 597
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 597
Points : 123
Points : 123
Merci beaucoup pour ton aide. En effet ça se précise.

Maintenant j'ai le message d'erreur:
Citation:
Erreur d'identification : Veuillez renseigner un login
Normalement le login est bon. Aussi, avant de rappeler le technicien
je voudrais savoir comment tu fais tu pour passer le xml d'entrée.

Comme ceci ?
Code :
1
2
3
 
$params = array ('xml' => $xml_string, 'login' => $login, 'password' => $password);
$result = $client -> __soapCall('LaMethode', array ($params));
Ou comme cela ?
Code :
1
2
3
 
$params = array ('login' => $login, 'password' => $password);
$result = $client -> __soapCall('LaMethode', array ($xml_string, $params));
Ou y a t-il une autre manière ?

Et est ce que le fait de passer un tableau associatif en argument ne perturbe
pas le webservice (écrit en java) ?

Merci d'avance.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 16h33   #4
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Qu'appelles-tu le xml d'entrée ? Le fichier WSDL ? Peux-tu le poster ?
Qu'as-tu dans ta variable $adress ?

D'ou viens l'affichage de ton erreur ? Du serveur ou du client ? Les affichages d'erreur sont normalement en anglais...

Le login sert-il à t'authentifier pour effectuer ta requête SOAP ? Ou c'est simplement un string qu'il faut passe en paramètre dans une méthode ?

Sinon pour le tableau associatif ça peut te changer comment les données sont encapsulés dans la requête SOAP, et donc comment ton serveur en JAVA les réceptionne. Ça dépend en fait comment le WSDL à été fait... Mais normalement ca ne change rien.


Voili voilou, j'espère que tu m'as compris ^^
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 17h22   #5
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 597
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 597
Points : 123
Points : 123
Citation:
Qu'appelles-tu le xml d'entrée ? Le fichier WSDL ? Peux-tu le poster ?
La société m'a donnée un exemple de xml d'entrée (une enveloppe soap) pour
tester la connexion et s'assurer que je récupère bien un xml de retour.
Le xml est du style:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<ns1:nom_methode xmlns:ns1="http://services.site.products.generali.fr">
 
 ...
 
</ns1:nom_methode>
</soap:Body>
</soap:Envelope>
avec à l'interieur tout un tas de balises avec des arguments etc...
Je passe ce xml à la méthode et normalement elle me retourne la
réponse sous forme de fichier xml. Il ne me reste plus qu'à "parser" les
données qui m'interesse.
Citation:
Qu'as-tu dans ta variable $adress ?
C'est l'adresse du fichier wsdl de la méthode à appeler, du genre:

http://webservices.blabla.org/index....m_methode/wsdl
Citation:
D'ou viens l'affichage de ton erreur ? Du serveur ou du client ?
ça vient probablement du client puisque c'est en français.
Citation:
Le login sert-il à t'authentifier pour effectuer ta requête SOAP ? Ou c'est simplement un string qu'il faut passe en paramètre dans une méthode ?
Je pense qu'il sert à m'authentifier puisque c'est la société qui m'a
fournit le login et le mdp. Toutefois ils devraient être bon puisque
le technicien à testé chez lui et ça marche.

Une idée ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 18h57   #6
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Du coup t'as pas besoin de passer ton xmlstring en paramètre. C'est juste un exemple qu'ils t'ont donné, une requete SOAP type qui doit arriver sur le serveur. Donc essaie de passer juste le login et le mot de passe.

Sinon ce que tu peux faire c'est faire afficher la requete qui part et la requete qui revient :
Code :
1
2
3
4
print "<pre>\n";
print "Request: \n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response: \n".htmlspecialchars($client->__getLastResponse())."\n";
print "</pre>";
Tu as déjà mis trace à 1 dans les options, donc ca s'affichera bien.
Et ta 'Request' devrait correspondre à ton xml d'exemple.

Sinon si c'est un problème d'authentification, je ne l'ai jamais utilisé, donc je ne peux pas trop t'aider. Il y a ce post déjà :
http://www.developpez.net/forums/sho...d.php?t=523784

Je pense aussi que tu n'a pas trop bien compris le role du WSDL. C'est lui que tu dois suivre, c'est lui qui t'indique quelles données envoyer et sous quel format pour telle ou telle méthode.

Je te donne un de mes bouts de code pour exemple :

Dans le WSDL :
Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<xsd:element name="SetCustomer">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="customer_id" type="xsd:long" minOccurs="1" maxOccurs="1" />
      <xsd:element name="last_name" type="xsd:string" minOccurs="1" maxOccurs="1" />
      <xsd:element name="first_name" type="xsd:string" minOccurs="1" maxOccurs="1" />
      <xsd:element name="code" type="xsd:int" minOccurs="1" maxOccurs="1" />
      <xsd:element name="age" type="xsd:short"	 minOccurs="1" maxOccurs="1" />
      <xsd:element name="nosex" type="xsd:boolean" minOccurs="1" maxOccurs="1" />
      <xsd:element name="delete" type="xsd:boolean"	minOccurs="0" maxOccurs="1" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Code client :
Code PHP :
1
2
3
4
5
6
7
8
9
10
$params = array (	
'customer_id' => $customer_id,
'last_name'	=> $last_name,
'first_name'	=> $first_name,				
'code' => $code,
'age' => $age,
'nosex' => $nosex,
'delete' => false);
 
$result = $client -> __soapCall('SetCustomer', array ($params));


Voila en espèrant que ca t'aide !
Bon courage
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 14h04   #7
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 597
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 597
Points : 123
Points : 123
Je te remercie beaucoup pour ton aide et pour ton exemple.

En effet je ne connaissais pas cette façon de passer les paramètres
au webservice (dans un tableau associatif).

Comme je l'ai dis plus haut, je construit d'abord un flux xml d'entrée
(conforme à ce qu'attend le webservice) du genre:
Code :
1
2
3
4
5
6
7
8
 
$xml_str = '<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dossierSante SYSTEM "http://webservices.xxxxx.org/dtd/dossierSanteV3.dtd">
<uneBalise login="'.$login.'" pass="'.$pass.'">
 
 ...etc
 
</uneBalise >';
une fois terminé, je balance le flux dans soapCall avec l'adresse du
wsdl qui va bien:
Code :
1
2
3
4
 
$client = new SoapClient($address,
			      array('trace'=> 1,'soap_version'=> 'SOAP_1_1'));
$xml_return = $client->__soapCall('nom_methode', array($xml_str));
puis je récupère le flux de retour envoyé par le webservice.
Je fais ça avec plusieurs webservices et ça fonctionne bien.

J'ai donc essayé ta méthode avec le webservice qui me pose
pb, mais je voudrais savoir une choses:

Le nom des attributs dans le tableau associatif doivent
t-ils être les mêmes que ceux du wsdl ?
Par ex dans mon wsdl j'ai:
Code :
1
2
3
4
5
 
<garanties>
<ns1:int>1</ns1:int>
<ns1:int>2</ns1:int>
</garanties>
moi dans le tableau j'ai mis:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$params = array{
value_1 => $val1,
 
 ...
 
garanties_1 => 1, 
garanties_2 => 2, 
 
 ...
 
value_25 => $val25};
est ce que c'est correcte ?

J'ai donc passé le tableau $params en argument à la méthode,
et maintenant j'ai l'erreur (qui vient probablement du webservice) :
Citation:
Il n'y a plus de données à lire dans le socket
Est-ce les paramètres qui sont mal passés ?


Encore merci d'avance.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 17h24   #8
Invité de passage
 
Inscription : avril 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 9
Points : 2
Points : 2
Bonjour à vous !

J'ai un problème "presque" identique (d'ailleurs j'ai ouvert un topic today, help )

Donc bien sur je ne serai pas vraiment utile.

Cependant, j'ai une question qui pourrait amener à d'autres réflexions :

j'ai remarqué des fonctions telles que :

SoapParam()
http://fr2.php.net/manual/fr/functio...-construct.php

et

SoapVar()
http://fr2.php.net/manual/fr/functio...-construct.php

Peut être peuvent-elles être utiles ?

Désolé si je fait fausse route...

Bon courage Tintin, je compatis
loicmaxinfo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/05/2008, 14h29   #9
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 597
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 597
Points : 123
Points : 123
Bon, avant de jeter l'éponge avec ce de webservice
je vais essayer de résumer clairement la situation.

J'ai un exemple d'enveloppe SOAP (qui normalement fonctionne) a passer au webservice en question :
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
33
34
35
36
37
38
39
40
41
42
43
44
 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soap:Body>
		<tarifer xmlns="http://services.xxxxxx.fr">
			<in0 xmlns="http://services.xxxxxx.fr">
				<arrPret xmlns="http://site.xxxxxx.fr">
					<SCPret>
						<capital>150000</capital>
						<differe>0</differe>
						<duree>24</duree>
						<periodiciteRemboursement>1</periodiciteRemboursement>
						<quotiteAssure1>100</quotiteAssure1>
						<quotiteAssure2>0</quotiteAssure2>
						<tauxInteret>4.0</tauxInteret>
						<typeDePret>TF</typeDePret>
					</SCPret>
				</arrPret>
				<assure1 xmlns="http://site.xxxxxx..fr">
					<classePro>1</classePro>
					<dateNaissance>1979-05-13T00:00:00+02:00</dateNaissance>
					<franchise>180</franchise>
					<fumeur>true</fumeur>
					<garanties>
						<ns1:int xmlns:ns1="http://services.xxxxxx.fr">1</ns1:int>
						<ns1:int xmlns:ns1="http://services.xxxxxx.fr">2</ns1:int>
						<ns1:int xmlns:ns1="http://services.xxxxxx.fr">3</ns1:int>
						<ns1:int xmlns:ns1="http://services.xxxxxx.fr">4</ns1:int>
						<ns1:int xmlns:ns1="http://services.xxxxxx.fr">5</ns1:int>
					</garanties>
					<masculin>false</masculin>
					<nom xsi:nil="true" />
					<prenom xsi:nil="true" />
					<qualite xsi:nil="true" />
				</assure1>
				<assure2 xmlns="http://site.xxxxxx.fr" xsi:nil="true" />
				<dateEffet xmlns="http://site.xxxxxx.fr">2007-02-13T11:13:08.888+01:00</dateEffet>
				<nbAssures xmlns="http://site.xxxxxx.fr">1</nbAssures>
				<periodiciteCotisation xmlns="http://site.xxxxxx.fr">S</periodiciteCotisation>
			</in0>
			<in1 xmlns="http://services.xxxxxx.fr">login</in1>
			<in2 xmlns="http://services.xxxxxx.fr">pass</in2>
		</tarifer>
	</soap:Body>
</soap:Envelope>
ainsi qu'un login et un mot de passe valides.

Je construit donc la liste des paramètres via un tableau:
Code :
1
2
3
4
5
6
7
8
9
10
 
$params = array(
'capital' => 300000, 
'differe' => 0, 
'duree' => 24, 
 
  .. etc
 
'login' => "login", 
'password' => "mdp");
Je créé ensuite un objet client (en passant l'adresse du wsdl):
Code :
1
2
3
4
 
$address = "http://www.webservices/Service?wsdl";
 
$client = new SoapClient($address ,array('trace'=> 1,'soap_version' =>  'SOAP_1_1));
puis j'appel la méthode:
Code :
1
2
 
$client->__soapCall('tarifer', array($params));
et là irrémédiablement ça foire.
A chaque fois le serveur me demande de renseigner un login.

Voici ma requête :
Code :
1
2
3
4
5
6
7
 
Requête: <?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://services.xxxxxx.xxxxxxxx.xxxxxxx.fr">
<SOAP-ENV:Body>
<ns1:nom_methode><ns1:in0 xsi:nil="true"/>
<ns1:in1 xsi:nil="true"/><ns1:in2 xsi:nil="true"/>
</ns1:tarifer></SOAP-ENV:Body></SOAP-ENV:Envelope>
et la réponse :
Code :
1
2
3
4
5
6
7
 
Reponse: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body><soap:Fault><faultcode>soap:Server</faultcode>
<faultstring>Erreur d'identification : Veuillez renseigner un login.</faultstring>
<detail><SCHypothesesInvalidesException xmlns="http://services.xxxxxxxxx.fr" /></detail></soap:Fault>
</soap:Body>
</soap:Envelope>
Ce que je ne comprend pas c'est que la requête est vide.
Celà veut donc dire qu'il y a un pb dans le passage des paramètres,
ou en tout cas qu'ils ne sont pas passés correctement.
J'ai bien sûr essayé toutes les combinaisons possible (passer le login et mdp à la suite
du array, dans un autre array, avec un array à 2 dimension etc.....), nada !

Y a t-il une autre manière de passer des paramètres et si oui laquelle ????

Un grand merci d'avance.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2008, 10h40   #10
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Ah je crois comprendre en fait... Le mieux ca serait quand même de ne pas ce caler sur la requête SOAP d'exemple, mais sur le WSDL.

Faudrait que tu essaies comme ca :
Code :
1
2
$params = array ('in1' => $login, 'in2' => $mdp);
$client->__soapCall('tarifer', array($params));
Pour voir ce que ca donne déjà.


Sinon pour t'expliquer également, d'après la requête SOAP d'exemple (mais ca serait mieux avec le WSDL), tu ne peux pas caler tout les paramètres à la suite comme tu as fait. C'est structuré tout çà faut bien le faire ^^

Par exemple, je ne mets pas tout c'est un peu long :
Code :
1
2
3
4
5
6
$SCPret = array ('capital' => $capital, ... , 'typeDePret' => $type);
$arrPret = array ('SCPret' => $SCPret);
$in0 = array ('arrPret' => $arrPret, 'assure1' => $assure1, ... , 'periodiciteCotisation' => $period);
 
$params = array ('in0' => $in0, 'in1' => $login, 'in2' => $password);
$client->__soapCall('tarifer', array($params));
Et c'est pareil pour assure1, garanties... Toute structure regroupant plusieurs paramètres, doit être encapsulée dans un tableau associatif (enfin c'est une des méthodes). Bon certes c'est un peu lourd, mais normalement ca fonctionnera de cette manière.

En espérant que t'ais compris le principe
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2008, 15h25   #11
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 597
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 597
Points : 123
Points : 123
Un trèèèèèèèès grand merci à toi Guybrush113
ça marche !!!

Effectivement, dans les exemples de connexion à un webservice
que j'ai récupéré sur le net, le wsdl est ultra basique donc
un simple tableau associatif suffit pour passer les paramètres.
J'ai bien tenté quelques trucs avec des tableaux à 2 dimensions
mais bien sûr ce n'était pas suffisant.
Maintenant j'ai bien pigé le principe et je devrait normalement
pas trop mal m'en tirer pour les prochaines connexions.

Encore merci.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2008, 15h53   #12
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Mais de rien, content que ca marche !
Bon courage pour la suite
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2008, 15h41   #13
Invité de passage
 
Inscription : août 2008
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 11
Points : 2
Points : 2
super tintin72,

chez moi la fonction __soapcall génère l'erreur Fatal error: Call to undefined function: __soapcall() in (la page et la ligne de la fonction __soapcall())


D'où vient cette erreur svp ?
Merci
zebra1928 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h00.


 
 
 
 
Partenaires

Hébergement Web