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

Commentaires