Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-03-2008 11:03:00

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

[NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

Bonjour,

J'ai un gros probleme technique, je dois faire des appel de service soap  à partir d'un CMS (droopal avec le module nusoap) , le server étant sous zend framework 1.5.

Cela fait 2 jours que nous ne parvenons pas à réaliser ces transactions, les seules réponses que l'ont ai à l'appel du service est le code html de la page quer l'on obtient en appelant directement le fichier php sur le server.

Quelqu'un pourrait me filer un coup de main ?

Je désespère.

Hors ligne

 

#2 25-03-2008 13:15:24

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

il ne faut pas appeller l'appli mais un service donc écrire une service SOAP
deux solution utiliser Zend_Server

qui permet à partir d'une classe de fournir un service
ou alors d'en passer par zend_Framework mais alors il faut écrire soit même le traitement relatif au service
soit c'est l'url qui contient le controller et l'action de service et le SOAP ne contient que les donnés
il faut alors extraire ses données (parser le xml) traitre la demande et ne pas générer de vue mais retourner la réponse en encodant à la sauce SOAP

soit le service est dans le message SOAP (la norme) et il faut écrire un dispatcher pour faire ça.

A+JYT

Hors ligne

 

#3 25-03-2008 13:49:44

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

Merci beaucoup d'avoir pris le temps de répondre, j'ai pas tout compris mais pour t'expliquer un peu mieux , j'ai fais ça pour exemple (coté server):

Code:

<?php
require_once 'Zend/Controller/Action.php';
class ServerController extends Zend_Controller_Action
{

    function init ()
    {
        $this->_helper->viewRenderer->setNoRender(true);
    }

    function indexAction ()
    {
        include (ROOT_DIR . '/appli/library/nuSoap/nusoap.php');
        // première étape : désactiver le cache lors de la phase de test
        ini_set("soap.wsdl_cache_enabled", "0");
        // on indique au serveur à quel fichier de description il est lié
        $server = new soap_server();
        $server->debug_flag = true;
        
        //configuration du wsdl
        $server->configureWSDL('HelloYou', 'http://localhost/appli/server', 'http://localhost/appli/server');
        //Création d'un type complexe
        $server->wsdl->addComplexType('Person',
            'complexType',
            'struct',
            'all',
            '',
            array
            (
                'id' => array
                (
                    'name' => 'id',
                     'type' => 'xsd:int'
                ),
                'firstName' => array
                (
                    'name' => 'firstName',
                     'type' => 'xsd:string'
                ),
                'lastName' => array
                (
                    'name' => 'lastName',
                     'type' => 'xsd:string'
                ),
                'phoneNumber' => array
                (
                    'name' => 'phoneNumber',
                     'type' => 'xsd:string'
                )
            )
        );
        
        //IN
        $in = array
        (
            'prenom'    =>    'xsd:string',
            'nom'        =>    'xsd:string'
        
        );
        $inPersonne = array
        (
            'id' => 'xsd:int'
        );
        
        //OUT
        $out = array
        (
            'return'    =>    'xsd:string'
        );
        $outPersonne = array
        (
            'return'     => 'tns:Person'
        );

        //enregistrement de la fonction getHello
        $server->register('getHello', $in, $out, 'http://localhost/appli/server', 'http://localhost/appli/server/getHello');
        //enregistrement de la fonction getPersonne
        $server->register('getPerson', $inPersonne, $outPersonne, 'http://localhost/appli/server', 'http://localhost/appli/server/getPerson');
        
        //définition Fonction getHello
        function getHello ($prenom, $nom)
        {
            return 'Hello ' . $prenom . ' ' . $nom;
        }

        //definition Fonction getPersonne
        function getPerson ($id)
        {
            //load the data into an array with names and return it
            return array('id' => '123456789' , 'firstName' => 'Nassoy' , 'lastName' => 'Francois' , 'phoneNumber' => '080124578');
        }
        //Appel de la methode service qui init la transaction et l'envoie de la réponse
        $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';

    $server->service($HTTP_RAW_POST_DATA);

    }
}

Le problème est que la réponse est strictement la même lorsque j'appelle le service depuis le client ou depuis le server (via http://localhost/appli/server/index), c'est à dire du code html.

Je mets pas le code coté client qui est "classique", seul le coté server pose probleme une fois intégré au framework (pas de probleme sinon)

Dernière modification par sebondus (25-03-2008 14:10:54)

Hors ligne

 

#4 25-03-2008 17:34:50

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

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

Bonjour,

je fais a peu prêt le même code en utilisant le soapserver du php5.

La seule différence notable est que je fais le :

Code:

$this->_helper->viewRenderer->setNoRender(true);

dans l'action et non dans l'init.

si ta reponse est de l'html il est possbile que le "setNoRender(true);" ne soit pas pris en compte.
essaie de le placer dans l'action pour voir, c'est juste une idée ...

Hors ligne

 

#5 25-03-2008 17:47:11

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

Tu pourrais poster ici ton bootstrap , ton fichier "server" et un client pour que je vois un peu ce que tu fais, ce que tu m'as dis n'a rien changé hmm

Y a de grandes chances que tu me débloques de ce merdier avec ça wink

...enfin je prie

Dernière modification par sebondus (25-03-2008 17:54:19)

Hors ligne

 

#6 25-03-2008 18:04:37

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

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

voici un exemple de serveur:

Code:

class webService_IndexController extends Zend_Controller_Action{

    function init(){
        $this->view->baseUrl = $this->_request->getBaseUrl();
        Zend_Loader::loadClass('Docs_DocumentManager');
        Zend_Registry::get('logger')->log('init de :'.$this->_request->getActionName().' '.$this->_request->getControllerName().' '.$this->_request->getModuleName(), Zend_Log::DEBUG);

    }


    function indexAction(){
         
        Zend_Loader::loadClass('Zend_Soap_AutoDiscover'); // n'est utiliser que pour generer dynamiquement le wsd
        Zend_Loader::loadClass('MaClasseDeServiceWeb'); // une classe tout ce qu'il y a de plus habituelle"
        Zend_Loader::loadClass('Docs_IpabDocument'); // une classe utiliser pour le classmap 
        
         
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        $viewRenderer->setNoRender(true);
                 // je ne sais plus pourquoi je fais deux fois le no render peut-etre une erreur
        $this->_helper->viewRenderer->setNoRender();

               

                //CETTE PARTIE NE SERT QU'A FOURNIRE LE WSDL SI LE PRAMETRE WSDL EST PASSE
        if (isset($_GET['wsdl'])){
            $wsdl    = new Zend_Soap_AutoDiscover();
            $wsdl->setClass('MaClasseDeServiceWeb');
             
            $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('MaClasseDeServiceWeb');

            }catch(Exception $e){
                Zend_Registry::get('logger')->log('ERROR :'.$e->getMessage(), Zend_Log::ERR);
            }
            $soap->handle();
        }
    }
}

mon bootstrap n'a pas de traitement particulier.
je peux te l'envoyer par mail si tu veux (il est un peu gros ), mais je ne suis pas sur qu'il puisse t'aider.

en esperant que cela t'aide ...

Hors ligne

 

#7 25-03-2008 18:54:05

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

[ Je précise que Nusoap est l'ancienne bibliothèque utilisée en PHP4 pour gérer les services webs SOAP.
Depuis PHP5, il existe une extension, SOAP, qui donne accès aux classes SoapServer et SoapClient. Ces objets sont bien plus performants que les NuSoap, car ils sont sous forme d'extension PHP, donc écrits en C ]

Hors ligne

 

#8 25-03-2008 20:30:27

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

Attention tout de même ils sont incomplet j'ai du me  rabattre sur nuSoap
Car l'extension Soap ne gère pas les appels de services avec pièce jointe et mode sécurisé

à par ça elle fonctionne parfaitement.
mais comme je le disais plus haut impossible d'utiliser Saop Server pour invoquer un action du framework
le module doit chager toute les classes de services pour les exposer

j'utilise donc partiellement le serveur Soap de cette extension pour lire et parser le message de SOAP du client
j'en déduit le contrôleur et l'action à exécuter que j'invoque. puis j'utilise de nouveau l'extension pour encoder la réponse ou les erreurs
pour cela j'utilise une des caractéristique de SOAP qui est de permette d'avoir des message de la forme  Action.method
A+JYT

Hors ligne

 

#9 25-03-2008 20:41:00

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

sekaijin a écrit:

Attention tout de même ils sont incomplet j'ai du me  rabattre sur nuSoap
Car l'extension Soap ne gère pas les appels de services avec pièce jointe et mode sécurisé

à par ça elle fonctionne parfaitement.
mais comme je le disais plus haut impossible d'utiliser Saop Server pour invoquer un action du framework
le module doit chager toute les classes de services pour les exposer

j'utilise donc partiellement le serveur Soap de cette extension pour lire et parser le message de SOAP du client
j'en déduit le contrôleur et l'action à exécuter que j'invoque. puis j'utilise de nouveau l'extension pour encoder la réponse ou les erreurs
pour cela j'utilise une des caractéristique de SOAP qui est de permette d'avoir des message de la forme  Action.method
A+JYT

Bonsoir,
Merci pour ton aide, mais encore une fois, n'ayant jamais mis en place ni fais appel à des services web, et vu mes faibles connaissances de Zendframework ( quelques jours à peine) je comprends pas trop ce que tu me dis.

Un très court exemple client-server me simplifierait beaucoup la tache, parceque la j'ai pas compris grand chose à ce que tu voulais dire à part les deux premieres lignes ...

Désolé big_smile

Hors ligne

 

#10 26-03-2008 07:57:53

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

je ne peux pas faire d'exemple court sur un truc si complexe
selon la définition de SOAP
le client s'adresse au serveur en envoyant une enveloppe SOAP
comme ça

Code:

<?xml version="1.0" encoding="UTF-8"?>
<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/" xmlns:fast="urn:com.orange-ftgroup.rdvb">
    <SOAP-ENV:Body>
        <fast:RendezVous.save xmlns:fast="urn:com.orange-ftgroup.rdvboutique">
            <rendezVous xsi:type="fast:rendezvous">
            <rdv_id xsi:nil="true" xsi:type="xsd:integer"/>
            <rdv_envoi_confirm xsi:type="xsd:boolean">false</rdv_envoi_confirm>
            <rdv_cli_nom xsi:type="xsd:string">Dubois</rdv_cli_nom>
            <rdv_cli_prenom xsi:type="xsd:string">Patrick</rdv_cli_prenom>
            <rdv_cli_email xsi:type="xsd:string">p.dubois@moineau.paris</rdv_cli_email>
            <evn_begin_dt xsi:type="xsd:date">2007-10-11</evn_begin_dt>
            <evn_begin_hr xsi:type="xsd:time">11:00</evn_begin_hr>
            <evn_end_dt xsi:type="xsd:date">2007-10-11</evn_begin_dt>
            <evn_end_hr xsi:type="xsd:time">12:00</evn_begin_hr>
            </rendezVous>
            <method xsi:type="xsd:string">update</method>
        </fast:RendezVous.save>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

il peu utiliser divers protocoles pour transporter son message tout protocole est acceptable
dans ton cas c'est http ou https

à la réception le serveur parse ce paquet XML et vérifie qu'il est conforme à la norme SOAP
si le service est associé à un descripteur (WSDN) le parser va de plus s'assurer que le messages est conforme à cette description.
une fois cette étape passé le serveur va extraire la fonction à invoquer dans cet exemple RendezVous.save soit donc la méthode save de la classe RendezVous
Il instance la classe et invoque la méthode. la valeur retourné par la méthode est récupéré par le serveur SOAP qui l'encode en fonction du WSDL s'il y a lieu ou en XML simple sinon
il place le paquet xml dans une enveloppe SOAP de réponse et le retourne par le même biais.

Code:

<?xml version="1.0" encoding="UTF-8"?>
<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/" xmlns:fast="urn:com.orange-ftgroup.rdvboutique">
    <SOAP-ENV:Body>
        <result xsi:type="fast:sampleSaveResponse">
            <response xsi:type="fast:saveResponse">
                <save xsi:type="xsd:integer">1</save>
                <messages xsi:type="fast:message">
                    <label xsi:type="xsd:string">enregistrement &eacute;fectu&eacute;</label>
                    <type xsi:type="xsd:string">OK</type>
                </messages>
            </response>
        </result>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

si tu utilise la lib SOAP de php5 en mettant en place un SOAP serveur avec tu dois lui fournir une classe qui  contient tout le code de ton service I.E. tous les fonctions
toutes les méthodes doivent être connues avant la lecture du message SOAP de plus tu ne peux pas utiliser comme dans l'exemple ci dessus la syntaxe classe.methode ce ne sont QUE des nom de fonctions.

le serveur SOAP va alors invoquer la fonction demandée et faire pour tout tout le processus ci dessus c'est simple à mettre en œuvre mais contraignant
surtout si ton serveur offre beaucoup de services sur le même point d'entrée.

l'autre solution est d'utiliser la lib pour dérouler dans ton propre code le mécanisme.
bref tu mets en place une insatnce du Zend_Framework avec action et tout le tralala
tu écrit un requester qui va utiliser la lib SOAP pour ouvrir l'enveloppe et déterminer l'action et le contrôleur à invoquer (RendezVous save) et placer dans les data reçu du client le contenu du message puis tu donne la main à ZF qui travaille normalement

la seul chose ton action ne doit pas générer de vue
une fois l'action exécuté tu récupère les données qu'elle à placé dans $this->view et tu utilise SOAP pour les mettre dans une enveloppe et les envoyer au client.
il te faut aussi trapper toutes les erreurs de ton serveur pour les encapsuler dans un message d'erreur SOAP sinon ton client risque de faire un fatal error.

l'avantage est que ton serveur n'a pas à charger toutes les classes et toutes les fonction du service avant de démarrer puisque tu utilise le dispatcher de ZF de plus un service n'est rien d'autre qu'une action sans vue

et enfin une fois que tu as mis en place ce système tu peux l'utiliser partout car c'est toujours le même. tu n'a pas une ligne de code à changer dans la couche service pour ajouter un service à ton appli tu colle simplement une action dans un contrôller.

un inconvénient de cette approche tu ne peux pas générer automatiquement le wsdl
mais de toute façon même en utilisant SAOP Server de la lib ça ne fonctionne pas automatiquement lorsque tes type de données sont complexe

A+JYT

Hors ligne

 

#11 26-03-2008 14:43:14

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

Merci beaucoup à tous, j'ai enfin réussi à me creer un petit truc avec Soap (pas nusoap)

Par contre la génération auto de wsdl ne marche pas , apparement il me manque Zend_Soap_AutoDiscover hmm

Si je la charge à la main j'ai un truc vraiment bizarre :

Code:

title ?>
message): ?>

The following error occurred:
message ?>

Si je me fous Zend_Loader::registerAutoload(), j'ai simplement "Class 'Zend_Soap_AutoDiscover' not found" lors de l'instanciation de la classe.

Quelqu'un a une idée?

Hors ligne

 

#12 26-03-2008 14:43:34

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

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

sebondus , je viens de t'envoyer une petite appli d'exemple avec serveur et client.

Hors ligne

 

#13 26-03-2008 14:45:38

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

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

le zend autodiscover ne sert qu'a generer le wsdl dynamiquement, dans l'exmple que je t'ai envoyer le wsdl est "statique" (un fichier) donc il n'y a pas de zend_autodiscover.
Pour info le zend_autodiscover ne fonctionne pas bien avec les types complexe.

Hors ligne

 

#14 26-03-2008 14:52:59

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

ichevc02 a écrit:

sebondus , je viens de t'envoyer une petite appli d'exemple avec serveur et client.

Merci beaucoup c'est super sympa de ta part wink

Hors ligne

 

#15 26-03-2008 14:54:00

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

ichevc02 a écrit:

le zend autodiscover ne sert qu'a generer le wsdl dynamiquement, dans l'exmple que je t'ai envoyer le wsdl est "statique" (un fichier) donc il n'y a pas de zend_autodiscover.
Pour info le zend_autodiscover ne fonctionne pas bien avec les types complexe.

J'ai bien compris, conscient que cela ne marchera pas avec les types complexes, mais je voulais tester sur des cas simples ...

Hors ligne

 

#16 26-03-2008 14:59:39

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

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

ok,
si tu as :

j'ai simplement "Class 'Zend_Soap_AutoDiscover' not found" lors de l'instanciation de la classe.

c'est surement que tu n'a pas recuperer le package dans l'incubateur. (Zend_Soap) ne fais pas partie encore du core.

tu peux recuperer l'incubateur via un client svn ici : http://framework.zend.com/svn/framework/trunk/incubator

Dernière modification par ichevc02 (26-03-2008 15:00:30)

Hors ligne

 

#17 16-06-2008 12:35:28

souma85
Nouveau membre
Date d'inscription: 29-05-2008
Messages: 1

Re: [NUSOAP]Quelqu'un aurait utilisé nusoap sous le zend framework???

salut
j'ai developpé une application en php et je voullais la tranforme en un web service
j'utilise nusoap mais je ne trouve pas ou je doit placer le fichier nusoap j'ai deja fait la soap_serveur et voile les erreures que je rencontré:

Warning: main(nusoap.php): failed to open stream: No such file or directory in c:\wamp\www\test\seif.php on line 6

Fatal error: main(): Failed opening required 'nusoap.php' (include_path='.;C:/Program Files/EasyPHP1-8\php\pear\') in c:\wamp\www\test\seif.php on line 6

svp qui peut m'aider pour finir mon projet c'est tres urgent mon email est t.hadda@yahoo.fr
merci bien

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