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 14/03/2011, 13h22   #1
Membre du Club
 
Inscription : juin 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 56
Points : 43
Points : 43
Par défaut Fatal error sur un client SOAP

Bonjour,

Je dois utiliser un webservice dont on m'a fourni l'url WSDL.

Ce web service doit prendre en entrée un chaîne de caractères et me renvoyer également une chaîne de caractères en sortie.

J'ai réussi bien à lister les fonctions et les types du webservice mais des que j'utilise la fonction __soapCall pour appeler une méthode j'ai une fatal error.

voici le code que j'utilise :

Le Client PHP :
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
<?php
// Pour supprimer le cache du web-service
ini_set('soap.wsdl_cache_enabled', 0);
 
//Exemple d'input 
$inputxml='<?xml version="1.0" encoding="UTF-8"?><inputs><input><hasid>33040</hasid></input></inputs>';
 
// Nouvelle instance de la classe soapClient
$client = new SoapClient('http://********/services/dispatch?wsdl' );
 
 
$functions = $client->__getFunctions();  
echo "FONCTIONS<pre>";
print_r($functions);  
echo "</pre>";
$types = $client->__getTypes();  
echo "TYPE<pre>";
print_r($types);  
echo "</pre>";
 
// Appel de la méthode 
$outputxml =  $client -> __soapCall('ws1', array('arg0' => $inputxml));
 
echo $outputxml;
 
?>
La sortie de ce code :
FONCTIONS
Citation:
Array
(
[0] => confirmResponse confirm(confirm $confirm)
[1] => loginResponse login(login $login)
[2] => logoutResponse logout(logout $logout)
[3] => ws1Response ws1(ws1 $ws1)
[4] => ws2Response ws2(ws2 $ws2)
[5] => ws3Response ws3(ws3 $ws3)
[6] => ws4Response ws4(ws4 $ws4)
)

TYPE
Array
(
[0] => struct login {
string arg0;
string arg1;
}
[1] => struct loginResponse {
boolean return;
}
[2] => struct logout {
}
[3] => struct logoutResponse {
boolean return;
}
[4] => struct ws1 {
string arg0;
}
[5] => struct ws1Response {
string return;
}
[6] => struct Exception {
string message;
}
[7] => struct ws2 {
string arg0;
}
[8] => struct ws2Response {
base64Binary return;
}
[9] => struct ws3 {
string arg0;
}
[10] => struct ws3Response {
string return;
}
[11] => struct ws4 {
string arg0;
}
[12] => struct ws4Response {
string return;
}
[13] => struct confirm {
string arg0;
}
[14] => struct confirmResponse {
}
)
Citation:
Fatal error: Uncaught SoapFault exception: [env:Server] java.lang.NullPointerException in C:**********\webservices\clientWS1.php:22 Stack trace: #0 C:*************\webservices\clientWS1.php(22): SoapClient->__soapCall('ws1', Array) #1 {main} thrown in C:********\webservices\clientWS1.php on line 22

Avez -vous une idée car la je bloque une peu ? Est-ce mes appels qui sont incorrects ou cela vient il du serveur ?


Merci
jerome600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 13h26   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
le problème st plus coté serveur, ou alors l'un de tes paramètre est faux

sinon pour appelle une méthode c'est juste
Code :
$outputxml =  $client->ws1($inputxml);
c'est un peu fait exprès pour ca le SOAP
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 13h45   #3
Membre du Club
 
Inscription : juin 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 56
Points : 43
Points : 43
Merci de ta réponse stealth35 je viens d'essayer avec ton code (c'est vrai que c'est plus simple)
Code :
$outputxml =  $client->ws1($inputxml);
L'erreur en retour change de forme mais elle est toujours la

Citation:
Fatal error: Uncaught SoapFault exception: [env:Server] java.lang.NullPointerException in C:*********\webservices\clientWS1.php:24 Stack trace: #0 [internal function]: SoapClient->__call('ws1', Array) #1 C:*******\webservices\clientWS1.php(24): SoapClient->ws1('<?xml version="...') #2 {main} thrown in C:********\webservices\clientWS1.php on line 24
jerome600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 13h54   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
oui ca reviens au même, vérifie coté serveur
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h00   #5
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Et en faisant ceci :

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
// Pour supprimer le cache du web-service
ini_set('soap.wsdl_cache_enabled', 0);
 
//Exemple d'input 
$inputxml='<?xml version="1.0" encoding="UTF-8"?><inputs><input><hasid>33040</hasid></input></inputs>';
 
// Nouvelle instance de la classe soapClient
$client = new SoapClient('http://********/services/dispatch?wsdl' );
 
 
$functions = $client->__getFunctions();  
echo "FONCTIONS<pre>";
print_r($functions);  
echo "</pre>";
$types = $client->__getTypes();  
echo "TYPE<pre>";
print_r($types);  
echo "</pre>";
 
 
$input = new stdClass();
$input->arg0 = $inputxml;
 
// Appel de la méthode 
$outputxml =  $client->ws1(array('ws1' => $input)));
 
echo $outputxml;
 
?>
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h07   #6
Membre du Club
 
Inscription : juin 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 56
Points : 43
Points : 43
J'ai essayé en ajoutant array , c'est bien ca ? l'erreur est la meme

Code :
1
2
 
$outputxml =  $client ->ws1(array('ws1' => $input));
jerome600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h15   #7
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Un array comme tu as fait ou un objet standard comme j'ai proposé. Les 2 sont autorisés.

Qu'as-tu mis dans $input ?
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h22   #8
Membre du Club
 
Inscription : juin 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 56
Points : 43
Points : 43
Merci pour tes réponses pc.bertineau

voici le code complet avec tes propositions (j'ai enlevé l'affichages fonctions et type):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
// Pour supprimer le cache du web-service
ini_set('soap.wsdl_cache_enabled', 0);
 
//Exemple d'input 
$inputxml='<?xml version="1.0" encoding="UTF-8"?><inputs><input><hasid>33040</hasid></input></inputs>';
 
// Nouvelle instance de la classe soapClient
$client = new SoapClient('http://******/services/dispatch?wsdl' );
 
$input = new stdClass();
$input->arg0 = $inputxml;
 
// Appel de la méthode 
$outputxml =  $client ->ws1(array('ws1' => $input));
 
echo $outputxml;
la sortie est :

Citation:
Fatal error: Uncaught SoapFault exception: [env:Server] java.lang.NullPointerException in C:********\webservices\clientWS1.php:15 Stack trace: #0 [internal function]: SoapClient->__call('ws1', Array) #1 C:********\webservices\clientWS1.php(15): SoapClient->ws1(Array) #2 {main} thrown in C:*********\webservices\clientWS1.php on line 15
jerome600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 17h14   #9
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Oui c'est ça, j'avais laissé une grosse erreur...

Donc le pb vient d'autre part, sûrement côté serveur comme disait stealth35.
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 11h01   #10
Membre du Club
 
Inscription : juin 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 56
Points : 43
Points : 43
OK j'ai trouvé ,
en fait c'est webservice qui attend comme argument un tableau de tableau, pourquoi ? je sais pas....

Mais pour que ca marche il faut utiliser la syntaxe suivante :

$inputxml=array ('arg0' =>'<?xml version="1.0" encoding="UTF-8"?><inputs><input><hasid>33040</hasid></input></inputs>');

$outputxml = $client -> __soapCall('ws1', array( $inputxml));

En tout cas merci de votre aide.
jerome600 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 20h02.


 
 
 
 
Partenaires

Hébergement Web