Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-10-2008 11:41:19

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

[Résolu][Zend_Soap_Server] Problème pour retourner un array

Bonjour,

J'essaie d'utiliser un Zend_Soap_Server, jusque là aucun problème smile

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:

Code:

// 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 :

Code:

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:

Code:

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:

Code:

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 ? smile

Merci,

A+ benjamin.

Dernière modification par Delprog (20-10-2008 19:02:50)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#2 17-10-2008 16:28:23

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Bonjour,

peux-tu poster ton wsdl (supprime les adresse que nous ne devons peut-etre pas voir wink?

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

 

#3 17-10-2008 16:32:53

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

rebonjour,

fais un test bete aussi :
dans ta class server du wsdl
tu renvoie un tableau
fais le comme ca :

Code:

$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

 

#4 17-10-2008 17:44:26

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Voici le WSDL généré par AutoDiscover :

Code:

<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 smile

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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 20-10-2008 11:01:19

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Toujours pas d'idées ? wink


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#6 20-10-2008 12:15:03

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

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 :

Code:

$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

 

#7 20-10-2008 12:18:20

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

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

 

#8 20-10-2008 16:38:21

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Salut,

Alors soit je n'ai rien compris, soit l'AutoDiscover est inutilisable smile

Le truc de base, mais de base :

Code:

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:

Code:

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 :

Code:

Array ( [0] => string getInfo() )

Donc une seule des méthodes, et de plus sans paramètres.

Et avec :

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 renvoie:

Code:

string(5) "test "

Donc vraiment je me pose des questions, c'est du grand n'importe quoi smile

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)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#9 20-10-2008 17:06:12

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

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

 

#10 20-10-2008 17:11:25

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Mais moi je veux bien smile

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é...


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#11 20-10-2008 17:33:28

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Re bonjour :

dans

Code:

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

 

#12 20-10-2008 17:53:49

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Hello,

Juste pour vous dire :

Code:

Zend_Loader::loadClass('Zend_Soap_Client');

ne sert à rien, si vous faites

Code:

$client = new SoapClient('http://toto/webservice/ws.php?wsdl');

C'est pas

Code:

$client = new Zend_Soap_Client('http://toto/webservice/ws.php?wsdl');

que vous voulez.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#13 20-10-2008 17:59:24

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#14 20-10-2008 18:10:34

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

Voici la petite classe de test :


alors voici le controller de Test

Code:

<?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:


Code:

<?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']


Code:

 
// 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:

Code:

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

 

#15 20-10-2008 19:02:22

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][Zend_Soap_Server] Problème pour retourner un array

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 :

Code:

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 smile

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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages