Typage fort d’objet SOAP avec Flex 3

le 19 mai 2008 par Mickael Ruellan

Suite au post de Matsiya sur l’utilisation du SchemaTypeRegistry afin de permettre la “conversion” des objets SOAP issus d’un Web service en Classes AS3, je me suis lancé à quelques expérimentations. L’utilisation est en effet très simple et permet un mappage des Objets SOAP de type ComplexType vers les classes objets AS3 de son choix, juste en indiquant son namespace et le nom de l’objet tel qu’il est décrit dans le fichier WSDL du Web service.

Prenons un exemple : Imaginons qu’un Web service nous renvoie une liste d’utilisateur et qu’on veuille récupérer cette liste dans une classe nommée “UserArray” qui est en fait un tableau d’objets de type “User”. Il nous suffira de déclarer l’association avant l’appel du Web service en faisant :

SchemaTypeRegistry.getInstance().registerClass(new QName(”http://www.flex-info.fr/”, “userArray”), UserArray);
SchemaTypeRegistry.getInstance().registerClass(new QName(”http://www.flex-info.fr/”, “user”), User);

Le resultat retourné par le ResultEvent contient alors une classe UserArray contenant des classes User.

L’image ci-dessous illustre le procédé :

SchemaTypeRegistry

Comme le souligne Matsiya, dommage qu’il n’y ait pas plus de communication sur cet aspect du mapping des données entre des Web service SOAP et Flex (Flex 3 uniquement !). En espérant que ce post y participe…

Mise à jour : Afin d’être plus complet, les classes objets en AS3 doivent être écrites avec au minimum leurs propriétés comme de simples objet et peuvent contenir des fonctions propres au objets. Exemple de la classe User :

package {
public class User
{
public var IDUSER:Number;
public var login:String;
public var mail:String;
public var name:String;
public var password:String;
}
}

La classe UserArray dans l’exemple est en fait une extension de la classe ArrayCollection, mais n’est pas nécessaire si un simple ArrayCollection est suffisant.

A quand un système de mapping et de synchronisation des classes Java, PHP ou autre vers des classes AS3 ?? Il ne manque plus que ça… non ?

Ajout : il semblerait que le mapping ne fonctionne pas bien avec des Web services de type “document/litteral” générés par Axis 1. Le passage en “RPC/encoded” résout le problème…

Si vous venez pour la première fois sur Flex-Info.fr, vous pouvez vous abonner à mon Twitter http://twitter.com/flexinfo ou au flux RSS. Merci pour votre visite !

1 étoile2 étoiles3 étoiles4 étoiles5 étoiles (2 votes, 2,50 sur 5)
Loading ... Loading ...

5 Commentaires de cet article

  1. realmadyo Says:

    Bonjour,

    serait-il possible de compléter ton exemple en mettant à disposition ton projet flex ? j’aimerais en effet savoir ce que l’on doit faire dans le détail, doit on implémenter une classe du type de userArray car il faut bien déclarer ton userArray et donc qu’il est un type … (et du coup comment doit on écrire cette classe).

    Merci pour ton aide.

  2. Romain Says:

    Bonjour,
    merci pour cet article qui met en évidence un fonctionnement trop peu documenté et très pratique. Néanmoins, comme tu le fais remarquer dans ta mise à jour, il est nécessaire de déclarer toutes les variables dans la classe objet. Et empêche donc toute classe de type “dynamic”.
    Dans ton exemple tu remplis la classe UserArray, cet objet peut il être envoyé tel quel a une méthode soap (qui aurait bien sûr comme paramètre le complexType userArray ?)
    Afin d’avoir une réelle impression de sychronisation de données ?
    Merci de ta réponse.

  3. Mickael Ruellan Says:

    Bonjour Romain,

    Tu as raison de le préciser, les objets AS3 créés peuvent effectivement être envoyés tel quel au Web Service si leur type correspond au type attendu, qu’il s’agisse d’un simple objet ou d’un tableau d’objet complexes.
    D’une manière générale, il suffit d’envoyer un objet possédant au moins les propriétés attendues par le Web service pour que cet objet soit encodé dans le type correspondant.

  4. Julien Says:

    Bonjour, j’utilise actuellement les web services après avoir utilisé les Remote Objects, et malheureusement je n’obtiens pas une aussi bonne qualité de mapping. En effet après avoir utilisé votre méthode je récupère bien des objets du type souhaités mais les champs reste à null. Après vérification du flux en E4X, les données sont transférées mais pas mappés. Cela vient-il du web services ou biens d’autre chose.
    Merci

  5. Mickael Ruellan Says:

    Après avoir cherché avec Julien, le mapping ne se fait pas correctement avec des Web services générés par Axis 1 en “document/literal”. Voir l’ajout en fin d’article…

Rédiger un commentaire

Subscriptions

Sondage

Préférez-vous travailler avec l'ancien Flex Builder ou le nouveau Flash Builder ?

  • Flex Builder (50,0%, 8 Votes)
  • Flash Builder (31,0%, 5 Votes)
  • Aucun des 2 ! (19,0%, 3 Votes)

Nombre de votants: 16

Loading ... Loading ...

Twitter

Mugsho