Problème requête Soap en PHP

orzabal
Invité n'ayant pas de compte PHPfrance

21 nov. 2005, 17:09

Bonjour à tous,

voila je n'y connais rien en XML et on m'a confié une tache quelque peu complèxe. Je vais essayer d'être le plus precis possible.

On m'a donné un code qui fonctionne sous ASP. Je dois faire la même chose en php. Voila le code en ASP


------------------------
SoapServer = "http://www.url.fr/mapage.php" 

SoapRequest = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:SOAP-ENC=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">" 

SoapRequest = SoapRequest & "<SOAP-ENV:Body>" 
SoapRequest = SoapRequest & "<m:mafonction xmlns:m=""http://www.url.fr"">" 
SoapRequest = SoapRequest & "<BALISE1>" & var1 & "</BALISE1>" 
SoapRequest = SoapRequest & "<BALISE2>" & var2 & "</BALISE2>" 
SoapRequest = SoapRequest & "<BALISE3>" & var3 & "</BALISE3>" 
SoapRequest = SoapRequest & "</m:mafonction>" 
SoapRequest = SoapRequest & "</SOAP-ENV:Body>" 
SoapRequest = SoapRequest & "</SOAP-ENV:Envelope>" 


Set xmlhttp = Server.CreateObject(C_XML_HTTP) 
xmlhttp.Open "POST", SoapServer, False 
xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=ISO-8859-1" 
xmlhttp.send 
------------------------


J'ai essayé pour ma requete d'utiliser nusoap.php mais ca ne fonctionne pas. Voici le code PHP qui ne fonctionne pas
------------------------------------
require_once('nusoap.php'); 
$url = 'http://www.url.fr/mapage.php'; 
$flux = '<m:mafonction xmlns:m="http://www.url.fr">'; 
$flux .= '<BALISE1>'.var1.'</BALISE1>'; 
$flux .= '<BALISE2>'.var2.'</BALISE2>'; 
$flux .= '<BALISE3>'.var3.'</BALISE3>'; 
$flux .= '</m:mafonction>'; 

$soapclient->debug_flag = true; 
$soapclient = new soapclient($url, 'wsdl'); 
$requete = $soapclient->call('mafonction', $flux); 
----------------------------------

A ce que j'ai compris, l'aplication ne fait pas du "vrai SOAP" (?!). Je ne dois donc pas utiliser Nusoap.

En fait je pense que ma requete est bonne (variable $flux) par contre je ne sais pas comment envoyer cette requete vers le serveur XML. J'ai bien le code qui récupère le resultat de la requete donc pas de problème à ce niveau là. Mais comment creer un object et l'envoyer ?

Merci à vous

RO

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

21 nov. 2005, 17:54

Pourquoi dois tu le refaire en PHP ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Orzabal
Invité n'ayant pas de compte PHPfrance

21 nov. 2005, 18:13

J'ai pas tous les éléments mais apparament tout le site web est en php. De plus je ne sais pas si un serveur ASP est installé sur notre serveur

Orzabal
Invité n'ayant pas de compte PHPfrance

23 nov. 2005, 13:07

Personne ?

:cry: :cry:

Mammouth du PHP | 983 Messages

23 nov. 2005, 14:30

Qu'est ce que tu obtiens pour le moment?

Eléphanteau du PHP | 18 Messages

26 nov. 2005, 16:11

essaye sans utiliser le wsdl : $soapclient = new soapclient($url);

et en virant de flux
=> <m:mafonction xmlns:m="http://www.url.fr">'
et
=> $flux .= '</m:mafonction>';

$ flux doit contenir les paramètres de ta fonction.
Je sais même pas si t'as besoin des balises pour tes variables.
Moi généralement j'utilise un tableau associatif:
$flux = array('balises1'=>'var1','balises2'=>'var2, ....');

++
dd-bug (#)

@softibox.com

orzabal
Invité n'ayant pas de compte PHPfrance

28 nov. 2005, 16:11

Merci de vos réponses :-)

Malheureusement ça ne fonctionne pas. Utiliser un tableau oui pourquoi pas mais bon à priori c'est la même chose non ??

Actuellement j'obtiens ceci :
HTTP/1.1 200 OK Date: Mon, 28 Nov 2005 14:03:46 GMT Server: Apache/1.3.31 (Unix) PHP/4.2.3 X-Powered-By: PHP/4.2.3 Connection: close Content-Type: text/xml; charset=ISO-8859-1
C'est bien me direz vous sauf que je dois recevoir une réponse de "mafonction" et elle ne me retourne rien

J'ai mis le nom d'une fonction bidon et j'ai eu un resultat d'erreur. Preuve que la requete que j'envoie est bonne... Enfin presque car je ne reçois rien comme réponse.

Je ne suis pas loin semble-t-il mais je bloque la dessus depuis des jours :cry:

Eléphanteau du PHP | 18 Messages

28 nov. 2005, 17:45

as tu utilisé les fonctions de la classe client de "nusoap" pour t'aider a
ddbuger ?
(par defaut debug_level est a 9 donc tu auras ts les messages)

Code : Tout sélectionner

$client->request $client->response $client->debug_str
Post ton résultat ca nous aidera surement :roll:
dd-bug (#)

@softibox.com

Orzabal
Invité n'ayant pas de compte PHPfrance

29 nov. 2005, 12:01

voici les resultats. Je n'ai pas mis le debug car la reponse est trop mongue et je crois avoir cerné le problème dans la requete

reponse

Code : Tout sélectionner

HTTP/1.1 200 OK Date: Tue, 29 Nov 2005 09:36:22 GMT Server: Apache/1.3.31 (Unix) PHP/4.2.3 X-Powered-By: PHP/4.2.3 Connection: close Content-Type: text/xml; charset=ISO-8859-1
request

Code : Tout sélectionner

POST /rpc/page.php HTTP/1.0 Host: soap.appli.url.com User-Agent: NuSOAP/0.7.2 (1.94) Content-Type: text/xml; charset=ISO-8859-1 SOAPAction: "" Content-Length: 746 <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns2789:mafonction xmlns:ns2789="http://tempuri.org"><m:mafonction xmlns:m="http://webservices.url.fr/aa/aa"><BALISE>aa</BALISE><BALISE2>fff</BALISE2><BALISE3/><BALISE4/><ETC/><m:mafonction></ns2789:mafonction></SOAP-ENV:Body></SOAP-ENV:Envelope>
Je ne comprends pas tout mais il est clair que ma requete n'est pas bonne dans l'appel de la fonction j'ai cette balise :
<ns2789:mafonction xmlns:ns2789="http://tempuri.org">

A mon avis le problème est la non ? Un problème généré par Nusoap ? Comment contourner le pb ?


merci :-)

Orzabal
Invité n'ayant pas de compte PHPfrance

29 nov. 2005, 12:57

Ca y'est j'ai reussi :-)

Je vais tenter de vous expliquer. Comme je le disais dans mon dernier message nusoap me génère une balise pour ma fonction :

Code : Tout sélectionner

<ns2789:mafonction xmlns:ns2789="http://tempuri.org">
j'ai donc enlevé de ma variable $flux l'appel à cette fonction et je suis allé dans nusoap réparer ce qui n'allait pas. J'ai trouvé dans la fonction CALL ce bout de code que j'ai modifié

Code : Tout sélectionner

$this->debug("wrapping RPC request with encoded method element"); if ($namespace) { $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . $payload ."</$nsPrefix:$operation>";[
J'avais la variable $nsPrefix qui me genait et que j'ai remplacé par "m". Enfin $namespace avait pour valeur "http://tempuri.org" je l'ai remplacé par mon URL ce qui donne ceci :

Code : Tout sélectionner

$payload = "<m:$operation xmlns:m=\"http://monurl.fr/">" . $payload . "</m:$operation>";
Je pense qu'il y a une solution plus propre mais en tout cas cette solution semble fonctionner. Je n'ai pas très bien compris pourquoi nusoap me générait un "prefix" et une "url" dans ma fonction.

Si quelqu'un a une idée pour une solution plus adequat.... J'ai bien galéré donc si je peux avoir une explication logique je suis preneur :-)

En tout cas merci à toi, tu m'as mis sur la voie en faisant un debug sur ma requete :-)

Eléphanteau du PHP | 18 Messages

29 nov. 2005, 13:01

hello orzabal :!:

Je suis avec interet ta progression dans le developpement de ton client soap.
Et je fais mes petits tests a coté. Tu peux regarder ce petit essaie :

http://www.softibox.com/google-api/client.php

Ca te donnera surement quelques idées pour résoudre ton problème.
Ce lien ne sera actif que jusqu'a ce soir donc profite en bien.

pour répondre a ta question, je pense pas que ton problème vienne de :
<ns2789:mafonction xmlns:ns2789="http://tempuri.org">
Cette formulation est faite par rapport au schéma xmlsoap utilisé.
J'ai le même truc dans mes requests. Par contre il faut regarder au niveau
du ddebug, la reponse qui t'es faite par le serveur ... généralement il te
retourne la faute et te faciles la recherche.

Tiens nous au courant ++
dd-bug (#)

@softibox.com

Eléphanteau du PHP | 18 Messages

29 nov. 2005, 13:08

Oki Et félicitation !! :D
Je vais jetter un coup d'oeil du coté de ton "m" a la place de "ns".
Je crois que c'ets une histoire d'option lors de l'appel de clients->call

Code : Tout sélectionner

$client->call($action,$param_action,$namespace,......,$style='rpc',$use='[b]literal[/b]',$encodingStyle='');
Bonne continuation
dd-bug (#)

@softibox.com

orzabal
Invité n'ayant pas de compte PHPfrance

29 nov. 2005, 14:47

Je crois que c'ets une histoire d'option lors de l'appel de clients->call
Oui je vais regarder ça de plus pres. Je mettrais la soluce sur le forum si je la trouve

Invité
Invité n'ayant pas de compte PHPfrance

07 déc. 2005, 10:47

Je préciserais que php5 gère Soap et les fichiers wsdl. Il suffit de l'activer dans le php.ini.

extension=php_soap.dll
et
[soap]

soap.wsdl_cache_enabled = 0
soap.wsdl_cache_dir = "D:/SitesWeb/projetm2/temp"
soap.wsdl_cache_ttl = 84600

j'ai mis le cache à 0 pour éviter des problèmes de persistence. Mais lorsque votre appli marche bien il est bon de mettre à 1 pour accélérer un peu le bouzin.