Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Ce n'est pas vraiment un problème Zend Framework mais je me permet quand même
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 ) 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
Hors ligne
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:
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é
Hors ligne
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
Hors ligne
Tu as tout compris.
Oui j'ai bien accès au WSDL sur le serveur
Hors ligne
voici la partie WSDL concernant la fameuse partie Address
<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)
Hors ligne
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
$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
Comme toujours sekaijin est un puit de science
Merci pour ces infos concernant XSD, il va me falloir un petit temps pour ingurgiter tout ça mais c'est foutrement interressant 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 faireCode:
$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)
Hors ligne
$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