Page 1 sur 1

Problème requête Soap en PHP

Posté : 21 nov. 2005, 17:09
par orzabal
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

Posté : 21 nov. 2005, 17:54
par mere-teresa
Pourquoi dois tu le refaire en PHP ?

PHP

Posté : 21 nov. 2005, 18:13
par Orzabal
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

personne ?

Posté : 23 nov. 2005, 13:07
par Orzabal
Personne ?

:cry: :cry:

Posté : 23 nov. 2005, 14:30
par rami
Qu'est ce que tu obtiens pour le moment?

Posté : 26 nov. 2005, 16:11
par ddbug
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, ....');

++

merci

Posté : 28 nov. 2005, 16:11
par orzabal
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:

Posté : 28 nov. 2005, 17:45
par ddbug
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:

on avance

Posté : 29 nov. 2005, 12:01
par Orzabal
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 :-)

Ca y'est !!!

Posté : 29 nov. 2005, 12:57
par Orzabal
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 :-)

Posté : 29 nov. 2005, 13:01
par ddbug
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 ++

Posté : 29 nov. 2005, 13:08
par ddbug
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

function call

Posté : 29 nov. 2005, 14:47
par orzabal
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

Posté : 07 déc. 2005, 10:47
par Invité
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.