Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
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 02/12/2010, 23h17   #1
Invité de passage
 
Inscription : septembre 2008
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 20
Points : 0
Points : 0
Par défaut migration d'un appel de service web PHP 4 vers appel en PHP 5

Bonjour,

j'ai besoin de migrer mon appel web service php4 sous la version php5, cependant je me heurte à une difficulté, le passage des paramètres.

Afin de vous préciser le contexte, ci-dessous l'appel php4 puis php5. Ce dernier ne fonctionne pas.

appel php4 (fonctionne bien) :
Code :
1
2
3
4
5
6
7
8
include_once("nusoap.php");
$soapclient = new soapclient("http://monurl:7001/dossier",false,false,false,false,false,30,30);
 
$param = array("PARAM1" => "VALEUR1", 
                     "PARAM2"=>"VALEUR2", 
                     "PARAM3"=>"VALEUR3");
$retour = $soapclient->call("METHODE_DISTANTE", $param);
print_r($retour);

appel php5 (ne fonctionne pas) :
Code :
1
2
3
4
5
6
7
8
9
$soapclient = new SoapClient(NULL, array("location" => "http://monurl:7001/dossier", "uri" => "urn:xmethods-delayed-quotes", 'trace'    => 1,));
 
$tab = array ("PARAM1"=> "VALEUR1",
                   "PARAM2"=>"VALEUR2",
                   "PARAM3"=>"VALEUR3");
 
$retour = call_user_func_array(array($soapclient, 'METHODE_DISTANTE'), array($tab));
 
print_r($retour);
L'appel en php5 me lève une exception :

Code :
1
2
3
4
5
6
7
Fatal error: Uncaught SoapFault exception: [soapenv:Server.userException] org.xml.sax.SAXException: Bad types (class java.util.HashMap -> class java.lang.Integer) in chemin/nomDeMonFichier.php:26
Stack trace:
#0 [internal function]: SoapClient->__call('METHODE_DISTANTE', Array)
#1 [internal function]: SoapClient->METHODE_DISTANTE(Array)
#2 chemin/nomDeMonFichier.php(26): call_user_func_array(Array, Array)
#3 {main}
  thrown in chemin/nomDeMonFichier.php on line 26
Un print_r du client soap (ci-dessous) semble cohérent (je pense que le problème se situe au niveau du passage des paramètres).
Code :
1
2
3
4
5
6
7
SoapClient Object
(
    [uri] => urn:xmethods-delayed-quotes
    [location] => http://monurl:7001/dossier
    [trace] => 1
    [_soap_version] => 1
)

Remarque :
- je précise que le web service côté serveur ne propose pas de wsdl, j'ai donc besoin que mon appel en php5 fonctionne en mode non wsdl.
- je me suis basé au départ sur cet exemple : http://devzone.zend.com/node/view/id/689 mais il ne passe qu'un seul paramètre (j'ai testé également d'autres syntaxes mais sans succès, dans la portion de code que je vous présente, une syntaxe que j'ai repris d'un appel php5 en mode wsdl qui fonctionne).

Auriez-vous une idée pour que ma migration vers php5 fonctionne ?
supertotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 10h26   #2
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Pourquoi ne pas simplement appeler la méthode __soapCall() ?

Code :
1
2
3
4
5
6
7
$soapclient = new SoapClient(NULL, array("location" => "http://monurl:7001/dossier", "uri" => "urn:xmethods-delayed-quotes", 'trace'    => 1,));
 
$tab = array ("PARAM1"=> "VALEUR1",
                   "PARAM2"=>"VALEUR2",
                   "PARAM3"=>"VALEUR3");
 
$retour = $soapclient->__soapCall( 'METHODE_DISTANTE', array( $tab ) );
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 11h39   #3
Invité de passage
 
Inscription : septembre 2008
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 20
Points : 0
Points : 0
Bonjour Bisûnûrs,

je viens de tester mais l'erreur persiste :

Code :
1
2
3
4
5
Fatal error: Uncaught SoapFault exception: [soapenv:Server.userException] org.xml.sax.SAXException: Bad types (class java.util.HashMap -> class java.lang.Integer) in chemin/nomDeMonFichier.php:30
Stack trace:
#0 chemin/nomDeMonFichier.php(30): SoapClient->__soapCall('METHODE_DISTANTE', Array)
#1 {main}
  thrown in chemin/nomDeMonFichier.php on line 30
Je commence à me demander si un appel qui fonctionne en php4 doit obligatoirement fonctionner en php5 ?

Si vous avez d'autres propositions je suis preneur.
supertotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 12h15   #4
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Ton serveur Java a l'air d'attendre un entier en paramètre et tu lui fournis un tableau associatif.

En passant les paramètres comme ça :

Code :
$retour = $soapclient->__soapCall( 'METHODE_DISTANTE', $tab );
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 12h17   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
Salut

La doc concernant SoapClient : http://fr2.php.net/manual/fr/soapclient.soapclient.php
Citation:
SoapClient::SoapClient ( mixed $wsdl [, array $options ] )
Ce qui veut dire que le 1er paramètre du constructeur est obligatoire.

Code :
$soapclient = new SoapClient(NULL, array(... etc ...);
Or, de ton coté, tu mets NULL.

Faut peut être lui indiquer le service Web en question (en 1er argument), non ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 12h20   #6
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Citation:
Envoyé par RunCodePhp Voir le message
Faut peut être lui indiquer le service Web en question (en 1er argument), non ?
Non non, c'est juste comme ça, il est en mode non-WSDL.

Et cf la doc dans la liste des paramètres :
Citation:
wsdl :
URI du fichier WSDL ou NULL s'il travaille en mode non-WSDL.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 12h35   #7
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
@Bisûnûrs
A ben oui, tout à fait ... désolé

Citation:
Bad types (class java.util.HashMap -> class java.lang.Integer)
Par rapport à l'erreur, apparemment il y a une données qui ne serait pas du bon type.
Provoqué par quoi, alors là ???
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 13h45   #8
Invité de passage
 
Inscription : septembre 2008
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 20
Points : 0
Points : 0
Merci pour vos contributions :

je confirme que je suis bien en mode non wsdl.

A mon niveau, je n'ai pas vraiment d'autres idées et je pense que je vais être obligé de m'orienter vers la lib nusoap compatible php5 :
http://code.google.com/p/nusoap-for-php5/downloads/list

Je trouve ça tout de même dommage de ne pas utiliser l'extension nusoap de php5.

Si vous avez d'autres propositions, je suis preneur.
supertotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 14h00   #9
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Et :
Citation:
Envoyé par Bisûnûrs Voir le message
Ton serveur Java a l'air d'attendre un entier en paramètre et tu lui fournis un tableau associatif.

En passant les paramètres comme ça :

Code :
$retour = $soapclient->__soapCall( 'METHODE_DISTANTE', $tab );
?
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 14h14   #10
Invité de passage
 
Inscription : septembre 2008
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 20
Points : 0
Points : 0
Je viens de tenter mais exception toujours présente.


Par contre, tu me dis :
"Ton serveur Java a l'air d'attendre un entier en paramètre et tu lui fournis un tableau associatif"

Hors dans l'appel suivant, que tu me conseilles, mon parametre : "$tab" reste un tableau associatif.

Code :
$retour = $soapclient->__soapCall( 'METHODE_DISTANTE', $tab );
J'ai testé aussi ce type d'appel avec la methode SoapParam() :

Code :
1
2
3
4
5
6
 
$retour = $soapclient->METHODE_DISTANTE(
new SoapParam("VALEUR1", "PARAM1"),
new SoapParam("VALEUR2", "PARAM2"),
new SoapParam("VALEUR3", "PARAM3")
);
L'exception reste identique :

Code :
1
2
3
4
5
6
7
 
Fatal error: Uncaught SoapFault exception: [soapenv:Server.userException] org.xml.sax.SAXException: Bad types (class java.lang.String -> class java.lang.Integer) in chemin/nomDeMonFichier.php:45
Stack trace:
#0 [internal function]: SoapClient->__call('METHODE_DISTANTE', Array)
#1 chemin/nomDeMonFichier.php(45): SoapClient->METHODE_DISTANTE(Object(SoapParam), Object(SoapParam), Object(SoapParam), Object(SoapParam), Object(SoapParam), Object(SoapParam), Object(SoapParam))
#2 {main}
  thrown in chemin/nomDeMonFichier.php on line 45
supertotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 14h31   #11
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Non, je passe un tableau à SOAP qui se charge de le transformer en liste de paramètres.
Dans ton premier code, tu passais un tableau de tableau, ce qui fait que tu avais un seul paramètre passé à la fonction, de type tableau. Quand tu passes seulement un tableau, ça "répartit" les paramètres à la manière de call_user_func_array().

Si l'exception est toujours présente, le message est-il toujours exactement le même ?

A mon avis ça reste un problème de typage, vu que Java a un typage strict.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 14h32   #12
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Citation:
Envoyé par Bisûnûrs Voir le message
Si l'exception est toujours présente, le message est-il toujours exactement le même ?
Citation:
Envoyé par supertotal Voir le message
L'exception reste identique :

[...](class java.lang.String -> class java.lang.Integer)[...]
La réponse est non. Et c'est bien un problème de typage.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 15h37   #13
Invité de passage
 
Inscription : septembre 2008
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 20
Points : 0
Points : 0
Le problème de typage semble cohérent, mais y a t-il une solution pour que cela passe ?
Dans l'appel php4, je ne rencontre pas ce problème bizarrement.
supertotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 15h56   #14
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Je n'ai pas inspecté le code de la librairie nusoap, si ça se trouve elle faisait un transtypage des données en fonction de ce qui était passé.

Vu que le serveur attend des entiers, essaie de passer des entiers et non des chaines ...
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h35.


 
 
 
 
Partenaires

Hébergement Web