Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'essaie d'utiliser un Zend_Soap_Server, jusque là aucun problème
Par contre quand j'essaie de renvoyer un array() dans une méthode de classe, côté client je ne récupère rien.
J'utilise Zend_Soap_AutoDiscover.
Mon serveur:
// SERVEUR SOAP Zend_Loader::loadClass('Zend_Soap_Server'); Zend_Loader::loadClass('Zend_Soap_AutoDiscover'); Zend_Loader::loadClass('WsClass_General'); if (isset($_GET['wsdl'])) { $wsdl = new Zend_Soap_AutoDiscover(); $wsdl->setClass('WsClass_General'); $wsdl->handle(); } else { $uri = Zend_Registry::get('config')->general->webservice . '?wsdl'; try { $soap_server = new Zend_Soap_Server($uri, array('soap_version' => SOAP_1_2)); $soap_server->setClass('WsClass_General'); $soap_server->handle(); } catch(Exception $e){ die('ERROR :'.$e->getMessage()); } }
Ma classe :
class WsClass_General { /** * test function for soap server * * @param string $nom * @param string $prenom * @return array */ public function test($nom, $prenom) { return array( 'nom' => 'votre nom est ' . $nom, 'prenom' => 'votre prénom est ' . $prenom ); } }
Et mon client:
Zend_Loader::loadClass('Zend_Soap_Client'); $client = new SoapClient('http://www.xxxxxxx.com/webservice/ws_xxxx.php?wsdl'); $params = array('nom' => 'TOTO', 'prenom' => 'Titi'); $result = $client->test($params); var_dump($result); exit;
J'obtiens en sortie du client:
string(5) "Array"
On est d'accord que c'est un test des plus basiques, mais je ne vois pas où est mon erreur, une idée ?
Merci,
A+ benjamin.
Dernière modification par Delprog (20-10-2008 19:02:50)
Hors ligne
Bonjour,
peux-tu poster ton wsdl (supprime les adresse que nous ne devons peut-etre pas voir ?
Zend_Auto_discovers quand je l'ai testé et qu'il était encore que dans l'incubateur avait du mal a générer un wsdl correct avec des complex type et tableau.
Je pense que ton probleme provient donc du wsdl généer par auto_discover (a vérifier en regarant le wsdl)
Hors ligne
rebonjour,
fais un test bete aussi :
dans ta class server du wsdl
tu renvoie un tableau
fais le comme ca :
$tableauRetour = array( 'nom' => $nom, 'prenom' => $prenom); return $tableauRetour;
avec les bon docs (@return array $tableauRetour)
peut-etre qu'autoDiscovert marchera mieux comme ceci.
A tester on ne sais jamais
Hors ligne
Voici le WSDL généré par AutoDiscover :
<definitions name="WsClass_General" targetNamespace="http://xxxx.xxxxx.com/webservice/ws_xxxxx.php"> − <portType name="WsClass_GeneralPort"> − <operation name="test"> <input message="tns:testRequest"/> <output message="tns:testResponse"/> </operation> </portType> − <binding name="WsClass_GeneralBinding" type="tns:WsClass_GeneralPort"> <soap:operation soapAction="http://xxxxx.xxxxx.com/webservice/ws_xxxxx.php#test"/> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> − <operation name="test"> − <input> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> − <output> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> </binding> − <service name="WsClass_GeneralService"> − <port name="WsClass_GeneralPort" binding="tns:WsClass_GeneralBinding"> <soap:address location="http://xxxxx.xxxxx.com/webservice/ws_xxxxx.php"/> </port> </service> − <message name="testRequest"> <part name="nom" type="xsd:string"/> <part name="prenom" type="xsd:string"/> </message> − <message name="testResponse"> <part name="testReturn" type="soap-enc:Array"/> </message> </definitions>
fais le comme ca :
Code:
$tableauRetour = array( 'nom' => $nom, 'prenom' => $prenom); return $tableauRetour;
C'est la première chose à laquelle j'ai pensé, mais le résultat est le même
J'ai aussi testé de ne pas faire un tableau associatif, idem. Et biensûr le test de base, si je renvoie un 'string' ça fonctionne à merveille.
A+ benjamin.
Hors ligne
Toujours pas d'idées ?
Hors ligne
Bonjour,
agissons par étape.
le wsdl me semble bon (meme si je suis pas expert en la matiere).
maintenant traçons la reponse xml du webservice .
dans ton client :
$options = array('trace'=>1); // activation des ttrace de soap $Client = new SoapClient('http://www.xxxxxxx.com/webservice/ws_xxxx.php?wsdl',$options); appel ta methode puis : var_dump($Client ->__getLastResponseHeaders()); // header hhtp de la reponse var_dump($Client ->__getLastResponse()); // xml de la reponse
et post le xml voir quel est la reponse renvoyée par ton serveur.
Hors ligne
autre test possible:
j'utilise le script wsdl2php pour générer mes clients a partir des wsdl qu'on me fournit :
http://sourceforge.net/projects/wsdl2php
essaie de l'utiliser avec ton wsdl pour voir le client qu'il te génère. Ca peut donner des piste.
ps : se script est vraiment sympa et je génère mes clients avec (il fait les classmap etc ...)
Hors ligne
Salut,
Alors soit je n'ai rien compris, soit l'AutoDiscover est inutilisable
Le truc de base, mais de base :
class WsClass_General { /** * Une méthode de test * * @param string $_format * @return string */ public function getInfo($_format) { $result = 'test ' . $_format; return $result; } /** * Une autre méthode de test * * @param string $_format1 * @return string */ public function getInfoTest($_format1) { $result = 'test ' . $_format1; return $result; } }
Si je fais:
Zend_Loader::loadClass('Zend_Soap_Client'); $client = new SoapClient('http://toto/webservice/ws.php?wsdl'); result = $client->__getFunctions(); print_r($result); exit;
Il me renvoie :
Array ( [0] => string getInfo() )
Donc une seule des méthodes, et de plus sans paramètres.
Et avec :
Zend_Loader::loadClass('Zend_Soap_Client'); $client = new SoapClient('http://toto/webservice/ws.php?wsdl'); $params = array('_format' => 'parametre'); result = $client->getInfo($params); var_dump($result); exit;
Il renvoie:
string(5) "test "
Donc vraiment je me pose des questions, c'est du grand n'importe quoi
C'est juste une intox le AutoDiscover ? (sans vouloir être désagréable hein :p)
Et en passant, j'ai la 1.6.2
A+ benjamin.
Dernière modification par Delprog (20-10-2008 16:39:33)
Hors ligne
Bonjour,
même si je peste souvent sur le package Soap de Zend .
J'ai un webService Zend_Autodiscover en prod (ok je l'ai un peu réecrit a ma sauce) et ca marche pas mal avec des types simple (string). Je me suis pas risqué au complex Type avec l'autodiscover.
Disons juste qu'il n'est pas encore tres mure, mais il promet tellement ....
Hors ligne
Mais moi je veux bien
Mais est-ce que tu sais me dire pourquoi j'ai un tel résultat, avec des types simples pourtant ?!
Bizarre...bizarre, j'ai beau relire mon code, je ne vois pas où je me suis planté...
Hors ligne
Re bonjour :
dans
Code: Zend_Loader::loadClass('Zend_Soap_Client'); $client = new SoapClient('http://toto/webservice/ws.php?wsdl'); $params = array('_format' => 'parametre'); result = $client->getInfo($params); var_dump($result); exit;
il manque le "$" a $result = $client->getInfo($params);
(joke)
Je fais un serveur et client de test et le post ici d'ici 10 min
Dernière modification par ichevc02 (20-10-2008 17:34:11)
Hors ligne
Hello,
Juste pour vous dire :
Zend_Loader::loadClass('Zend_Soap_Client');
ne sert à rien, si vous faites
$client = new SoapClient('http://toto/webservice/ws.php?wsdl');
C'est pas
$client = new Zend_Soap_Client('http://toto/webservice/ws.php?wsdl');
que vous voulez.
A+
Hors ligne
Bonsoir,
Oui effectivement, mais il s'agit d'une erreur sur la doc officielle. (pour ma décharge :p)
Evidemment ça ne change rien au problème.
A+ benjamin.
Hors ligne
Voici la petite classe de test :
alors voici le controller de Test
<?php /** * TestController module Webservice * @version 1.0 * @author Cédric CHEVALIER */ class webService_TestController extends Zend_Controller_Action{ function init(){ $this->view->baseUrl = $this->_request->getBaseUrl(); } public function clientarracheAction(){ try{ $options = array( 'soap_version' => SOAP_1_2, 'trace' => 1); $client = new SoapClient('http://recettelocale/webService/test/?wsdl',$options); var_dump($client); var_dump($client->__getFunctions()); $result = $client->getInfoServiceWeb("Salut les gars"); $result2 = $client->getInfoServiceWeb2("Salut les gars"); }catch(Exception $e){ var_dump($e->getMessage()); ob_flush(); die("erreur"); } var_dump($result); var_dump($result2); ob_flush(); exit("fin du client Arrache"); } /** * @desc action pour le serveur Soap, appel avec parametre wsdl renvoie le wsdl * */ public function indexAction(){ Zend_Loader::loadClass('Zend_Soap_AutoDiscover'); Zend_Loader::loadClass('IPAB_Soap_AutoDiscover'); Zend_Loader::loadClass('MaClassTest'); $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->setNoRender(true); $this->_helper->viewRenderer->setNoRender(); if (isset($_GET['wsdl'])){ // var_dump($_SERVER); //die(); //$wsdl = new IPAB_Soap_AutoDiscover(); $wsdl = new IPAB_Soap_AutoDiscover(); $wsdl->setClass('MaClassTest'); $wsdl->handle(); } else { $path = isset($_SERVER['REDIRECT_URL']) ? $_SERVER['REDIRECT_URL'] : $_SERVER['SCRIPT_NAME']; $uri = 'http://' .$_SERVER['HTTP_HOST'] . $path . '?wsdl'; try { //$soap = new Zend_Soap_Server($uri,array('classmap' => array('IpabDocument' => 'IpabDocument' ), 'trace' => 1, 'soap_version'=>SOAP_1_2)); $soap = new SoapServer($uri,array('trace' => 1, 'soap_version'=>SOAP_1_2)); $soap->setClass('MaClassTest'); }catch(Exception $e){ Zend_Registry::get('logger')->log('ERROR :'.$e->getMessage(), Zend_Log::ERR); } $soap->handle(); } } }
maintenant la classe metier:
<?php class MaClassTest{ function __construct(){ return; } /** * @desc methode de test pour aider * * @param string $_format * @return string $result1 */ public function getInfoServiceWeb($_format){ $result1 = 'reponse ' . $_format; return $result1; } /** * @desc seconde methode pour aider * * @param string $_format1 * @return string $result */ public function getInfoServiceWeb2($_format1) { $result = 'reponse2 ' . $_format1; return $result; } }
enfin je fais appel à une classe perso a la place de Zend_Soap_Autodiscover qui modifie juste une ligne de la methode setClass
je donne ligne qui change pour le montrer mais,
préférez le patch soumis aujourd'hui dans un autre topic du forum car plus interessant que ce pauvre $_SERVER['REDIRECT_URL']
// ici je change //$uri = Zend_Uri::factory('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']); //par : $uri = Zend_Uri::factory('http://'.$_SERVER['HTTP_HOST'] .$_SERVER['REDIRECT_URL']);
j'espere que ca pourra aider
chez moi ca marche bien j'ai comme resultat a l'appel http://recettelocale/webService/test/clientarrache:
object(SoapClient)#50 (3) { ["trace"]=> int(1) ["_soap_version"]=> int(2) ["sdl"]=> resource(169) of type (Unknown) } array(2) { [0]=> string(41) "string getInfoServiceWeb(string $_format)" [1]=> string(43) "string getInfoServiceWeb2(string $_format1)" } string(22) "reponse Salut les gars" string(23) "reponse2 Salut les gars" fin du client Arrache
Dernière modification par ichevc02 (20-10-2008 18:18:14)
Hors ligne
Bon et bien j'ai trouvé.
Il n'y avait aucune erreur dans le code. J'ai sué, mais au final il s'agissait du cache automatique des fichiers wsdl de php !!!! Le VILAIN !
Donc je changeais mes classes, comment dire, un peu dans le vent... puisqu'il gardait la dernière définition depuis je ne sais quoi, soit le redémarrage d'apache, soit le reboot du serveur lui-même.
Le fait est que, j'ai rajouté la ligne :
ini_set("soap.wsdl_cache_enabled", "0");
Et au final, tout fonctionne, même les array(), le tout avec l' AutoDiscover.
Je m'excuse d'avoir remis en cause Zend
C'était une bonne paire d'heures de galère, et encore pour un détail que je nommerai gentiment de "@$!%cking bull@$!%hit mother @$!%ker"
En tout cas, merci pour votre aide.
A+ benjamin.
Hors ligne
Pages: 1