Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-05-2010 17:14:03

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

[SOAP] Class comme argument

Bonjour à tous,

Ce n'est pas vraiment un problème Zend Framework mais je me permet quand même cool

Je dois travailler avec un serveur SOAP sous java.  Seul bémol, selon la doc, il attend une class en tant que paramètre...

Je ne suis pas DU TOUT familier avec java, j'ai repompé des bout de code par ci par là pour faire ce que je voulais à l'arrache (entendre j'exécute un jar avec un exec() en php roll) mais bon, c'est pas super propre, et j'ai du mal à vouloir faire ce que je veux...

Est-ce que quelqu'un à déjà rencontré un cas pareil et si oui, comment s'en sortir ??

Merci,


Asfa


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#2 25-05-2010 17:40:30

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [SOAP] Class comme argument

J'étoffe un peu plus mon problème, car après relecture ce n'est pas très clair...

Donc dans la doc du webservice, j'ai des fonctions qui attendent des instances de classes  en tant que paramètres... Et ça je ne vois pas du tout comment le gérer...

En pratique ça donne, j'ai la fonction createhouse(id, regionId, address, phone) et dans la doc:
id, type: long
regionId, type: long
address, type: Address
phone, type: String

Le type address faisant bien entendu référence à la classe du même nom...

Je crée donc ma class comme ceci:

Code:

class Address
{
  public $street;
  public $houseNumber;
  public $apartmentNumber;
  public $postalCode;
  public $city;
  public $state;
  public $country;
}

J'ai également essayé le tout en protected avec setter et getter qui vont bien ainsi que "__set" et "__get" mais sans résultat...

Si je passe une instance de cette classe en parametre, j'ai une grosse erreur me disant que la class n'a pas la fonction magique __toString(). Alors moi je veux bien la faire, mais en la formatant comment ?

J'ai essayé avec le client SoapClient, nuSoap et bien évidemment Zend_Soap sans résultat...

PS: Ceci n'est pas un up déguisé tongue


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#3 25-05-2010 17:59:45

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [SOAP] Class comme argument

Tu peux me confirmer que j'ai bien compris le problème ?
Ton webservice est codé en java et tu veux veux l'interroger avec un code PHP ?

Est-ce que tu as un WSDL de ton webservice ? (c'est un fichier qui décrit l'interface de ton webservice)

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#4 25-05-2010 18:29:32

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [SOAP] Class comme argument

Tu as tout compris.

Oui j'ai bien accès au WSDL sur le serveur


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#5 25-05-2010 18:32:53

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [SOAP] Class comme argument

voici la partie WSDL concernant la fameuse partie Address

Code:

<complexType name="Address">
−
<sequence>
<element name="apartmentNumber" nillable="true" type="soapenc:string"/>
<element name="city" nillable="true" type="soapenc:string"/>
<element name="country" nillable="true" type="soapenc:string"/>
<element name="houseNumber" nillable="true" type="soapenc:string"/>
<element name="postalCode" type="xsd:int"/>
<element name="state" nillable="true" type="soapenc:string"/>
<element name="street" nillable="true" type="soapenc:string"/>
</sequence>
</complexType>

une sequence, c'est un array ?  J'avoue ne pas m'y connaitre plus que ça en WSDL

Dernière modification par Asfaloth (25-05-2010 18:33:58)


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#6 25-05-2010 21:03:20

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

Re: [SOAP] Class comme argument

ce n'est pas WSDL mais XSD

XSD permet de définir des structure de donnée XML
il existe des simpleType comme string number Boolean etc. et des type complexe.
on peut définir ses propres type simple comme par exemple Nom et prénom ou telephone

pour les type complexe on définit un type qui contient des données structurées.
le contenu d'un complexType est généralement une séquence d'éléments de type simple ou complexe.

mais ce peut être un choix entre divers éléments (choise), tout, (all), n'importe quoi (any), ou une séquence (sequence). chaque éléments chaque élément de ses groupe peuvent être des groupes.
on peut donc avoir par exemple un type complexe fait d'une séquence de champs dont les trois premier on toujours la même définition et les suivant étant un choix parmi plusieurs séquences

choise est donc le choix entre plusieurs éléments
all signifie que tous les éléments doivent être présent quelque soit leur ordre
séquence que les éléments doivent être présent dans l'ordre.
Any que ça contient n'importe quoi.

par exemple on peut dire qu'un destinataire est fait d'un nom un prénom et soit un numéro de rue un nom de rue un code postal un nom de ville et un nom de pays soit un nom de ville un nom de rue un numéro de rue un code zip un nom d'état et un nom de pays
on a donc une séquence composé de deux champs et un choix lui même constitué de séquence.

et c'est tout WSDL encapsule XSD il n'y a aucune notion de classe ou de quoi que ce soit d'autre.

un complexeType fait d'une sequence contenant des élément simples ou complexe uniquement fait de séquence peut effectivement être mappé sur une (des classes)
si un complexeType contient Any choise ou all alors il n'est pas possible de définir une classe à géométrie variable (enfin en php on peut s'en approcher)
mais typiquement une structure XSD ne définit que ça une structure de donnée et la façon la plus simple pour la représenter est un HTable ou en php un tableau associatif.

pour ton exemple Address tu peux définir une classe mais SOAP lui ne définit pas de mapping XSD class donc il n'a pas les moyen d'instencier ta classse. c'est généralement le framwork qui permet de définir ce Mapping
en php tu vas récupérer un tableau associatif $data
pour obtenir un objet de ta classe Adress il te suffit de faire

Code:

$obj = (Address)$data;

c'est rare qu'on ait besoin d'instancier ainsi les donnée reçue. en général on le passe en argument à diverses méthodes comme des méthode de vérification et des méthodes métier.

pense qu'il te faut aussi traiter tes données pour sécuriser ton serveur et éviter le injection de code.

A+JYT

Hors ligne

 

#7 26-05-2010 09:33:56

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [SOAP] Class comme argument

Comme toujours sekaijin est un puit de science smile

Merci pour ces infos concernant XSD, il va me falloir un petit temps pour ingurgiter tout ça mais c'est foutrement interressant big_smile  notamment les choix d'élément.

Donc je passe aux questions:

 

sekaijin a écrit:

pour ton exemple Address tu peux définir une classe mais SOAP lui ne définit pas de mapping XSD class donc il n'a pas les moyen d'instencier ta classse. c'est généralement le framwork qui permet de définir ce Mapping
en php tu vas récupérer un tableau associatif $data
pour obtenir un objet de ta classe Adress il te suffit de faire

Code:

$obj = (Address)$data;

En fait j'ai du mal à saisir ton bout de code, j'instancie ma classe, la remplis avec les valeurs et ensuite je la récupère comme tu le notes ?   Et après je passe la variable $obj comme paramètre de la fonction SOAP que je veux utiliser ?

Maintenant, je parle de classe mais si tu me dis que cela correspond à un array associatif, pour moi c'est bon, je n'ai pas besoin de plus.  Je vai déjà tester comme ça...

 

sekaijin a écrit:

c'est rare qu'on ait besoin d'instancier ainsi les donnée reçue. en général on le passe en argument à diverses méthodes comme des méthode de vérification et des méthodes métier.
pense qu'il te faut aussi traiter tes données pour sécuriser ton serveur et éviter le injection de code.

Ce n'est pas mon serveur justement, c'est un serveur fournis par une autre société avec lequel je dois m'interfacer.  Et comme l'intégralité de mon système est en php, ça me faisais râler d'avoir un montage en java que je ne peux exploiter qu'a moitié, voir pas du tout vu mes actuelles maigre connaissance dans ce langage.


Merci encore pour vos réponses en tout cas

EDIT:

Victoire !!  Ça fonctionne :-D  Bon j'ai des exceptions levée mais ça c'est juste une question de mettre les bonnes infos aux bons endroit :-)

Par contre, j'en profite pour poser encore une petite question, dans mon WSDL, j'ai 4 fonctions avec le même nom, et pas le même nombre d'argument, car il a des fonctions /* deprecated */ et avec mon bol, par défaut j'essaye d'utiliser la plus vieille...

Il y a un moyen de spécifier la fonction que l'on veut utiliser autrement que par son nom ?


Merci encore

Dernière modification par Asfaloth (26-05-2010 13:01:48)


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#8 26-05-2010 14:25:12

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

Re: [SOAP] Class comme argument

Code:

$obj = (Address)$data;

je donnais cet exemple dans le cas où tu est dans un contrôleur du serveur et que tu code un service tu reçois du client via SOA un array et tu en fais un objet de ta classe

côté client lorsque tu passe un paramètre pour php une classe ou un array c'est kifkif

perso j'utilise des array
A+JYT
PS : http://xmlfr.org/w3c/TR/xmlschema-1/
http://www.yoyodesign.org/doc/w3c/wsdl20/
http://www.yoyodesign.org/doc/w3c/wsdl20-adjuncts/

Dernière modification par sekaijin (26-05-2010 14:28:29)

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