Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Salut à tous,
Dans le cadre de mon projet j'ai besoin de faire un serveur Soap. Je me dis chouette ça tombe bien, ils viennent justement d'inclure ça au ZF1.6, on va en profiter !!
Et c'est le drame
non seulement ça ne marche pas, mais en plus je n'ai aucun message d'erreur
Pour résumé, j'ai 4 fichiers sur deux serveurs:
serveur distant:
- wsdl.php <= le fichier contenant l'auto-discover du ZF pour creer le fichier wsdl
- test.class.php <= une simple class bidon avec une fonction qui dit bonjour
- server.php <= Le fichier contenant le serveur soap
serveur local:
- index.php <= contenant la connection au soap distant et voulant afficher le résultat de ma fonction
voici le contenu des fichiers:
wsdl.php
require_once 'test.class.php'; require_once 'Zend/Soap/AutoDiscover.php'; $autodiscover = new Zend_Soap_AutoDiscover(); $autodiscover->setClass('test'); $autodiscover->handle();
test.class.php
class test { /** * test function for soap server * * @param string $ami * @return string */ public function who($ami) { return 'you are '.$ami; } }
server.php
try { $server = new Zend_Soap_Server('http://192.168.2.72/soap/wsdl.php', $option); $server->handle(); } catch (SoapFault $e) { print_r($e); }
index.php
try { $client = new Zend_Soap_Client('http://192.168.2.72/soap/wsdl.php'); echo $client->who('erwan'); } catch (SoapFault $e) { print_r($e); }
Si je vai en direct sur l'url du fichier wsdl j'ai un magnifique xml qui s'affiche et qui, dans mes maigres moyens' m'a l'air correct.
Par contre, en direct sur le server.php, il m'affiche ceci:
<SOAP-ENV:Envelope> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>0</faultcode> <faultstring>Invalid XML</faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Je ne sais pas si c'est une erreur, ou bien si c'est juste parce que j'essaye d'y acceder en direct sasn aucune request
Et quand à mon fichier index.php, il reste désespérément vide
Si quelqu'un voit une erreurs, ou à une piste, je suis preneur
Dernière modification par Asfaloth (27-10-2008 16:04:27)
Hors ligne
Bonjour,
dans server.php
il manque :
$server->setClass('test');
tu n'a pas associé de class a ton serveur soap.
remarque :
attention a l'autodiscover : avec des type simple il marche tres bien .. avec des types complex ca marchait tres mal (du moins sur les version jusque 1.5.2)
Dernière modification par ichevc02 (03-10-2008 17:18:36)
Hors ligne
J'ai exactement le meme soucis ....
Pas de solution?
Hors ligne
Salut,
Après une loooongue prise de tête, je suis enfin parvenu à faire fonctionner ce ******** de server Soap.
Pour ceux que ça interresse, voici mon code de test, maintenant plus qu'a faire une class sérieuse derriere...
Première Etape (INDISPENSABLE EN ENVIRONNEMENT DE TEST):
Désactiver la mise en cache du fichier WSDL dans votre php.ini
Très con mais c'est ce qui m'a bloqué pendant une semaine (jusqu'a ce que lundi je fasse un refresh du code qui marchait pas le vendredi et pouf, ça marche ).
Donc dans votre php.ini mettre le "soap.wsdl_cache_enabled" à 0 au lieu de 1. Ceci sur la machine client
[soap] ; Enables or disables WSDL caching feature. soap.wsdl_cache_enabled=0 ; Sets the directory name where SOAP extension will put cache files. soap.wsdl_cache_dir="/tmp" ; (time to live) Sets the number of second while cached file will be used ; instead of original one. soap.wsdl_cache_ttl=86400
Une fois que ce problème de wsdl qui ne se met jamais à jour est réglé, le reste va beaucoup plus vite:
ma class de test:
<?php class SoapService { /** * @return string */ public function helloWorld() { return "Hello Me!"; } /** * @return array */ public function getFruits() { return array('apple', 'orange', 'banana'); } /** * @return string */ public function getWorld() { return "Hello getWorld!"; } /** * @param string $me * @return string */ public function moi($me) { if (empty($me)) { throw new Exception('$me est vide'); } $return = 'hahahaah tu es '.$me; return $this->_test($return); } private function _test($value) { $return = strtoupper($value); return $return; } } ?>
Ma page server.php
<?php // Set error reporting error_reporting(E_ALL|E_STRICT); // Set Timezone date_default_timezone_set('Europe/Brussels'); set_include_path('.' . PATH_SEPARATOR .'../library' . PATH_SEPARATOR .get_include_path()); require_once "test.class.php"; require_once "Zend/Soap/Server.php"; require_once "Zend/Soap/AutoDiscover.php"; if(isset($_GET['wsdl'])) { $autodiscover = new Zend_Soap_AutoDiscover(); $autodiscover->setClass('SoapService'); $autodiscover->handle(); } else { $options = array('soap_version' => SOAP_1_1); $soap = new Zend_Soap_Server("http://localhost/soap/server.php?wsdl", $options); // this current file here $soap->setClass('SoapService'); $soap->handle(); } ?>
Et enfin, la page coté client:
<?php // Set error reporting error_reporting(E_ALL|E_STRICT); // Set Timezone date_default_timezone_set('Europe/Brussels'); set_include_path('.' . PATH_SEPARATOR .'./library' . PATH_SEPARATOR .get_include_path()); require_once 'Zend/Loader.php'; // Automatically require files for class Zend_Loader::registerAutoload(); $options = array(); try { $client = new Zend_Soap_Client("http://192.168.2.72/soap/server.php?wsdl", $options); // Servers WSDL Location print_r($client->getFunctions()); echo '<br />'.$client->moi('Toto'); } catch(Exception $e) { echo '<pre>'; print_r($e); echo '</pre>'; } ?>
Voilà voilà, en esperant que ça en aide d'autres....
Hors ligne