Rss Feed

Exposer ses services avec BlazeDS et Axis2 grâce à Spring

Si l’intérêt d’utiliser BlazeDS pour faire communiquer une application Flex avec des services distants n’est plus à prouver, il en résulte souvent un manque d’interopérabilité des services.

Dans le cas d’une application qui pourrait avoir des interfaces multiples (web, ajax, swing etc …) il est alors préférable d’utiliser des services de type SOAP ou REST. On peut par exemple imaginer une application Air et une application pour iPhone développée en Cocoa qui accèdent au même applicatif serveur et qui partagent la même session hibernate. Une solution simple serait alors de dupliquer les classes de services, mais cela engendrera par exemple la duplication de la connexion à la base de donnée. L’utilisation de Spring peut alors grandement nous faciliter la tâche, en effet il est possible de partager un contexte entre servlet et donc de n’accéder qu’à une seule instance que ce soit par Axis2 ou BlazeDS.
[Lire la suite...]

Magento e-commerce : Flash, Flex et AIR

magento_flex_matsiya.png

Si inclure une animation flash dans magento est relativement simple, la faire communiquer avec les services existants l’est nettement moins. En effet magento fournit une API basée sur le prorocol SOAP peu respectueuse des conventions et Flex/Flash n’aime pas ça …. Nous avons donc du modifier le SDK de flex afin de pouvoir utiliser simplement les services disponibles. Bien qu’il soit possible d’en créer des nouveaux, ces services sont mal adaptés à une interface de type RIA et les taux de transfert sont très faibles.

Nous avons donc décidé de prendre la voie de l’AMF, bien plus rapide et permettant le chargement de plus gros volumes de données. Magento étant basé sur Zend framework , nous avons utilisé Zend AMF présent dans la version 1.7 (possibilité de l’inclure dans des versions antérieures) et après quelques modifications de Zend AMF, nous avons réussi à exposer la totalité des méthodes de l’API existante en AMF. Il reste quelques points à régler (gestion des droits ACL de zend par exemple) pour fournir un framework installable et utilisable en quelques clicks mais il est déjà possible de développer des modules Flash/Flex pour l’administration ou pour le catalogue de vos sites e-commerce Magento.

SOAP Rails+Flex et objets typés

Ruby on Rails permet de construire des webservices SOAP en quelques lignes. Mais ruby étant un langage dynamique, il faudra alors définir les types manuellement pour les entrées et les sorties. Côté flex pas de problème pour récupérer les types simples comme String , interger, datetime etc … Mais comment récupérer un objet plus complexe ?

Dans le post précédent on a introduit SchemaTypeRegistry qui permet de récupérer des objets personnalisés côté Flex; aucun problème pour des services écrits en java ou c#, ces langages n’étant pas dynamiques les objets seront bien définis dans le wsdl et Flex les comprendra sans problème. En revanche imaginons que l’on ait un model User en ruby qui pointe vers la table users. En retournant cet objet dans le SOAP flex sera incapable de le comprendre , aucune de ses proriétées n’étant explicitement définies.

Il existe pourtant une solution à ce problème : ActionWebService::Struct. En définissant un model héritant de cette class on va pouvoir construire un « emballage » de notre model de base et y définir ses propriétés. Exemple pour un model User :

On définit le model UserStruct < ActionWebService::Struct et on y ajoute les propriétés :

class UserStruct

member :name, :string
member :pass, :string

end

et dans notre class d’api on spécifie le retour comme :

:returns => [{:answer => UserStruct}]

Ruby étant totalement dynamique on peut directement renvoyer un objet User dans le controller, celui-ci sera automatiquement transormé en UserStruct. Exemple d’une méthode dans le controller :

def getUser(id)

User.find(id)

end

L’objet reçu sera alors de type userstruct (en minuscules dans le xml) et contiendra toutes les valeurs de User pour peu qu’elles aient été bien définies.
Enfin pour plus de lisibilité rien n’empêche de nommer son objet ‘User’ aussi côté flex et de spécifier le changement de nom dans SchemaTypeRegistry (voir post précédent).

SOAP+Flex => SchemaTypeRegistry

Une nouveauté de Flex 3 qui est passé inaperçue c’est la possibilité de recevoir des objets fortement typés depuis un service SOAP comme on pourrait le faire via le protocole AMF. Tout se fait dans la class singleton SchemaTypeRegistry. Il suffit de lui fournir le nom de l’objet reçu , son namespace dans l’enveloppe SOAP et la class de destination. Un petit exemple vaut mieux qu’un long discours : Imaginons que l’on veuille maper un objet user ayant pour namespace « http://www.matsiya.fr/user » vers une class User il suffira d’ajouter dans l’application (le mapping concernera alors tous les services) :

SchemaTypeRegistry.getInstance().registerClass(new QName("http://www.matsiya.fr/user", "user"), User);

Il est aussi tout à fait possible de définir le SchemaTypeRegistry pour une opération donnée en le spécifiant au XMLDecoder :

var sr:SchemaTypeRegistry = new SchemaTypeRegistry(); sr.registerClass(new QName("http://www.mastiya.fr/user", "user"), User);op.decoder.typeRegistry = sr; //op étant notre opérationEtrange qu’adobe ne communique pas plus à ce sujet, la doc est quasi inexistante pour cette fonctionnalité et surtout tout ce qui touche au XMLDecoder. Malheureusement cette technique n’est utilisable que pour les services de type SOAP, à ma connaissance il n’est pas possible de forcer le décodage d’un XML externe ou résultant d’un service REST via le XMLDecoder.