ADOBE FLEX 4
Accs aux donnes avec Adobe Flex 4. Adobe, the Adobe logo, ActionScript, Adobe AIR, ColdFusion, Dreamweaver, Flash, Flash Player, Flash Builder, Flex, Flex Builder, and LiveCycle are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Apple, Macintosh, and Mac OS are trademarks of Apple Inc., registered in the United States and other countries. Java is a trademarks or registered trademark of Sun Microsystems, Inc. in the United States and other countries. Linux is the registered trademark of Linus Torvalds in the U.S. and other countries. All other trademarks are the property of their respective owners. This Work is licensed under the Creative Commons Attribution Non-Commercial 3.0 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA.
iii
Sommaire
Chapitre 1 : Prsentation de laccs aux services de donnes Accs aux donnes dans Flex compar dautres technologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Utilisation de Flash Builder pour accder aux services de donnes Composants daccs aux donnes ...................................................... 3 ..................................................................................... 5
Chapitre 2 : Cration dapplications centres sur les donnes avec Flash Builder Cration dun projet Flex pour laccs des services de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Connexion des services de donnes Installation de Zend Framework Gnration de lapplication client Test des oprations de service .................................................................................. 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Configuration des types de donnes pour les oprations de service de donnes Gestion de laccs aux donnes partir du serveur
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Chapitre 3 : Implmentation de services pour des applications centres sur les donnes AMF (Action Message Format) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Dfinition de type ct client et ct serveur Implmentation de services ColdFusion Implmentation de services PHP Dbogage de services distants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Chapitre 4 : Accs aux donnes ct serveur Utilisation de composants HTTPService . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Utilisation de composants WebService Utilisation de composants RemoteObject Traitement des rsultats des services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Comparons cet exemple Flex lexemple suivant, dans lequel du code JSP est utilis pour appeler un service Web avec une balise personnalise JSP. Lorsquun utilisateur demande le code JSP, la demande du service Web est effectue sur le serveur et non pas sur le client. Le rsultat est utilis pour gnrer du contenu dans la page HTML. Le serveur dapplication regnre la page HTML entire avant de la renvoyer au navigateur Web de lutilisateur.
<%@ taglib prefix="web" uri="webservicetag" %> <% String str1="BRL"; String str2="USD";%> <!-- Call the web service. --> <web:invoke url="http://www.itfinity.net:8008/soap/exrates/default.asp" namespace="http://www.itfinity.net/soap/exrates/exrates.xsd" operation="GetRate" resulttype="double" result="myresult"> <web:param name="fromCurr" value="<%=str1%>"/> <web:param name="ToCurr" value="<%=str2%>"/> </web:invoke> <!-- Display the web service result. --> <%= pageContext.getAttribute("myresult") %>
Une fonctionnalit similaire est obtenue dans Flex en ayant recours un service HTTPService, un service Web ou un composant RemoteObject afin dappeler un objet ct serveur qui renvoie les rsultats dune source de donnes.
Les donnes renvoyes par un appel de service sont stockes dans une proprit CallResponder associe lappel de service. Les composants de linterface utilisateur font alors appel la liaison de donnes pour extraire de la proprit CallResponder les donnes renvoyes. La liaison de donnes dans Flex vous permet de mettre jour dynamiquement un composant de linterface utilisateur avec une source de donnes. Par exemple, un composant Flex peut associer son attribut text lattribut lastResult dune proprit CallResponder. En cas de modification des donnes de CallResponder, le composant Flex est automatiquement mis jour. Flex implmente galement la liaison de donnes bidirectionnelle qui garantit la mise jour automatique dun composant Flex ou dune source de donnes dont les donnes sont modifies. Un autre avantage de la liaison de donnes bidirectionnelle rside dans la mise jour de donnes distantes partir des saisies effectues par un utilisateur dans un composant Form ou dans un composant de donnes Flex.
Voir aussi
Cration dapplications centres sur les donnes avec Flash Builder la page 8
Accs aux services de donnes Configuration des donnes renvoyes par le service de donnes Assistance pour la pagination des donnes renvoyes par le service Assistance pour la fonctionnalit de gestion des donnes qui synchronise plusieurs mises jour des donnes du
serveur
Gnration de code client pour laccs aux services de donnes Liaison des donnes renvoyes par le service aux composants de linterface utilisateur
linterface utilisateur. Connexion au service distant Si vous commencez par vous connecter au service distant, vous devez ensuite construire linterface utilisateur. Construction de linterface utilisateur Si vous commencez par construire linterface utilisateur, vous devez ensuite vous connecter au service distant. Remarque : la premire action effectue relve dun choix personnel. Par exemple, si la conception dune interface utilisateur est dj prvue, vous pouvez commencer par construire linterface utilisateur. A linverse, vous pouvez commencer par vous connecter aux donnes et laisser Flash Builder vous aider gnrer les composants dapplication.
Flash Builder vous assiste de diverses manires pour lier les oprations de donnes des composants dapplications. Dans Flash Builder, procdez comme suit :
Gnrez diffrents formulaires pour les donnes renvoyes par les oprations de service. Slectionnez les oprations de service que vous souhaitez lier aux composants de linterface utilisateur. Gnrez un formulaire pour reprsenter les donnes complexes renvoyes par un service.
3 (Facultatif) Grez lextraction et la mise jour des donnes.
Les outils Flash Builder vous permettent dimplmenter la pagination des donnes renvoyes et de coordonner la mise jour des jeux de donnes. Lors du retour de gros volumes denregistrements de donnes, vous implmentez gnralement la pagination pour extraire un jeu denregistrements selon vos besoins. Pour les applications mettant jour plusieurs enregistrements, vous pouvez implmenter des fonctions de gestion de donnes. Les fonctions de la gestion des donnes sont parmi dautres :
Fonction de validation pour la mise jour simultane des enregistrements modifis Mcanisme dannulation des modifications avant leur criture sur le serveur Gnration de code pour la mise jour automatique des composants dinterface utilisateur au fur et mesure
que des enregistrements sont ajouts, supprims ou modifis
4 Excutez lapplication et surveillez le flux de donnes.
Une fois lapplication termine, excutez-la pour en observer le fonctionnement. Utilisez le Moniteur de rseau Flash Builder pour afficher les donnes transmises entre lapplication et le service. Le Moniteur de rseau est utile pour diagnostiquer les erreurs et analyser les performances. Flash Builder fournit galement des environnements robustes de dbogage et de dfinition de profil. Le Moniteur de rseau et le profileur Flash sont disponibles avec Flash Builder Premium.
Voir aussi
Cration dapplications centres sur les donnes avec Flash Builder la page 8
Services PHP Services ColdFusion BlazeDS Services LiveCycle Data Services Services HTTP (de style REST) Services Web (SOAP) Fichiers XML statiques
Si vous avez besoin dune prise en charge doutils pour dautres types de services (Ruby on Rails, par exemple), vous pouvez dvelopper limplmentation Flash Builder. Voir Rfrence dextensibilit Flash Builder.
Services dobjets distants (RemoteObject) Services Web (WebServices) Services HTTP (HTTPService)
Adobe Flash Builder fournit des assistants et des outils permettant denvelopper limplmentation dun composant daccs aux donnes dans une enveloppe de service. Lenveloppe de service encapsule la fonctionnalit du composant daccs aux donnes, rendant invisible une grande partie de limplmentation de niveau infrieur et vous permettant ainsi de vous concentrer sur limplmentation de services et la gnration dapplications client pour accder ces services. Pour plus dinformations sur lutilisation de Flash Builder pour accder aux services de donnes, voir Cration dapplications centres sur les donnes avec Flash Builder la page 8.
Composants HTTPService
Utilisez les composants HTTPService pour lenvoi de requtes HTTP GET ou POST et afin dinclure les donnes de rponses HTTP dans une application client. Si vous utilisez Flex pour crer des applications de bureau (excutes dans Adobe AIR), les requtes HTTP PUT et DELETE sont prises en charge. Si vous utilisez Adobe LiveCycle Data Services ou BlazeDS, vous pouvez faire appel un HTTPProxyService grce auquel vous pourrez utiliser des mthodes HTTP supplmentaires. Le service HTTPProxyService vous permet denvoyer des requtes GET, POST, HEAD, OPTIONS, PUT, TRACE ou DELETE. Un service HTTP peut consister en nimporte quel URI HTTP qui accepte des demandes HTTP et envoie des rponses. Un autre nom courant pour ce type de service est service Web de style REST. REST signifie REpresentational State Transfer, un style architectural pour les systmes hypermdia distribus.
Les composants HTTPService savrent utiles lorsque vous ne pouvez pas exposer la mme fonctionnalit en tant que service Web SOAP ou service dobjet distant. Vous pouvez par exemple utiliser des composants HTTPService pour interagir avec des pages JavaServer (JSP), des servlets et des pages ASP qui ne sont pas disponibles comme services Web ou destinations de service distant. Lorsque vous appelez la mthode send() de lobjet HTTPService, elle effectue une demande HTTP auprs de lURI spcifi et une rponse HTTP est renvoye. Si vous le souhaitez, vous pouvez transmettre des arguments lURI spcifi. Flash Builder fournit des flux de travaux qui vous permettent de vous connecter de manire interactive des services HTTP. Pour plus dinformations, voir Accs aux services HTTP la page 13.
Voir aussi
Accs aux services HTTP la page 13 Thse : Representational State Transfer (REST) par Roy Thomas Fielding
Composants WebService
Les composants WebService vous permettent daccder aux services Web SOAP (modules logiciels comportant des mthodes). Les mthodes de service Web sont aussi appeles oprations. Les interfaces de service Web sont dfinies laide du langage WSDL (Web Services Description Language). Les services Web fournissent aux modules logiciels excuts sur diffrentes plateformes une mthode conforme aux standards leur permettant dinteragir entre eux. Pour plus dinformations sur les services Web, voir la section relative aux services Web du site World Wide Web Consortium, www.w3.org/2002/ws/. Les applications client peuvent interagir avec des services Web qui dfinissent leurs interfaces dans un document WSDL, disponible en tant quURL. WSDL est un format standard permettant de dcrire les messages quun service Web comprend, le format des rponses de ce service ces messages, les protocoles que le service Web prend en charge et ladresse laquelle envoyer les messages. Flex prend en charge WSDL 1.1, dcrit ladresse www.w3.org/TR/wsdl, ainsi que les services Web cods RPC et littral document. Il prend galement en charge les demandes et les rsultats de service Web formats en tant que messages SOAP et transports via HTTP. SOAP fournit la dfinition du format XML que vous pouvez utiliser pour changer des informations structures et types entre un client de service Web (une application cre avec Flex, par exemple) et un service Web. Vous pouvez utiliser un composant WebService pour vous connecter un service Web SOAP lorsque les services Web constituent un standard tabli dans lenvironnement. Les composants WebService sont galement utiles pour les objets situs dans un environnement dentreprise mais qui ne sont pas ncessairement disponibles sur le chemin source de lapplication Web. Flash Builder fournit des flux de travaux qui vous permettent de vous connecter de manire interactive des services Web. Pour plus dinformations, voir Accs aux services Web la page 16.
Composants RemoteObject
Les services dobjets distants vous permettent daccder la logique commerciale directement dans son format natif au lieu de la formater en tant que XML, comme vous le faites avec les services Web ou de style REST. Vous conomisez ainsi le temps ncessaire pour exposer la logique existante au format XML. Un autre avantage des services dobjets distants rside dans la vitesse de communication travers le rseau. Les changes de donnes seffectuent encore via HTTP ou https, mais les donnes elles-mmes sont srialises dans une reprsentation binaire. Lutilisation de composants RemoteObject rduit le volume de donnes qui transitent sur le rseau, diminue la mmoire utilise ct client et acclre le traitement. ColdFusion, PHP, BlazeDS et Adobe LiveCycle Data Services peuvent utiliser une dfinition de type ct serveur lors de laccs des donnes du serveur. Lapplication client accde un objet Java, un composant ColdFusion (qui constitue un objet Java en interne) ou une classe PHP directement par linvocation distante dune mthode sur un objet dsign. Lobjet sur le serveur utilise ses propres types de donnes natifs en tant quarguments, interroge une base de donnes avec ces arguments, puis renvoie les valeurs dans leurs types de donnes natifs. Lorsque la dfinition de type ct serveur nest pas disponible, Flash Builder dispose doutils pour implmenter la dfinition de type ct client. Utilisez Flash Builder afin de configurer et de dfinir des types pour les donnes renvoyes du service. La dfinition de type ct client permet lapplication client dinterroger une base de donnes et dextraire des donnes correctement types. La dfinition de type ct client est requise pour un service qui ne dfinit pas le type de donnes renvoyes par le service. Flash Builder fournit des flux de travaux qui vous permettent de vous connecter de manire interactive des services dobjets distants. Pour plus dinformations, voir Connexion des services de donnes la page 9.
Chapitre 2 : Cration dapplications centres sur les donnes avec Flash Builder
Les outils Flash Builder peuvent vous aider crer des applications accdant des services de donnes. Commencez par crer un projet Flex pour vos applications. Vous pouvez ensuite tablir une connexion un service de donnes, configurer laccs aux donnes du service, puis crer une interface utilisateur pour une application. Dans certains cas, vous devez commencer par crer linterface utilisateur, puis accder au service de donnes.
Services ColdFusion Services PHP au format AMF BlazeDS LiveCycle Data Services
Pour plus dinformations sur lutilisation de lassistant LiveCycle Service Discovery, voir Utilisation de LiveCycle Discovery. Pour tout service auquel laccs seffectue par le biais dun objet distant, crez un projet Flex configur pour le type de serveur dapplication appropri. Lassistant de nouveau projet Flex vous guide au cours des tapes de configuration dun projet pour les types de serveurs dapplications rpertoris ci-dessous.
Type de serveur PHP ColdFusion Services dobjets distants pris en charge
Services PHP au format AMF ColdFusion Flash Remoting BlazeDS LiveCycle Data Services BlazeDS LiveCycle Data Services
J2EE
Vous pouvez vous connecter des services HTTP et Web partir de nimporte quel projet Flex, y compris les projets sans technologie de serveur spcifie. Un projet configur pour accder un objet distant peut accder uniquement un service dobjets distants pour lequel il est configur. Par exemple, vous ne pouvez pas accder un service PHP bas sur AMF partir dun projet configur pour ColdFusion. Cependant, vous pouvez vous connecter un service PHP partir dun tel projet si vous vous y connectez en tant que service Web ou HTTP.
Voir aussi
Prsentation de laccs aux services de donnes la page 1
Voir aussi
Cration dun projet Flex pour laccs des services de donnes la page 8
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez ColdFusion. Cliquez sur Suivant. 3 Dans la bote de dialogue Configuration du service ColdFusion, recherchez lemplacement du fichier CFC qui
implmente le service. Remarque : si vous navez pas implment de service ColdFusion, Flash Builder peut gnrer un exemple de service partir dun tableau de base de donnes simple. Utilisez lexemple gnr en guise dillustration de laccs aux services de donnes. Voir Gnration dun exemple de service ColdFusion partir dun tableau de base de donnes la page 10.
4 (Facultatif) Modifiez les dtails du service.
Nom du service Spcifiez un nom pour le service. Flash Builder gnre un nom pour le service, bas sur le nom du fichier du service. Les noms possibles pour un service sont soumis certaines restrictions. Voir Affectation de noms aux services de donnes la page 21. Package de services Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas le nom du service et le place dans un package de services. Package du type de donnes Spcifiez un nom pour le package contenant les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package valueObjects.
5 (Facultatif) Cliquez sur Suivant pour afficher les oprations de service. 6 Cliquez sur Terminer pour gnrer des fichiers ActionScript qui accdent au service.
Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits. Etape suivante : Configuration des types de donnes pour les oprations de service de donnes la page 28.
Gnration dun exemple de service ColdFusion partir dun tableau de base de donnes
Flash Builder peut gnrer un exemple de service ColdFusion que vous pouvez utiliser en tant que prototype pour vos propres services. Lexemple de service accde un tableau de base de donnes simple et dispose de mthodes de cration, de lecture, de mise jour et de suppression. Flash Builder configure les types de donnes de retour pour les services gnrs et active des fonctionnalits daccs aux donnes telles que la pagination ou la gestion de donnes. Important : utilisez le service gnr uniquement dans un environnement de dveloppement fiable. Le code gnr permet toute personne disposant dun accs rseau votre serveur daccder aux donnes du tableau de donnes et de les modifier ou supprimer. Avant de dployer ce service, assurez-vous daugmenter la protection et de restreindre laccs de faon adquate. Pour plus dinformations sur la rdaction de services scuriss, voir Securing Data Services.
La procdure suivante part du principe que vous avez cr un projet Flex pour accder aux services ColdFusion et disposez de sources de donnes ColdFusion.
1 Dans le menu Donnes de Flash Builder, slectionnez Connexion aux donnes/services pour ouvrir lassistant de
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez ColdFusion. Cliquez sur Suivant. 3 Dans la bote de dialogue Configuration du service ColdFusion, cliquez sur le lien afin de gnrer un exemple de
service.
4 Slectionnez loption Gnrer partir dune source de donnes RDS et indiquez une source de donnes et une table
ColdFusion. Si la table ne dfinit pas de cl primaire, slectionnez-en une. Remarque : en labsence de source de donnes ColdFusion disponible, slectionnez loption Gnrer partir dun modle. Flash Builder rdige un exemple de composant ColdFusion (CFC) avec des oprations de service courantes. Supprimez les marques de commentaires de certaines fonctions du CFC et modifiez les oprations pour crer un exemple de service que vous pourrez utiliser comme prototype.
5 Utilisez lemplacement par dfaut ou spcifiez-en un nouveau. Cliquez sur OK.
Flash Builder gnre lexemple de service. Modifiez le nom du service et les emplacements de package afin de remplacer les valeurs par dfaut.
6 (Facultatif) Cliquez sur Suivant pour afficher les oprations du service. 7 Cliquez sur Terminer.
Flash Builder gnre des fichiers ActionScript qui accdent lexemple de service. Il ouvre galement lexemple de service dans un diteur du systme enregistr pour ldition de fichiers ColdFusion CFC.
Voir aussi
Cration dun projet Flex pour laccs des services de donnes la page 8
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez PHP. Cliquez sur Suivant. 3 Dans la bote de dialogue Configuration du service PHP, recherchez le fichier PHP implmentant le service.
Remarque : si vous navez pas implment de service PHP, Flash Builder peut gnrer un exemple de service partir dun tableau de base de donnes simple. Utilisez lexemple gnr en guise dillustration de laccs aux services de donnes. Voir Gnration dun exemple de service PHP partir dun tableau de base de donnes la page 12.
4 (Facultatif) Modifiez les dtails du service.
Nom du service Spcifiez un nom pour le service. Flash Builder gnre un nom pour le service bas le nom du fichier du service. Les noms possibles pour un service sont soumis certaines restrictions. Voir Affectation de noms aux services de donnes la page 21. Package de services Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas sur le nom du service et le place dans un package services. Package du type de donnes Spcifiez un nom pour le package contenant les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package valueObjects.
Si vous ne disposez pas de la version prise en charge de Zend Framework pour laccs aux services PHP, Flash Builder vous invite en installer la version minimale. Voir Installation de Zend Framework la page 21.
6 Cliquez sur Terminer.
Flash Builder gnre des fichiers ActionScript qui accdent au service. Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits. Etape suivante : Configuration des types de donnes pour les oprations de service de donnes la page 28.
Gnration dun exemple de service PHP partir dun tableau de base de donnes
Flash Builder peut gnrer un exemple de service PHP que vous pouvez utiliser en tant que prototype pour vos propres services. Lexemple de service accde un tableau de base de donnes MySQL simple et dispose de mthodes de cration, de lecture, de mise jour et de suppression. Flash Builder configure les types de donnes de retour pour les services gnrs et active des fonctionnalits daccs aux donnes telles que la pagination ou la gestion de donnes. Important : utilisez le service gnr uniquement dans un environnement de dveloppement fiable. Le code gnr permet toute personne disposant dun accs rseau votre serveur daccder aux donnes du tableau de donnes et de les modifier ou supprimer. Avant de dployer ce service, assurez-vous daugmenter la protection et de restreindre laccs de faon adquate. Pour plus dinformations sur la rdaction de services scuriss, voir Securing Data Services. La procdure suivante part du principe que vous avez cr un projet Flex pour accder aux services PHP et disposez de sources de donnes MySQL.
1 Dans le menu Donnes de Flash Builder, slectionnez Connexion aux donnes/services pour ouvrir lassistant de
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez PHP. Cliquez sur Suivant. 3 Dans la bote de dialogue Configuration du service PHP, cliquez sur le lien afin de gnrer un exemple de service.
4 Slectionnez Gnrer partir dune base de donnes et spcifiez les informations de connexion la base de donnes.
Cliquez sur Connexion la base de donnes. Remarque : en labsence de source de donnes PHP disponible, slectionnez loption Gnrer partir dun modle. Flash Builder rdige un exemple de projet avec des oprations de service courantes. Supprimez les marques de commentaires de certaines zones du projet et modifiez les oprations pour crer un exemple de service que vous pourrez utiliser comme prototype.
5 Slectionnez un tableau dans la base de donnes et spcifiez la cl primaire. 6 Utilisez lemplacement par dfaut ou spcifiez-en un nouveau. Cliquez sur OK.
Si vous ne disposez pas de la version prise en charge de Zend Framework pour laccs aux services PHP, Flash Builder vous invite en installer la version minimale. Voir Installation de Zend Framework la page 21. Flash Builder gnre lexemple de service. Modifiez le nom du service et les emplacements de package afin de remplacer les valeurs par dfaut.
7 (Facultatif) Cliquez sur Suivant pour afficher les oprations du service. 8 Cliquez sur Terminer.
Flash Builder gnre des fichiers ActionScript qui accdent lexemple de service. Il ouvre galement lexemple de service dans un diteur du systme enregistr pour ldition de fichiers PHP.
Services RESTful
Flash Builder prend en charge laccs aux services RESTful qui utilisent des paramtres dlimits au lieu du paramtre de requte GET. Par exemple, supposons que vous utilisez lURL suivante pour accder un service RESTful :
http://restfulService/items/itemID
Utilisez des accolades ({}) pour spcifier les paramtres de lURL de lopration, comme lillustre lexemple suivant :
http://restfulService/{items}/{itemID}
Lorsque vous spcifiez des paramtres pour un service RESTful, Type de donnes et Type de paramtre sont toujours configurs en tant que String et URL respectivement. Remarque : vous pouvez associer des paramtres de service RESTful avec des paramtres de requte lors de la spcification de lURL vers une opration.
Vous ne pouvez pas ajouter de paramtres supplmentaires pour le type de contenu application/xml.
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez HTTP. Cliquez sur Suivant.
3 (Facultatif) Spcifiez une URL de base utiliser en tant que prfixe pour toutes les oprations. 4 Sous Oprations, spcifiez les lments suivants pour chaque opration laquelle vous souhaitez accder :
Nom de lopration
5 Spcifiez le nom et le type de donnes de chaque paramtre dopration de lURL slectionne. 6 (Facultatif) Cliquez sur Ajouter ou Supprimer pour ajouter ou supprimer des paramtres pour lopration
slectionne.
7 (Facultatif) Modifiez les dtails du service.
Nom du service Spcifiez un nom pour le service. Flash Builder gnre un nom pour le service, bas le nom du fichier du service. Les noms possibles pour un service sont soumis certaines restrictions. Voir Affectation de noms aux services de donnes la page 21. Package de services Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas sur le nom du service et le place dans un package services. Package du type de donnes Spcifiez un nom pour le package contenant les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package valueObjects.
8 (Facultatif) Modifiez le nom du package gnr pour le service. 9 Cliquez sur Terminer.
Flash Builder gnre des fichiers ActionScript qui accdent au service. Une fois la connexion au service HTTP tablie, configurez les types de retour des oprations de service. Lors de la configuration du type de retour, les types de paramtres de lopration sont galement configurs. Voir Configuration des types de donnes pour les oprations de service de donnes la page 28. Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits. Etape suivante : Configuration des types de donnes pour les oprations de service de donnes la page 28.
Le service utilise une mthode GET qui renvoie une rponse XML. Cette fonctionnalit est utile pour apprendre connatre les services HTTP dans Flex et pour tablir des prototypes de donnes fictives dans les applications client. Lors de laccs au service, spcifiez le nud renvoyant la rponse XML. Flash Builder utilise ce nud pour configurer automatiquement un type de retour pour les donnes. Une fois la connexion au service tablie, vous pouvez lier des oprations du service des composants dinterface utilisateur.
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, slectionnez XML. Cliquez sur Suivant. 3 Spcifiez Fichier local ou URL, puis accdez au fichier. 4 Slectionnez un nud dans le fichier contenant la rponse souhaite.
Indiquez si la rponse est un tableau Array. Flash Builder configure un type de retour pour le nud slectionn.
5 Modifiez les dtails du service.
Nom du service Spcifiez un nom pour le service. Flash Builder gnre un nom pour le service, bas le nom du fichier du service. Les noms possibles pour un service sont soumis certaines restrictions. Voir Affectation de noms aux services de donnes la page 21. Package de services Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas sur le nom du service et le place dans un package services. Package du type de donnes Spcifiez un nom pour le package contenant les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package valueObjects.
6 (Facultatif) Modifiez le nom du package gnr pour le service. 7 Cliquez sur Terminer.
Flash Builder gnre des fichiers ActionScript qui accdent au service. Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits.
Voir aussi
Using cross-domain policy files
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez Service Web (WSDL). Cliquez sur Suivant. 3 (LiveCycle Data Services/BlazeDS) Si vous avez install LiveCycle Data Services ou BlazeDS, vous pouvez accder
au service Web via un proxy. Slectionnez loption Par une destination proxy LCDS/BlazeDS. Spcifiez une destination. Cliquez sur Suivant et passez ltape 5. Remarque : loption daccs aux services Web via un proxy LiveCycle Data Services est active uniquement si le type de serveurs dapplications spcifi pour le projet Flex est J2EE.
4 Saisissez un URI pour le service SOAP. 5 (Facultatif) Modifiez les dtails du service.
Nom du service Spcifiez un nom pour le service. Flash Builder gnre un nom pour le service bas sur lURI WSDL. Les noms possibles pour un service sont soumis certaines restrictions. Voir Affectation de noms aux services de donnes la page 21. Package de services Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas sur le nom du service et le place dans un package services. Package du type de donnes Spcifiez un nom pour le package contenant les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package dataValues.
Flash Builder gnre des fichiers ActionScript qui accdent au service. Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits. Une fois la connexion au service Web tablie, configurez les types de retour des oprations de service. Pour plus dinformations, voir Configuration des types de donnes pour les oprations de service de donnes la page 28.
Accs BlazeDS
Vous pouvez accder aux services BlazeDS uniquement si vous avez install Adobe BlazeDS et configur un serveur RDS (Remote Development Services). Pour plus dinformations sur linstallation et la configuration de BlazeDS, voir la documentation dAdobe LiveCycle Data Services ES.
En rgle gnrale, vous accdez aux services de donnes BlazeDS partir dun projet Flex dont le type de serveurs dapplications spcifi est J2EE.
Voir aussi
Cration dun projet Flex pour laccs des services de donnes la page 8
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez BlazeDS. Cliquez sur Suivant. 3 Slectionnez une destination importer. 4 (Facultatif) Modifiez les dtails du service.
Nom du service Spcifiez un nom pour le service. Flash Builder gnre un nom pour le service bas sur la destination. Les noms possibles pour un service sont soumis certaines restrictions. Voir Affectation de noms aux services de donnes la page 21. Package de services Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas sur le nom du service et le place dans un package services. Package du type de donnes Spcifiez un nom pour le package contenant les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package valueObjects.
Flash Builder gnre des fichiers ActionScript qui accdent au service. Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits.
Service distant
Les services distants sont implments laide de la dfinition de types AMF. Ils ne fournissent aucune gestion de donnes ct serveur. Vous pouvez utiliser les outils Flash Builder pour configurer la gestion de donnes ct client. Voir Activation de la gestion des donnes la page 35.
Service de donnes
Les services de donnes implmentent la gestion de donnes ct serveur. Pour plus dinformations, reportez-vous la documentation LiveCycle Data Services.
Service Web
Les services Web sont disponibles par le biais dun proxy LiveCycle configur en tant que destination LiveCycle Data Services. La dfinition de type ct serveur nest gnralement pas fournie lors de la connexion un service Web.
Service distant
Les services distants implmentent la dfinition de types AMF sur le service. Il nest pas ncessaire de configurer des types de donnes de retour pour les destinations de service distant. Cependant, vous pouvez utiliser Flash Builder pour gnrer du code pour la gestion de donnes ct client. Voir Activation de la gestion des donnes la page 35.
Service de donnes
Les services de donnes implmentent les types de donnes ct serveur. Il nest pas ncessaire de configurer des types de donnes de retour pour les destinations de service de donnes. Les destinations de service de donnes fournissent galement la gestion des donnes ct serveur. Vous ne pouvez pas utiliser la gestion des donnes ct client avec les destinations de service de donnes.
Service Web
En rgle gnrale, les destinations de service Web disponibles par le biais dun proxy LiveCycle Data Service nimplmentent pas la dfinition de type ct serveur. Vous pouvez utiliser les outils Flash Builder pour configurer des types de retour pour les oprations de service Web. Voir Configuration des types de donnes pour les oprations de service de donnes la page 28. Vous pouvez utiliser Flash Builder pour gnrer du code pour la gestion des donnes ct client. Voir Activation de la gestion des donnes la page 35.
Connexion aux destinations LiveCycle Data Service (destinations de service de donnes et de service distant)
Cette procdure part du principe que vous avez install LiveCycle Data Services, configur un serveur de dveloppement distant et cr un projet Flex pour laccs aux services LCDS.
1 Dans le menu Donnes de Flash Builder, slectionnez Connexion aux donnes/services pour ouvrir lassistant de
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez LCDS. Cliquez sur Suivant. 3 Saisissez votre identifiant de connexion, le cas chant. 4 (Facultatif) Modifiez les dtails du service.
Nom du service Nindiquez aucun nom de service. Flash Builder gnre un nom de service. Il gnre un nom pour le service bas sur la destination. Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas sur le nom du service et le place dans un package services. Destinations Spcifiez une ou plusieurs destinations disponibles partir du serveur LiveCycle Data Services. Spcifiez un nom pour le package de type de donnes. Ce package contient les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package valueObjects.
Package de services
Flash Builder gnre des fichiers ActionScript qui accdent au service. Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits.
connexion un service.
2 Dans la bote de dialogue Slection dun type de service, choisissez Service Web. Cliquez sur Suivant. 3 Slectionnez loption Par une destination proxy LCDS/BlazeDS. 4 Saisissez votre identifiant de connexion, le cas chant. 5 Slectionnez la destination. 6 (Facultatif) Modifiez les dtails du service. Cliquez sur Suivant.
Nom du service Spcifiez un nom pour le service. Flash Builder gnre un nom pour le service bas sur le nom de la destination. Les noms possibles pour un service sont soumis certaines restrictions. Voir Affectation de noms aux services de donnes la page 21. Package de services Spcifiez un nom pour le package contenant les fichiers ActionScript gnrs qui accdent au service. Flash Builder gnre un package bas sur le nom du service et le place dans un package services. Package du type de donnes Spcifiez un nom pour le package contenant les fichiers de classe ActionScript gnrs qui dfinissent les types de donnes rcuprs partir du service. Par dfaut, Flash Builder cre le package dataValues.
Flash Builder gnre des fichiers ActionScript qui accdent au service. Remarque : une fois la connexion tablie, vous pouvez modifier les proprits du service. Slectionnez le service dans la vue Donnes/Services. Dans le menu contextuel, slectionnez Proprits.
Voir aussi
Cration dun projet Flex pour laccs des services de donnes la page 8
Le nom du service ne peut pas commencer par un nombre. Les noms de service ne peuvent pas tre des mots-cls ActionScript. Vous ne pouvez pas utiliser un nom de classe ActionScript, y compris les classes personnalises, en tant que nom
de service.
(PHP uniquement) Flash Builder ne peut pas importer un service dont le nom comporte des traits de soulignement.
Remarque : il est recommand dutiliser des noms de service diffrant des noms de vos fichiers MXML.
Pour les projets Flex accdant aux services PHP, Flash Builder cre les fichiers de configuration suivants dans le dossier de sortie du projet :
amf_config.ini gateway.php
Serveurs de production
Pour les serveurs de production, Adobe vous recommande de dplacer le dossier ZendFramework hors de la racine Web. Mettez jour la variable zend_path dfinie dans le fichier amf_config.ini. Si la variable zend_path est commente, supprimez-en le commentaire. Spcifiez lemplacement de linstallation Zend Framework.
Vous pouvez installer le package minimal ou le package complet. Flash Builder installe le package minimal.
2 Extrayez la version tlcharge dans un emplacement du systme. 3 Dans le dossier du projet Flex permettant daccder aux services PHP, mettez jour la variable zend_path dfinie
dans le fichier amf_config.ini. Si la variable zend_path est commente, supprimez-en le commentaire. Spcifiez le chemin absolu vers lemplacement de linstallation Zend Framework.
Zend_amf nest pas comment. Le chemin spcifi vers votre installation Zend Framework est correct : Il sagit dun chemin absolu vers une destination situe sur le systme de fichiers local. Vous ne pouvez pas
spcifier un chemin vers une ressource rseau mappe.
Le chemin spcifi pointe vers linstallation Zend Framework la racine Web du projet. Il sagit dun chemin absolu vers une destination situe sur le systme de fichiers local. Vous ne pouvez pas
spcifier un chemin vers une ressource rseau mappe.
Les contrles de base sont les lments de linterface utilisateur, par exemple Button, TextArea et CheckBox. Les contrles orients donnes, tels que les composants DataGrid et List, sont idaux pour laffichage des donnes obtenues partir dun service. Les navigateurs sont des conteneurs qui contrlent les mouvements de lutilisateur par le biais de conteneurs enfant, par exemple les ensembles de tabulation. En mode Cration de lditeur MXML, faites glisser des conteneurs et des contrles partir de la vue Composants et dposez-les dans la zone de cration. Agencez ensuite les composants et configurez-en les proprits. Une fois dfinie la prsentation de lapplication, reliez aux composants les donnes renvoyes par le service de donnes.
Si le type de retour de lopration a t pralablement configur, Flash Builder lie lopration au composant DataGrid. Le composant DataGrid change pour afficher les champs extraits de la base de donnes. Si le type de retour de lopration na pas t configur, Flash Builder ouvre la bote de dialogue Lier aux donnes. Voir Liaison dun contrle DataGrid une opration de service (bote de dialogue Lier aux donnes) la page 25.
3 Personnalisez laffichage du composant DataGrid.
Liaison dun contrle DataGrid une opration de service (bote de dialogue Lier aux donnes)
Cette procdure part du principe que vous tes connect un service de donnes.
1 En mode Cration de lditeur MXML, faites glisser un composant DataGrid partir de la vue Composants et
mthodes suivantes :
Slectionnez Lier aux donnes partir du menu Donnes de Flash Builder, du menu contextuel du composant
DataGrid ou de la barre doutils de la vue Donnes/Services.
Dans la vue Proprits, slectionnez le bouton Lier aux donnes (disponible en regard du champ Fournisseur de
donnes).
3 Slectionnez Nouvel appel de service, puis un service et une opration.
Si vous avez li une opration de service un composant, vous pouvez utiliser ces rsultats. Dans ce cas, spcifiez Rsultat dappel existant et slectionnez lopration utiliser.
4 (Facultatif) Slectionnez Modifier type de retour.
Slectionnez Modifier type de retour si vous voulez reconfigurer le type de retour pour lopration de service. Si le type de retour de lopration na pas t prcdemment configur, slectionnez Configurer le type de retour. Voir Configuration des types de donnes pour les oprations de service de donnes la page 28.
5 Cliquez sur OK.
Le composant DataGrid change pour afficher les champs extraits de la base de donnes. Voir Configuration de composants DataGrid et AdvancedDataGrid.
6 Enregistrez et excutez lapplication.
Flash Builder gnre une mthode pour appeler lopration et affiche la mthode gnre en mode Source dans lditeur MXML. Il cre une proprit CallResponder qui contient le rsultat de lappel de service. Cette option est galement disponible partir de la barre doutils Donnes/Services.
Lors de la gnration dun formulaire, dfinissez les champs inclure, spcifiez le type du contrle dinterface utilisateur utilis pour reprsenter chaque champ et indiquez si le formulaire est modifiable ou non.
Dans le menu contextuel de lopration, slectionnez Gnrer le formulaire. Dans le menu Donnes de Flash Builder, slectionnez Gnrer le formulaire. Faites glisser lopration de la vue Donnes/Services vers un composant Form dans la zone de cration.
2 Dans lassistant Gnrer le formulaire, slectionnez Appel de service dans le champ Gnrer le formulaire pour. 3 Slectionnez Nouvel appel de service ou Rsultat dappel existant.
Spcifiez Rsultat dappel existant pour utiliser le code gnr prcdemment pour un appel de service. Sinon, activez Nouvel appel de service et slectionnez un service et une opration pour le formulaire.
4 (Facultatif) Les options disponibles sur le formulaire gnr varient en fonction de lopration.
Si lopration accepte les paramtres, vous pouvez choisir dinclure un formulaire pour les paramtres. Si lopration renvoie une valeur, vous pouvez choisir dinclure un formulaire pour la valeur renvoye. Vous pouvez choisir de rendre le formulaire modifiable ou de le rendre uniquement accessible en lecture.
5 (Facultatif) Configurez les types dentre et les types de retour.
Si lopration slectionne dispose de paramtres dentre ou renvoie une valeur, vous pouvez configurer le type dentre ou le type de retour.
Pour pouvoir gnrer le formulaire, vous devez configurer les types dentre et de retour de lopration. Si vous les avez dj configurs prcdemment, vous avez ici la possibilit de les configurer nouveau. Voir Configuration des types de donnes pour les oprations de service de donnes la page 28.
6 Cliquez sur Suivant. Dans la bote de dialogue Mappage de contrle de proprit, slectionnez les champs inclure
Les formulaires gnrs par Flash Builder peuvent tre superposs. Slectionnez un formulaire et faites-le glisser vers un emplacement adquat. Utilisez le mode Source pour vous assurer davoir bien slectionn et dplac un formulaire et non un composant de ce dernier. La slection de formulaires superposs peut en effet savrer difficile. En mode Source, slectionnez la balise correspondant un formulaire. Basculez en mode Cration : ce formulaire est maintenant slectionn.
donnes.
4 (Facultatif) Rendez le formulaire modifiable si vous le souhaitez. 5 Cliquez sur Terminer.
Lorsque vous excutez lapplication, le gestionnaire dvnement renseigne le composant DataGrid cr avec les donnes extraites du service. Lorsque vous crez des gestionnaires dvnement, vous pouvez accepter les gestionnaires crs ou les remplacer par des gestionnaires adapts vos besoins. Vous pouvez par exemple remplacer le gestionnaire dvnement creationComplete sur DataGrid par un gestionnaire creationComplete sur Application. Vous pouvez galement gnrer ou crer des gestionnaires dvnement pour des contrles acceptant les interactions avec lutilisateur, par exemple les contrles Button et Text.
A partir de la vue Donnes/Services, faites glisser une opration sur un composant dinterface utilisateur. Slectionnez le composant dinterface utilisateur, puis cliquez sur licne de gnration dun gestionnaire
dvnement dans la vue Proprits. Slectionnez Gnrer le gestionnaire dvnement. Flash Builder cre un gestionnaire pour lvnement par dfaut du composant. Pour un bouton par exemple, le gestionnaire dvnement est lvnement Click. Flash Builder passe en mode Source de lditeur et met en vidence le stub gnr pour le gestionnaire dvnement. Compltez le code restant pour le gestionnaire dvnement. Flash Builder comporte un assistant de contenu facilitant le codage du gestionnaire dvnement.
Les oprations de service qui spcifient les paramtres doivent galement spcifier un type correspondant aux donnes auxquelles le service permet daccder. La dfinition de type ct client permet de configurer le type des paramtres dentre. Lors de la configuration des types pour la dfinition de type ct client, Flash Builder reconnat uniquement les types de donnes AMF. Le type peut galement tre un type de donnes personnalis reprsentant des donnes complexes ou un type vide pour indiquer que lopration ne renvoie aucune donne. Vous pouvez configurer des types dfinis par lutilisateur pour les oprations de service qui renvoient des donnes complexes. Si vous rcuprez par exemple des enregistrements dune base de donnes demploys, vous allez dfinir le retour de donnes complexes comme Employ. Dans ce cas, le type de donnes personnalis pour Employ contient des entres pour chaque champ de lenregistrement de base de donnes. Types de donnes pour la dfinition de type ct client
Type de donnes Types ActionScript Description Boolean Boolean[] ByteArray ByteArray[] Date Date[] int int[] Number Number[] Object Object[] String String[] Aucune donne renvoye Type dfini par lutilisateur void CustomType CustomType[]
Authentification de base
Lauthentification de base permet daccder aux services HTTP et Web. Fournissez le nom dutilisateur et le mot de passe pour accder ces services. Slectionnez les options de mmorisation du nom dutilisateur et du mot de passe si vous souhaitez que Flash Builder utilise les autorisations spcifies tout au long de la session.
Authentification distante
Lauthentification distante permet daccder aux services dobjets distants. Les services dobjets distants sont des services implments en tant quobjets distants laide de ColdFusion, PHP, BlazeDS et LiveCycle Data Services. Flash Builder ne fournit pas linterface dauthentification distante pour les projets qui nimplmentent pas de services dobjets distants. Fournissez le nom dutilisateur et le mot de passe pour accder aux services dobjets distants. Slectionnez les options de mmorisation du nom dutilisateur et du mot de passe si vous souhaitez que Flash Builder utilise les autorisations spcifies tout au long de la session.
argument de lopration. Cliquez sur OK. Vous pourrez galement slectionner les types de donnes de retour personnaliss pralablement dfinis. Pour la dfinition de type ct serveur, le serveur spcifie le type de donnes pour les paramtres dentre.
Fusion de champs
Vous pouvez ajouter des champs renvoys un type de donnes existant. Lajout de champs supplmentaires peut tre utile lors de lassociation de donnes provenant de plusieurs sources, par exemple pour une opration JOIN renvoyant des donnes extraites de plusieurs tableaux de base de donnes. Un autre exemple est celui de donnes provenant de diffrents services, par exemple la fusion de donnes de type Livre reues dun service HTTP et dun service ColdFusion.
largument.
3 (Type personnalis nouveau ou modifi) Slectionnez loption de dtection automatique du type des donnes
renvoyes par cette opration. Si ce service ncessite une authentification, slectionnez Authentification requise et fournissez les autorisations requises. Voir Authentification de laccs aux services la page 30. Flash Builder introspecte lopration et cre un type de donnes personnalis. Spcifiez un nom pour le type de donnes personnalis. Si vous avez pralablement dfini un type de donnes personnalis, vous pouvez ajouter les champs renvoys la dfinition du type de donnes personnalis existant.
4 (Utilisation du type existant) Utilisez cette option pour spcifier un type ActionScript ou un type que vous avez
prcdemment configur.
5 Cliquez sur Terminer.
cette opration. Si ce service ncessite une authentification, slectionnez Authentification requise et fournissez les autorisations requises. Flash Builder introspecte lopration et cre un type de donnes personnalis. Choisissez une mthode permettant Flash Builder de passer les valeurs des paramtres de lopration et cliquez sur Suivant.
(Saisie des valeurs des paramtres) Pour chaque paramtre, spcifiez une valeur.
Vous pouvez galement spcifier le type de donnes des paramtres. Flash Builder slectionne automatiquement le type de donnes par dfaut.
(Saisie de lURL du service) Saisissez lURL du service HTML, en incluant les paramtres et les valeurs dans
lURL. Par exemple :
http://httpserviceaddress/service_operation?param1=94105
provenant des donnes renvoyes. Si vous slectionnez un nud pour les donnes renvoyes, Flash Builder cre un type de donnes personnalis pour les donnes renvoyes pour ce nud. Indiquez si les donnes sont renvoyes sous forme de tableau. Si le service renvoie un fichier XML, la liste droulante Slection de la racine est active. Slectionnez un nud dans le fichier XML pour spcifier un type de donnes.
4 (Utilisation du type existant) Utilisez cette option pour spcifier un type ActionScript ou un type prcdemment
configur.
5 Cliquez sur Terminer.
Opration de test. La vue Opration de test souvre et affiche lopration slectionne. Si lopration ncessite des paramtres dentre, la vue Opration de test comporte une liste des paramtres.
2 Pour chaque paramtre dentre requis, cliquez sur le champ Entrer une valeur et spcifiez une valeur.
Si le paramtre ncessite un type complexe, cliquez sur les points de suspension pour ouvrir un diteur de saisie dargument. Saisissez une valeur dans lditeur. Lditeur de saisie dargument accepte la notation JSON pour la reprsentation de types complexes dans ActionScript.
3 Si le serveur requiert une authentification, slectionnez loption Authentification requise. Cliquez sur Tester.
Fournissez les autorisations le cas chant. Voir Authentification de laccs aux services la page 30. Flash Builder affiche les donnes renvoyes par le service.
4 (Facultatif) Dans la vue Opration de test, slectionnez et testez dautres services et oprations disponibles.
Supposons par exemple que vous souhaitiez accder une base de donnes contenant 10 000 enregistrements pour en afficher les donnes dans une grille compose de 20 lignes. Vous pouvez dans ce cas implmenter une opration de pagination charge dextraire les lignes par incrments de 20 jeux. Une demande de donnes supplmentaires (matrialise par exemple par le dfilement de la grille de donnes par lutilisateur) conduit lextraction et laffichage de la page denregistrements suivante.
Gestion des donnes Dans Flash Builder, la gestion de donnes est la synchronisation des mises jour des donnes
sur le serveur partir de lapplication client. Elle permet de modifier un ou plusieurs lments dans une application client sans mettre jour le serveur, puis de valider lensemble des modifications apportes au serveur en une seule opration. Vous pouvez galement annuler les modifications sans mettre jour les donnes. La gestion de donnes implique la coordination de plusieurs oprations (cration, rcupration, mise jour et suppression) rpondant aux vnements de lapplication client, tels que la mise jour de lenregistrement de lemploy. Lors de lactivation de la gestion des donnes avec Flash Builder, ce dernier gnre un code mettant automatiquement jour les composants de linterface utilisateur. Par exemple, Flash Builder gnre un code assurant la synchronisation des composants DataGrid avec les donnes sur le serveur.
Activation de la pagination
Vous pouvez activer la pagination pour un service de donnes qui implmente une fonction de pagination avec la signature suivante :
getItems_paged(startIndex:Number, numItems:Number): myDataType
Nom de la fonction startIndex Vous pouvez utiliser nimporte quel nom valide pour la fonction.
La premire ligne de donnes extraire. Dfinissez le type de donnes pour startIndex en tant que nombre dans lopration client.
numItems
Le nombre de lignes de donnes extraire dans chaque page. Dfinissez le type de donnes pour numItems en tant que nombre dans lopration client.
myDataType
Lors de limplmentation de la pagination partir dun service, vous pouvez aussi implmenter une opration count(). Lopration count() renvoie le nombre dlments renvoys par le service. Flash Builder requiert que lopration count() implmente la signature suivante :
count(): Number
Nom de la fonction Number Vous pouvez utiliser nimporte quel nom valide pour la fonction.
Flex utilise lopration count pour afficher correctement les composants de linterface utilisateur qui extraient des jeux de donnes volumineux. Lopration count() contribue par exemple dterminer la taille du curseur de la barre de dfilement dun objet DataGrid. Certains services distants ne fournissent pas dopration count(). La pagination continue fonctionner, mais le contrle qui affiche les donnes pagines risque de ne pas reprsenter correctement la taille du jeu de donnes. Oprations de pagination des interrogations filtres Activez la pagination des interrogations pour filtrer les rsultats envoys par la base de donnes. Lorsque vous filtrez les rsultats de linterrogation, utilisez ces signatures pour les fonctions de pagination et count.
getItems_pagedFiltered(filterParam1:String, filterParam2:String, startIndex:Number, numItems:Number): myDataType countFiltered(filterParam1:String, filterParam2:String)
filterParam1 Paramtre de filtre facultatif. Ce paramtre est le mme dans les fonctions getItems_PagedFiltered() et countFiltered(). Paramtre de filtre facultatif. Ce paramtre est le mme dans les fonctions getItems_PagedFiltered() et countFiltered().
filterParam2
Voici un fragment de code dune fonction getItems_pagedFiltered() implmente dans PHP pour accder la base de donnes MySQL. Il indique comment utiliser le paramtre de filtre facultatif.
get_Items_paged($expression, $startIndex, $numItems) { . . . SELECT * from employees where name LIKE $expression LIMIT $startIndex, $numItems; . . . }
Activation de la pagination pour une opration Cette procdure part du principe que vous avez cod les oprations getItems_paged() et count() du service distant et que vous avez configur le type de donnes de retour pour lopration, ainsi que dcrit dans Configuration des types de donnes pour les oprations de service de donnes la page 28.
1 Dans la vue Donnes/Services, ouvrez le menu contextuel de lopration getItems_paged() et slectionnez
Activer la pagination.
2 En labsence de cl unique pour le type de donnes, spcifiez les attributs qui caractriseront une occurrence de ce
type de donnes de manire univoque. Cliquez sur Suivant. Cet attribut est gnralement la cl primaire.
3 (Facultatif) Spcifiez le nombre dlments rcuprer pour dfinir un format de page personnalis.
Si vous ne spcifiez pas de format de page personnalis, un format par dfaut est dfini au niveau du service. Par dfaut, une page peut contenir 20 enregistrements.
4 (Facultatif) Spcifiez lopration count(). Cliquez sur Terminer.
Lopration count() permet Flash Builder dafficher correctement les lments de linterface utilisateur, tels que la taille du curseur de la barre de dfilement. La pagination est active pour lopration. Dans la vue Donnes/Services, la signature de la fonction qui implmente la pagination ninclut plus les paramtres startIndex et numItems. Flash Builder ajoute maintenant ces valeurs de faon dynamique et les dtermine en fonction de la taille des pages dfinie par lutilisateur ou de la taille des pages par dfaut (20 enregistrements par page).
Ajout (createItem)
createItem(item: myDatatype):int createItem(item: myDatatype):String createItem(item: myDatatype):myDataType
Suppression (deleteItem)
deleteItem(itemID:Number):void
Dans Flash Builder, ces fonctions doivent avoir les signatures suivantes.
Nom de la fonction item originalItem itemID Identifiant univoque de llment, gnralement la cl primaire dans la base de donnes. Tableau correspondant aux champs dun lment Item spcifi. Cet argument est utilis uniquement dans une version de la mthode updateItem(). Type de donnes de llment du service de donnes. En gnral, vous dfinissez un type de donnes personnalis lorsque vous extrayez des donnes dun service. Vous pouvez utiliser nimporte quel nom valide pour la fonction.
changes[] myDataType
Indicateur autoCommit
La gestion de donnes permet de synchroniser les mises jour des donnes sur le serveur. Les modifications apportes aux donnes dans lapplication client ne sont pas mises jour sur le serveur tant que lappel de la mthode service.commit() na pas t effectu. Cependant, si vous souhaitez dsactiver cette fonctionnalit, dfinissez lindicateur autoCommit sur true. Si autoCommit est dfini sur true, les mises jours des donnes du serveur ne sont pas mises en cache, mais sont effectues immdiatement. Voir Activation de la gestion de donnes pour un service la page 42.
Indicateur deleteItemOnRemoveFromFill
Lorsque vous supprimez des lments alors que la gestion des donnes est active, utilisez lindicateur deleteItemOnRemoveFromFill. Par dfaut, cet indicateur est dfini sur true. Lorsque vous supprimez un lment, cet lment est immdiatement retir de la base de donnes. Dfinissez deleteItemOnRemoveFromFill sur false pour diffrer la suppression jusqu lappel de la mthode commit(). Lexemple suivant illustre le code pour la cration dun gestionnaire dvnement complet pour un contrle DataGrid. Si lutilisateur supprime un lment Employee slectionn dans le DataGrid, llment slectionn nest retir de la base de donnes qu lappel de la mthode commit().
protected function dg_creationCompleteHandler(event:FlexEvent):void { employeeService. getDataManager(employeeService.DATA_MANAGER_EMPLOYEE).autoCommit=false; employeeService.getDataManager( e m p l oyeeService.DATA_MANAGER_EMPLOYEE).deleteItemOnRemoveFromFill= true; getAllEmployeesResult.token = employeeService.getAllEmployees(); }
implmentes. Cliquez sur Terminer. Remarque : il nest pas ncessaire dimplmenter toutes ces fonctions. Implmentez uniquement celles qui sont requises pour votre application. La gestion des donnes est active pour lopration.
Connexion un service de donnes Actualisation du service de donnes dans la vue Donnes/Services Configuration dun type de retour pour une opration Liaison dune opration de service un contrle de linterface utilisateur Activation de la pagination pour une opration de service Activation de la gestion de donnes pour une opration de Cration dun gestionnaire dvnement ou dun appel de service
Classes du service
Utilisez lassistant de service pour vous connecter un service de donnes. Lorsque vous vous connectez un service, Flash Builder gnre un fichier de classe ActionScript donnant accs aux oprations du service. Pour les services qui accdent un composant RemoteObject, la classe gnre tend la classe RemoteObjectServiceWrapper. En rgle gnrale, les services implments avec PHP, ColdFusion, BlazeDS et LiveCycle Data Services accdent un RemoteObject. Pour les services HTTP, la classe gnre tend la classe HTTPServiceWrapper. Pour les services Web, la classe gnre tend la classe WebServiceWrapper. Flash Builder base le nom du fichier de la classe gnre sur le nom attribu au service dans lassistant de service. Par dfaut, Flash Builder place cette classe dans le dossier source principal dun projet. En rgle gnrale, ce dossier est nomm src. Le nom du package est bas sur celui du service. Par exemple, Flash Builder gnre les classes ActionScript suivantes pour une classe EmployeeService.
La super-classe contient limplmentation de la classe EmployeeService. La super-classe est une classe gnre. Ne lditez jamais. Les modifications apportes la super-classe risquent dtre remplaces. Les modifications apportes limplmentation peuvent provoquer un comportement non dfini. Dans cet exemple, utilisez EmployeeService.as pour tendre la super-classe gnre et ajouter limplmentation.
Voir aussi
Connexion des services de donnes la page 9
- project | - src | + (default package) | + services | | | +employeeservice | | | + _Super_EmployeeService.as | | | + EmployeeService.as | + valueObjects | + _Super_Employee.as | + Employee.as
Les super-classes contiennent respectivement limplmentation de la classe EmployeeService et le type de donnes Employee. Nditez jamais une super-classe gnre. Les modifications apportes la super-classe risquent dtre remplaces. Les modifications apportes limplmentation peuvent provoquer un comportement non dfini. Dans cet exemple, utilisez EmployeeService.as et Employee.as pour tendre la super-classe gnre et ajouter limplmentation.
Une balise Declarations contenant une proprit CallResponder et une balise de service Un gestionnaire dvnement pour appeler lappel de service Une liaison de donnes entre le contrle et les donnes renvoyes par lopration
Balise Declarations
Une balise Declarations est un lment MXML qui dclare des proprits de la classe actuelle qui ne sont pas des proprits par dfaut ni visuelles. Lors de la liaison dune opration de service une interface utilisateur, Flash Builder gnre une balise Declarations contenant une proprit CallResponder et une balise de service. La proprit CallResponder et la classe de service gnre sont les proprits de llment de conteneur, qui est gnralement la balise Application. Lexemple suivant prsente une balise Declarations donnant accs un service EmployeeService distant :
<fx:Declarations> <s:CallResponder id="getAllEmployeesResult"/> <employeesservice:EmployeesService id="employeesService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/> </fx:Declarations>
CallResponder
La proprit CallResponder gre les rsultats des appels effectus un service. Elle contient une proprit de jeton dfinie sur le jeton Async renvoy par un appel de service. La proprit CallResponder contient galement une proprit lastResult, dfinie sur le dernier rsultat russi de lappel de service. Vous ajoutez des gestionnaires dvnement la proprit CallResponder pour donner accs aux donnes renvoyes par lintermdiaire de la proprit lastResult. Lorsque Flash Builder gnre une proprit CallResponder, il gnre une proprit ID en fonction du nom de lopration de service laquelle elle est lie. Lexemple de code suivant illustre les proprits CallResponder de deux oprations dun service EmployeeService. Lopration getAllItems est lie au gestionnaire dvnement creationComplete dun composant DataGrid. Lopration delete est lie llment slectionn dans le composant DataGrid. Immdiatement aprs sa cration, le composant DataGrid affiche les lments extraits de lappel de service getAllItems. Le contrle Delete Item Button supprime de la base de donnes lenregistrement slectionn dans le composant DataGrid.
<fx:Script> <![CDATA[ import mx.events.FlexEvent; import mx.controls.Alert; protected function dg_creationCompleteHandler(event:FlexEvent):void { getAllItemsResult.token = employeesService.getAllItems(); } protected function button_clickHandler(event:MouseEvent):void { deleteItemResult.token = employeesService.deleteItem(dg.selectedItem.emp_no); } ]]> </fx:Script> <fx:Declarations> <s:CallResponder id="getAllItemsResult"/> <employeesservice:EmployeesService id="employeesService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/> <s:CallResponder id="deleteItemResult"/> </fx:Declarations> <mx:DataGrid id="dg" editable="true" creationComplete="dg_creationCompleteHandler(event)"dataProvider="{getAllItemsResult.lastRes ult}"> <mx:columns> <mx:DataGridColumn headerText="emp_no" dataField="emp_no"/> <mx:DataGridColumn headerText="last_name" dataField="last_name"/> <mx:DataGridColumn headerText="hire_date" dataField="hire_date"/> </mx:columns> </mx:DataGrid> <s:Button label="Delete Item" id="button" click="button_clickHandler(event)"/>
Gestionnaires dvnement
Lorsque vous reliez une opration de service un composant de linterface utilisateur, Flash Builder cre un gestionnaire dvnement pour la proprit CallResponder. Le gestionnaire dvnement gre les rsultats de lopration. Vous pouvez galement crer un gestionnaire dvnement dans un bloc de code ActionScript et rfrencer ce gestionnaire dvnement partir dune proprit dun composant de linterface utilisateur. Vous renseignez gnralement les contrles tels que List et DataGrid avec les donnes renvoyes par un service. Par dfaut, Flash Builder gnre pour le contrle un gestionnaire dvnement creationComplete qui est dclench immdiatement aprs la cration du contrle. Pour dautres contrles, il gnre un gestionnaire pour lvnement par dfaut. Pour un bouton par exemple, il gnre un vnement pour lvnement click. La proprit event du contrle est dfinie sur le gestionnaire dvnement gnr. Lexemple suivant illustre le gestionnaire dvnement creationComplete gnr pour un contrle DataGrid :
<fx:Script> <![CDATA[ import mx.events.FlexEvent; import mx.controls.Alert; protected function dg_creationCompleteHandler(event:FlexEvent):void { getAllItemsResult.token = employeesService.getAllItems(); } ]]> </fx:Script> . . . <mx:DataGrid id="dg" editable="true" creationComplete="dg_creationCompleteHandler(event)" dataProvider="{getAllItemsResult.lastResult}"> <mx:columns> <mx:DataGridColumn headerText="emp_no" dataField="emp_no"/> <mx:DataGridColumn headerText="last_name" dataField="last_name"/> <mx:DataGridColumn headerText="hire_date" dataField="hire_date"/> </mx:columns> </mx:DataGrid>
Vous pouvez gnrer des gestionnaires dvnement pour des contrles rpondant aux vnements user (les contrles Button, par exemple). Lexemple suivant prsente un gestionnaire dvnement gnr pour un bouton qui renseigne un contrle DataGrid :
<fx:Script> <![CDATA[ import mx.events.FlexEvent; import mx.controls.Alert; protected function button_clickHandler(event:MouseEvent):void { deleteItemResult.token = employeesService.deleteItem(dg.selectedItem.emp_no); } ]]> </fx:Script> . . . <s:Button label="Delete Item" id="button" click="button_clickHandler(event)"/>
Liaison de donnes
Lorsque vous crez une interface utilisateur, vous liez les oprations de service aux contrles. Voir Liaison doprations de service des contrles la page 24. Flash Builder gnre du code qui lie les donnes renvoyes par une opration de service au contrle de linterface utilisateur affichant les donnes. Lexemple suivant illustre le code que Flash Builder gnre pour renseigner un contrle DataGrid. Lopration getAllItems renvoie un ensemble denregistrements demploys pour le type de donnes personnalis Employ. La proprit dataProvider du contrle DataGrid est lie aux rsultats stocks dans la proprit CallResponder, getAllItemsResult. Flash Builder met automatiquement jour le contrle DataGrid en fonction des colonnes DataGridColumn correspondant chaque champ renvoy pour un enregistrement Employ. Les proprits headerText et dataField de chaque colonne sont dfinies en fonction des donnes renvoyes dans un enregistrement Employ.
<mx:DataGrid creationComplete="datagrid1_creationCompleteHandler(event)" dataProvider="{getAllItemsResult.lastResult}" editable="true"> <mx:columns> <mx:DataGridColumn headerText="gender" dataField="gender"/> <mx:DataGridColumn headerText="emp_no" dataField="emp_no"/> <mx:DataGridColumn headerText="birth_date" dataField="birth_date"/> <mx:DataGridColumn headerText="last_name" dataField="last_name"/> <mx:DataGridColumn headerText="hire_date" dataField="hire_date"/> <mx:DataGridColumn headerText="first_name" dataField="first_name"/> </mx:columns> </mx:DataGrid>
Si autoCommit est dfini sur false, toutes les mises jour du service dans lapplication client sont mises en cache jusqu lappel de service.commit(). Vous pouvez appeler la mthode revertChanges() du service pour ignorer les changements. Si autoCommit est dfini sur true, les mises jours sont envoyes immdiatement au serveur. Vous ne pouvez pas appeler la mthode revertChanges() pour ignorer les changements. Lindicateur deleteItemOnRemoveFromFill dtermine si un lment supprim est immdiatement retir de la base de donnes. Si lindicateur est dfini sur true, llment nest supprim qu lappel de service.commit(). Le code suivant dsactive la synchronisation par gestion des donnes des mises jour avec les donnes du serveur. Les modifications apportes aux donnes du type gr sont mises jour immdiatement sur le serveur.
bookService.getDataManager(bookService.DATA_MANAGER__BOOK).autoCommit = true;
Le code suivant active la synchronisation de la gestion de donnes des mises jour des donnes du serveur. Les modifications apportes aux donnes pour le type gr ne sont mises jour qu lappel de commit() pour le service. En outre, les lments supprims ne sont retirs de la base de donnes qu lappel de commit().
bookService.getDataManager(bookService.DATA_MANAGER__BOOK).autoCommit = false; bookService.getDataManager(bookService.DATA_MANAGER__BOOK).deleteItemOnRemoveFromFill= true;
Pour valider les modifications apportes au type de donnes gr, appelez la mthode commit().
bookService.getDataManager (employeeService.DATA_MANAGER_EMPLOYEE).commit();
Vous pouvez galement appeler la mthode commit directement partir de loccurrence bookService. Lappel de la mthode commit directement partir de loccurrence de service valide toutes les modifications pour tous les types de donnes grs.
bookService.commit();
Remarque : vous ne pouvez pas appeler revertChanges() directement partir de loccurrence de service pour annuler les modifications apportes tous les types de donnes grs. Vous ne pouvez lappeler que pour un type de donnes gr spcifique. Si vous souhaitez remplacer le comportement par dfaut de la gestion des donnes et dsactiver la possibilit de rtablir les modifications, dfinissez lindicateur autoCommit sur true. Par exemple, si vous avez une occurrence de bookService et vous avez activ la gestion des donnes pour le type de donnes Book, dfinissez autoCommit sur true :
bookService.getDataManager(bookService.DATA_MANAGER__BOOK).autoCommit = true;
Les modifications apportes aux donnes pour le type gr sont dsormais mises jour immdiatement sur le serveur.
Ajout dauthentification
Ajoutez lauthentification utilisateur afin de vous assurer que seuls les utilisateurs de confiance peuvent accder vos informations de base de donnes.
Validation de donnes
Assurez-vous dajouter la validation de donnes. Par exemple, effectuez une validation des donnes fournies toute instruction dinsertion afin de vous assurer quaucune donne errone ou malveillante ne soit accepte dans la base de donnes. La validation ct client ne permet pas de vous protger des envois de requtes manuelles votre serveur Web. La validation des donnes protge contre les pirates et garantit la qualit des informations stockes.
Voir aussi
Flex Security
Authentifiez lutilisateur avant tout appel de mthode sur un service. Utilisez lauthentification de service pour autoriser uniquement certains utilisateurs effectuer certaines actions.
Par exemple, admettons que vous disposez dune application permettant de modifier les donnes demploys avec un appel RemoteObject. Dans ce cas, utilisez lauthentification RemoteObject afin de vous assurer que seuls les gestionnaires puissent modifier les donnes des employs.
Utilisez la scurit par programmation pour limiter laccs aux services. Appliquez des contraintes de scurit dclarative des services entiers. Lorsque vous accdez un service Web (<mx:WebService>) ou HTTP (<mx:HTTPService>), lun des lments
suivants doit tre vrai :
Limplmentation de service se trouve dans le mme domaine que lapplication qui lappelle. Le systme hte du service possde un fichier crossdomain.xml qui autorise explicitement laccs partir du
domaine de lapplication.
Voir aussi
Flex Security Securing Data Services
Autorisation et authentification des utilisateurs accdant aux ressources dun serveur Flash Player oprant dans un sandbox sur le client
Flex prend en charge lutilisation de la scurit dapplications Web de tout serveur dapplication J2EE. En outre, les applications prcompiles dans Flex peuvent sintgrer au modle dauthentification et dautorisation de toute technologie de serveur sous-jacente afin dempcher les utilisateurs daccder vos applications. La structure Flex inclut galement plusieurs mcanismes de scurit intgrs vous permettant de contrler laccs aux services Web, aux services HTTP et aux ressources bases sur serveur comme les EJB. Flash Player sexcute au sein dun sandbox de scurit qui empche le piratage du client par du code dapplication malveillant. Remarque : le contenu SWF excut dans Adobe AIR suit des rgles de scurit diffrentes de celles appliques au contenu excut dans le navigateur. Pour plus de dtails, voir la rubrique sur la scurit Air de la documentation AIR. Pour obtenir des liens vers diffrentes rubriques de scurit, voir Security Topic Center sur le portail Adobe Developer Connection.
Voir aussi
Flex Security
47
Chapitre 3 : Implmentation de services pour des applications centres sur les donnes
AMF (Action Message Format)
Flex utilise des services dobjets distants et AMF pour accder aux services implments dans ColdFusion, PHP, BlazeDS et Adobe LiveCycle Data Services ES. AMF fournit la messagerie ncessaire pour changer des donnes entre une base de donnes et lapplication client. ColdFusion, BlazeDS et Adobe LiveCycle Data Services ES fournissent chacun une structure AMF pour les services dobjet distant. Pour les services implments dans PHP, Flash Builder utilise la structure Zend AMF. Les services ColdFusion et PHP peuvent fournir une dfinition de type ct serveur. Dans la dfinition de type ct serveur, le service dfinit le type des donnes renvoyes. Toutefois, si limplmentation de service ne dfinit pas le type de donnes de retour, Flash Builder fournit la dfinition de type ct client. Il chantillonne des donnes du service, ce qui vous permet de configurer le type de retour dans lapplication client.
Implmentation de services ColdFusion la page 48 Implmentation de services PHP la page 54 Exemple dimplmentation de services partir de plusieurs sources la page 68
Par exemple, pour lopration getAllEmployees, le service renvoie un tableau dobjets non typs reprsentant des enregistrements issus de la base de donnes. Flash Builder fournit des outils qui activent la dfinition de type ct client. Les outils Flash Builder vous permettent dexaminer en dtail les donnes renvoyes et de dfinir un type personnalis pour les donnes. Vous pouvez dfinir le type de donnes personnalis Employ pour lobjet renvoy des enregistrements demploys. Chaque colonne de lenregistrement devient une proprit du type de donnes Employ. A laide du type de donnes personnalis Employ, lapplication client peut accder aux donnes renvoyes et les afficher correctement. Flash Builder peut galement accder des services implmentant une dfinition de type ct serveur. Pour obtenir des exemples de la dfinition de type ct serveur, voir Exemples de dfinition de type ct serveur dans Flash Builder.
<cfcomponent output="false"> <!--This sample service contains functions that illustrate typical service operations. This code is for prototyping only. Authenticate the user prior to allowing them to call these methods. You can find more information at http://www.adobe.com/go/cf9_usersecurity ---> <cffunction name="getAllemployees" output="false" access="remote" returntype="any" > <!--- Retrieve set of records and return them as a query or array. Add authorization or any logical checks for secure access to your data ---> <cfset var qAllItems=""> <cfquery name="qAllItems" datasource="employees"> SELECT * FROM employees </cfquery> <cfreturn qAllItems> </cffunction> <cffunction name="getemployees" output="false" access="remote" returntype="any" > <cfargument name="emp_no" type = "numeric" required="true" /> <!--- Retrieve a single record and return it as a query or array. Add authorization or any logical checks for secure access to your data ---> <cfset var qItem=""> <cfquery name="qItem" datasource="employees"> SELECT * FROM employees WHERE emp_no = <CFQUERYPARAM CFSQLTYPE="CF_SQL_INTEGER" VALUE="#ARGUMENTS.emp_no#"> </cfquery> <cfreturn qItem> </cffunction> </cfcomponent>
Connexion la base de donnes des employs et accs au tableau des employs dans la base de donnes Renvoi dun tableau dobjets
Lors de la programmation laide de la structure Flex, les services ne renvoient que des donnes. Lapplication client gre le formatage et la prsentation des donnes. Ce modle diffre des applications ColdFusion CFM traditionnelles, qui retournent des donnes formates dans un modle HTML. Flex gre les jeux denregistrement renvoys comme tableau dobjets. Chaque ligne reprsente un enregistrement extrait de la base de donnes. Chaque colonne de lenregistrement de base de donnes devient une proprit de lobjet renvoy. Lapplication client peut ainsi accder aux donnes renvoyes comme objets avec un ensemble de proprits.
Configurez le type de donnes pour lobjet renvoy. Voir Dfinition de type ct client et ct serveur la page 47.
Authentification des utilisateurs avant de donner laccs aux fonctions dans ce service
Lexemple de code nillustre pas comment authentifier les utilisateurs. Voir la documentation ColdFusion About User Security.
Voir aussi
Configuration des types de donnes pour les oprations de service de donnes la page 28 Accs aux services ColdFusion la page 9 Gnration dun exemple de service ColdFusion partir dun tableau de base de donnes la page 10
<cfcomponent output="false"> <!--This sample service contains functions that illustrate typical service operations. This code is for prototyping only. Authenticate the user prior to allowing them to call these methods. You can find more information at http://www.adobe.com/go/cf9_usersecurity ---> <cffunction name="count" output="false" access="remote" returntype="numeric" > <!--Return the number of items in your table. Add authorization or any logical checks for secure access to your data ---> <cfquery name="qread" datasource="employees"> SELECT COUNT(emp_no) AS itemCount FROM employees </cfquery> <cfreturn qread.itemCount> </cffunction> <cffunction name="getemployees_paged" output="false" access="remote" returntype="any" > <cfargument name="startIndex" type="numeric" required="true" /> <cfargument name="numItems" type="numeric" required="true" /> <!---Return a page of numRows number of records as an array or query from the database for this startRow. Add authorization or any logical checks for secure access to your data ---> <!---The LIMIT keyword is valid for mysql database only. Modify it for your database ---> <cfset var qRead=""> <cfquery name="qRead" datasource="employees"> SELECT * FROM employees LIMIT #startIndex#, #numItems# </cfquery> <cfreturn qRead> </cffunction> </cfcomponent>
Le service EmployeeServicePaged renvoie des donnes non types. Utilisez les outils Flash Builder pour configurer le type de retour pour getEmployees_Paged(). Une fois le type de retour configur, activez la pagination sur lopration getEmployees_Paged().
Voir aussi
Exemples de services ColdFusion la page 48 Configuration des types de donnes pour les oprations de service de donnes la page 28 Gestion de laccs aux donnes partir du serveur la page 33
Pour implmenter la gestion de donnes, Flash Builder ncessite une combinaison de signatures de fonction spcifiques. Lexemple de code suivant illustre une mthode dimplmentation dun service ColdFusion pour la gestion de donnes. Lexemple EmployeeServiceDM est bas sur le code gnr par Flash Builder lors de laccs au tableau de la base de donnes. Voir Gnration dun exemple de service ColdFusion partir dun tableau de base de donnes la page 10. Important : les exemples de services sont destins uniquement ltablissement dun prototype. Utilisez lexemple de service uniquement dans un environnement de dveloppement fiable. Avant de dployer ce service, assurez-vous daugmenter la protection et de restreindre laccs de faon adquate. Pour obtenir des informations sur la rdaction de services ColdFusion scuriss, voir la documentation ColdFusion About User Security.
<cfcomponent output="false"> <!--This sample service contains functions that illustrate typical service operations. This code is for prototyping only. Authenticate the user prior to allowing them to call these methods. You can find more information at http://www.adobe.com/go/cf9_usersecurity ---> <cffunction name="getAllemployees" output="false" access="remote" returntype="any" > <!--- Auto-generated method Retrieve set of records and return them as a query or array. Add authorization or any logical checks for secure access to your data ---> <cfset var qAllItems=""> <cfquery name="qAllItems" datasource="employees"> SELECT * FROM employees </cfquery> <cfreturn qAllItems> </cffunction> <cffunction name="getemployees" output="false" access="remote" returntype="any" > <cfargument name="emp_no" type = "numeric" required="true" /> <!--Retrieve a single record and return it as a query or array. Add authorization or any logical checks for secure access to your data ---> <cfset var qItem=""> <cfquery name="qItem" datasource="employees"> SELECT * FROM employees WHERE emp_no = <CFQUERYPARAM CFSQLTYPE="CF_SQL_INTEGER" VALUE="#ARGUMENTS.emp_no#"> </cfquery> <cfreturn qItem> </cffunction> <cffunction name="createemployees" output="false" access="remote" returntype="any" > <cfargument name="item" required="true" />
<!--Insert a new record in the database. Add authorization or any logical checks for secure access to your data ---> <cfquery name="createItem" datasource="employees" result="result"> INSERT INTO employees (birth_date, first_name, last_name, gender, hire_date) VALUES (<CFQUERYPARAM cfsqltype="CF_SQL_DATE" VALUE="#item.birth_date#">, <CFQUERYPARAM cfsqltype="CF_SQL_VARCHAR" VALUE="#item.first_name#">, <CFQUERYPARAM cfsqltype="CF_SQL_VARCHAR" VALUE="#item.last_name#">, <CFQUERYPARAM cfsqltype="CF_SQL_CHAR" VALUE="#item.gender#">, <CFQUERYPARAM cfsqltype="CF_SQL_DATE" VALUE="#item.hire_date#">) </cfquery> <!--- The GENERATED_KEY is valid for mysql database only, you can modify it for your database ---> <cfreturn result.GENERATED_KEY/> </cffunction> <cffunction name="updateemployees" output="false" access="remote" returntype="void" > <cfargument name="item" required="true" /> <!--- Update an existing record in the database. Add authorization or any logical checks for secure access to your data ---> <cfquery name="updateItem" datasource="employees"> UPDATE employees SET birth_date = <CFQUERYPARAM cfsqltype=CF_SQL_DATE VALUE="#item.birth_date#">, first_name = <CFQUERYPARAM cfsqltype=CF_SQL_VARCHAR VALUE="#item.first_name#">, last_name = <CFQUERYPARAM cfsqltype=CF_SQL_VARCHAR VALUE="#item.last_name#">, gender = <CFQUERYPARAM cfsqltype=CF_SQL_CHAR VALUE="#item.gender#">, hire_date = <CFQUERYPARAM cfsqltype=CF_SQL_DATE VALUE="#item.hire_date#">
WHERE emp_no = <CFQUERYPARAM CFSQLTYPE="CF_SQL_INTEGER" VALUE="#item.emp_no#"> </cfquery> </cffunction> <cffunction name="deleteemployees" output="false" access="remote" returntype="void" > <cfargument name="emp_no" type="numeric" required="true" /> <!--- Delete a record in the database. Add authorization or any logical checks for secure access to your data ---> <cfquery name="delete" datasource="employees"> DELETE FROM employees WHERE emp_no = <CFQUERYPARAM CFSQLTYPE="CF_SQL_INTEGER" VALUE="#ARGUMENTS.emp_no#"> </cfquery> </cffunction> </cfcomponent>
Le service EmployeeServiceDM renvoie des donnes non types. Utilisez les outils Flash Builder pour configurer le type de retour des oprations getAllEmployeess() et getEmployees(). Utilisez Employ comme type de donnes personnalis renvoy par ces oprations. Une fois le type de retour configur, activez la gestion de donnes sur le type de donnes Employ.
Voir aussi
Exemples de services ColdFusion la page 48 Configuration des types de donnes pour les oprations de service de donnes la page 28 Gestion de laccs aux donnes partir du serveur la page 33
Vous pouvez crer des services PHP dans nimporte quel environnement ddition (DreamWeaver ou Zend Studio, par exemple). Flash Builder ne fournit pas dditeur spcifique aux fichiers PHP. Louverture dun fichier PHP dans Flash Builder conduit toutefois au lancement de lapplication du systme associe aux fichiers PHP. Pour plus de commodit, Flash Builder fournit galement un diteur de texte brut que vous pouvez utiliser pour diter les fichiers PHP.
getAllIEmployees()
getEmployeeByID($itemID)
Renvoie un seul enregistrement demploy. Cet exemple illustre la dfinition de type ct client. Le service renvoie des donnes non types. Flash Builder utilise la dfinition de type ct client pour introspecter les donnes renvoyes et dfinir le type de donnes. Les exemples suivants illustrent comment implmenter les services pour la pagination et la gestion de donnes. Vous pouvez galement utiliser Flash Builder pour accder des services implmentant la dfinition de type ct serveur. Voir Dfinition de type ct client et ct serveur la page 47. Aucun exemple de dfinition de type ct serveur ntait disponible lorsque la rdaction de ce document a t acheve. Pour obtenir des exemples de dfinition de type ct serveur, voir Exemples de dfinition de type ct serveur dans Flash Builder.
<?php /** * This sample service contains functions that illustrate typical service operations. * This code is for prototyping only. * * Authenticate users before allowing them to call these methods. */ class EmployeeService { var var var var var var $username = "root"; $password = "root"; $server = "localhost"; $port = "3306"; $databasename = "employees"; $tablename = "employees";
var $connection; /** * The constructor initializes the connection to database. Everytime a request is * received by Zend AMF, an instance of the service class is created and then the * requested method is called. */ public function __construct() { $this->connection = mysqli_connect( $this->server, $this->username, $this->password, $this->databasename, $this->port ); $this->throwExceptionOnError($this->connection); } /** * Returns all the rows from the table. * * Add authroization or any logical checks for secure access to your data * * @return array */ public function getAllEmployees() { $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename"); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); $rows = array(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); while (mysqli_stmt_fetch($stmt)) { $rows[] = $row;
$row = new stdClass(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); } mysqli_stmt_free_result($stmt); mysqli_close($this->connection); return $rows; } /** * Returns the item corresponding to the value specified for the primary key. * * Add authroization or any logical checks for secure access to your data * * * @return stdClass */ public function getEmployeesByID($itemID) { $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename where emp_no=?"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'i', $itemID); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); if(mysqli_stmt_fetch($stmt)) { return $row; } else { return null; } } /** * Utitity function to throw an exception if an error occurs * while running a mysql command. */ private function throwExceptionOnError($link = null) { if($link == null) { $link = $this->connection; } if(mysqli_error($link)) { $msg = mysqli_errno($link) . ": " . mysqli_error($link); throw new Exception('MySQL Error - '. $msg); } } }
?>
Il se connecte la base de donnes des employs, laquelle il accde via le port 3306 de lhte local. Il accde au
tableau des employs dans la base de donnes.
Il fournit des variables de classe pour la connexion au service et laccs aux tableaux dans la base de donnes.
Vous pouvez utiliser ces variables dans des fonctions de la classe. Remplacez les valeurs de ces variables avec des valeurs de votre systme.
Il fournit la fonction getEmployeesByID($itemID) qui lie le paramtre dentre aux types de donnes.
Le nombre de variables et la longueur des types de chanes doivent correspondre aux paramtres dans linstruction. Le composant ? de linstruction de prparation est un espace rserv pour le paramtre. mysqli reconnat les types suivants :
integer (i) double (d) string (s) blob (b) Il lie les rsultats, crant ainsi un tableau dobjets ($row[]).
Flex gre les jeux denregistrement en tant que tableau dobjets. Chaque objet reprsente un enregistrement extrait de la base de donnes. Chaque colonne de lenregistrement de base de donnes devient une proprit de lobjet renvoy. Lapplication client peut ainsi accder aux donnes renvoyes comme objets avec un ensemble de proprits. Le serveur ne dfinissant pas le type des donnes renvoyes, vous devez configurer le type de donnes de lobjet renvoy. Voir Dfinition de type ct client et ct serveur la page 47.
Il fournit une fonction constructeur pour linitialisation de la connexion la base de donnes. Il utilise les instructions de prparation mysqli pour la cration de requtes de base de donnes.
Lutilisation des instructions de prparation est une dfense contre les attaques par instructions dinjection SQL dans les appels au serveur. Linstruction est excute sur le serveur uniquement aprs sa prparation.
Il authentifie les utilisateurs avant de donner laccs aux fonctions dans ce service.
Lexemple de code nillustre pas comment authentifier les utilisateurs. Voir la documentation ColdFusion About User Security. Les principes de scurit sur lauthentification et lautorisation des utilisateurs dans cette documentation ColdFusion sappliquent aux services PHP.
Si les noms du fichier et de la classe ne correspondent pas, des erreurs se produisent lorsque vous accdez au service.
Voir aussi
Configuration des types de donnes pour les oprations de service de donnes la page 28 Accs aux services PHP la page 11 Gnration dun exemple de service PHP partir dun tableau de base de donnes la page 12
var $connection; /** * The constructor initializes the connection to database. Everytime a request is * received by Zend AMF, an instance of the service class is created and then the * requested method is invoked. */ public function __construct() { $this->connection = mysqli_connect( $this->server, $this->username, $this->password, $this->databasename, $this->port
); $this->throwExceptionOnError($this->connection); }
/** * Returns the number of rows in the table. * * Add authroization or any logical checks for secure access to your data * * */ public function count() { $stmt = mysqli_prepare($this->connection, "SELECT COUNT(*) AS COUNT FROM $this->tablename"); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); mysqli_stmt_bind_result($stmt, $rec_count); $this->throwExceptionOnError(); mysqli_stmt_fetch($stmt); $this->throwExceptionOnError(); mysqli_stmt_free_result($stmt); mysqli_close($this->connection); return $rec_count; }
/** * Returns $numItems rows starting from the $startIndex row from the * table. * * Add authroization or any logical checks for secure access to your data * * @return array */ public function getEmployees_paged($startIndex, $numItems) { $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename LIMIT ?, ?"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'ii', $startIndex, $numItems); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); $rows = array(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date);
while (mysqli_stmt_fetch($stmt)) { $rows[] = $row; $row = new stdClass(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); } mysqli_stmt_free_result($stmt); mysqli_close($this->connection); return $rows; }
/** * Utitity function to throw an exception if an error occurs * while running a mysql command. */ private function throwExceptionOnError($link = null) { if($link == null) { $link = $this->connection; } if(mysqli_error($link)) { $msg = mysqli_errno($link) . ": " . mysqli_error($link); throw new Exception('MySQL Error - '. $msg); } } } ?>
Le service EmployeeServicePaged renvoie des donnes non types. Utilisez les outils Flash Builder pour configurer le type de retour pour getEmployees_Paged(). Une fois le type de retour configur, activez la pagination sur lopration getEmployees_Paged().
Voir aussi
Exemples de services PHP la page 55 Configuration des types de donnes pour les oprations de service de donnes la page 28 Gestion de laccs aux donnes partir du serveur la page 33
Important : les exemples de services sont destins uniquement ltablissement dun prototype. Utilisez lexemple de service uniquement dans un environnement de dveloppement fiable. Avant de dployer ce service, assurez-vous daugmenter la protection et de restreindre laccs de faon adquate. Pour plus dinformations sur la rdaction de services scuriss, voir Dploiement des applications accdant aux services de donnes la page 44.
<?php /** * This sample service contains functions that illustrate typical service operations. * This code is for prototyping only. * * Authenticate the user prior to allowing them to call these methods. */ class EmployeeServiceDM { var var var var var var $username = "root"; $password = "root"; $server = "localhost"; $port = "3306"; $databasename = "employees"; $tablename = "employees";
var $connection; /** * The constructor initializes the connection to database. Everytime a request is * received by Zend AMF, an instance of the service class is created and then the * requested method is invoked. */ public function __construct() { $this->connection = mysqli_connect( $this->server, $this->username, $this->password, $this->databasename, $this->port ); $this->throwExceptionOnError($this->connection); } /** * Returns all the rows from the table. * * Add authroization or any logical checks for secure access to your data * * @return array */ public function getAllEmployees() { $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename"); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError();
$rows = array(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); while (mysqli_stmt_fetch($stmt)) { $rows[] = $row; $row = new stdClass(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); } mysqli_stmt_free_result($stmt); mysqli_close($this->connection); return $rows; } /** * Returns the item corresponding to the value specified for the primary key. * * Add authroization or any logical checks for secure access to your data * * * @return stdClass */ public function getEmployeesByID($itemID) { $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename where emp_no=?"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'i', $itemID); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); if(mysqli_stmt_fetch($stmt)) { return $row; } else { return null; } } /** * Returns the item corresponding to the value specified for the primary key. * * Add authroization or any logical checks for secure access to your data * *
* @return stdClass */ public function createEmployees($item) { $stmt = mysqli_prepare($this->connection, "INSERT INTO $this->tablename (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES (?, ?, ?, ?, ?, ?)"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'isssss', $item->emp_no, $item->birth_date $item->first_name, $item->last_name, $item->gender, $item->hire_date); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); $autoid = mysqli_stmt_insert_id($stmt); mysqli_stmt_free_result($stmt); mysqli_close($this->connection); return $autoid; } /** * Updates the passed item in the table. * * Add authroization or any logical checks for secure access to your data * * @param stdClass $item * @return void */ public function updateEmployees($item) { $stmt = mysqli_prepare($this->connection, "UPDATE $this->tablename SET emp_no=?, birth_date=?, first_name=?, last_name=?, gender=?, hire_date=? WHERE emp_no=?"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'isssssi', $item->emp_no, $item->birth_date, $item->first_name, $item->last_name, $item->gender, $item->hire_date, $item->emp_no); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); mysqli_stmt_free_result($stmt); mysqli_close($this->connection); } /** * Deletes the item corresponding to the passed primary key value from * the table. *
* Add authroization or any logical checks for secure access to your data * * * @return void */ public function deleteEmployees($itemID) { $stmt = mysqli_prepare($this->connection, "DELETE FROM $this->tablename WHERE emp_no = ?"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'i', $itemID); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); mysqli_stmt_free_result($stmt); mysqli_close($this->connection); } /** * Utitity function to throw an exception if an error occurs * while running a mysql command. */ private function throwExceptionOnError($link = null) { if($link == null) { $link = $this->connection; } if(mysqli_error($link)) { $msg = mysqli_errno($link) . ": " . mysqli_error($link); throw new Exception('MySQL Error - '. $msg); } } } ?>
Le service EmployeeServiceDM renvoie des donnes non types. Utilisez les outils Flash Builder pour configurer le type de retour des oprations getAllEmployeess() et getEmployeesByID(). Utilisez Employ comme type de donnes personnalis renvoy par ces oprations. Une fois le type de retour configur, activez la gestion de donnes sur le type de donnes Employ.
Voir aussi
Exemples de services PHP la page 55 Configuration des types de donnes pour les oprations de service de donnes la page 28 Gestion de laccs aux donnes partir du serveur la page 33
Scripts ct serveur
Pour le dbogage supplmentaire des services, vous pouvez crire des scripts qui testent le code du serveur et des informations de flux de sortie dans les fichiers journaux.
connexion au service.
4 Si lopration accepte les paramtres, cliquez sur le champ Entrer une valeur afin de fournir une valeur pour le
paramtre. Si le paramtre ncessite un type complexe, cliquez sur les points de suspension dans le champ Entrer une valeur afin douvrir un diteur acceptant la notation JSON. Spcifiez la valeur pour le paramtre laide de la notation JSON.
5 Cliquez sur Tester afin dafficher le rsultat de lopration.
Vous pouvez visionner les rsultats des tests dans un navigateur Web.
Rafrachissez laffichage du navigateur pour visionner le rsultat des modifications que vous apportez au code.
Vous pouvez envoyer un cho ou une impression des rsultats au flux de sortie, ce quil vous est impossible de faire
directement partir dAMF.
La mise en forme des erreurs affiches est conviviale. Les erreurs sont souvent plus compltes que celles saisies avec AMF.
Scripts ColdFusion
Utilisez le script suivant (tester.cfm) pour vider lappel dune fonction :
<!--- tester.cfm ---> <cfobject component="EmployeeService" name="o"/> <cfdump var="#o.getAllItems()#">
Vous pouvez par exemple appeler la mthode getItemID dans EmployeeService en utilisant lURL suivante :
http://localhost/tester2.cfm?EmployeeService&method=getItemId&id=12
Le script tester3.cfm enregistre dans un journal les appels doprations et vide les arguments entrants en utilisant cfdump.
<!--- tester3.cfm ---> <cfsavecontent variable="d"><cfdump var="#arguments#"></cfsavecontent> <cffile action="append" file="#getDirectoryFromPath(getCurrentTemplatePath())#MyServiceLog.htm" output="<p>#now()# operationName #d#">
Scripts PHP Utilisez le script suivant (tester.php) pour vider lappel dune fonction :
<pre> <?php include('MyService.php'); $o = new MyService(); var_dump($o->getAllItems()); ?> </pre>
Ajoutez le code suivant au service PHP afin de consigner les messages au cours de lexcution du code :
$message = 'updateItem: '.$item["id"]; $log_file = '/Users/me/Desktop/myservice.log'; error_log(date('d/m/Y H:i:s').' '.$message.PHP_EOL, 3, $log_file);
Ajoutez le code suivant au service PHP afin dactiver le vidage dans un fichier journal :
ob_start(); var_dump($item); $result = ob_get_contents(); ob_end_clean(); $message = 'updateItem: '.$result; $log_file = '/Users/me/Desktop/myservice.log'; error_log(date('d/m/Y H:i:s').' '.$message.PHP_EOL, 3, $log_file);
Moniteur de rseau
Le Moniteur de rseau est accessible dans la perspective Dbogage Flex de Flash Builder. Il doit tre activ avant de pouvoir tre utilis pour surveiller les donnes. Pour plus dinformations sur lactivation et lutilisation du Moniteur de rseau, voir Surveillance des applications accdant aux services de donnes.
Dpartements
Chaque enregistrement contient les champs suivants : numro et nom du dpartement.
Dept_emp
Chaque enregistrement contient les champs suivants : emp_no, dept_no, from_date, to_date.
Employs
Chaque enregistrement contient les champs suivants : emp_no, birth_date, first_name, last_name, gender, hire_date. Lexemple dapplication dispose de deux composants DataGrid, un pour les dpartements et un pour les employs. La liste Dpartements rpertorie tous les dpartements. Lorsque vous slectionnez un dpartement, le composant DataGrid Employs rpertorie tous les employs de ce dpartement. La slection dun employ dans le composant DataGrid Employs renseigne un formulaire vous permettant de mettre jour lenregistrement de lemploy slectionn.
getAllDepartments() getEmployeesByDept()
getEmployeeByID() updateEmployee()
EmployeeService (PHP)
EmployeeService.php implmente un service contenant une seule fonction. GetEmployeesByID() accepte lID de dpartement en tant quargument et renvoie tous les employs du dpartement donn. La fonction renvoie galement les dates auxquelles lemploy a rejoint et quitt le dpartement. GetEmployeesByDept() excute la requte SQL suivante : SELECT employees.emp_no, employees.birth_date, employees.first_name, employees.last_name, employees.gender, employees.hire_date, dept_emp.from_date, dept_emp.to_date FROM employees, dept_emp WHERE dept_emp.emp_no = employees.emp_no and dept_emp.dept_no = departments.dept_no
Important : les exemples de services sont destins uniquement ltablissement dun prototype. Utilisez lexemple de service uniquement dans un environnement de dveloppement fiable. Avant de dployer ce service, assurez-vous daugmenter la protection et de restreindre laccs de faon adquate. Pour plus dinformations sur la rdaction de services scuriss, voir Dploiement des applications accdant aux services de donnes la page 44.
<?php /** * EmployeeService.php * * This sample service contains functions that illustrate typical service operations. * Use these functions as a starting point for creating your own service implementation. * * This code is for prototyping only. * * Authenticate the user before allowing them to call these methods. */ class EmployeeService { var var var var var var $username = "admin2"; $password = "Cosmo49"; $server = "localhost"; $port = "3306"; $databasename = "employees"; $tablename = "employees";
var $connection; /** * The constructor initializes the connection to database. Everytime a request is * received by Zend AMF, an instance of the service class is created and then the * requested method is called. */ public function __construct() { $this->connection = mysqli_connect( $this->server, $this->username,
/** * Returns all the rows from the table. * * Add authroization or any logical checks for secure access to your data * * @return array */ public function getAllDepartments() { $stmt = mysqli_prepare($this->connection, "SELECT * FROM departments"); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); $rows = array(); mysqli_stmt_bind_result($stmt, $row->dept_no, $row->dept_name); while (mysqli_stmt_fetch($stmt)) { $rows[] = $row; $row = new stdClass(); mysqli_stmt_bind_result($stmt, $row->dept_no, $row->dept_name); } mysqli_stmt_free_result($stmt); mysqli_close($this->connection); return $rows; } public function getEmployeesByDept($deptId) { $stmt = mysqli_prepare($this->connection, "select employees.emp_no, employees.first_name, employees.last_name, employees.gender, dept_emp.dept_no from employees, dept_emp where dept_emp.emp_no = employees.emp_no and dept_emp.dept_no = ? limit 0,30;"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 's', $deptId); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError();
$rows = array(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->first_name, $row->last_name, $row->gender, $row->dept_no); while (mysqli_stmt_fetch($stmt)) { $rows[] = $row; $row = new stdClass(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->first_name, $row->last_name, $row->gender, $row->dept_no); } mysqli_stmt_free_result($stmt); mysqli_close($this->connection); return $rows; } /** * Returns the item corresponding to the value specified for the primary key. * * Add authroization or any logical checks for secure access to your data * * * @return stdClass */ public function getEmployeesByID($itemID) { $stmt = mysqli_prepare($this->connection, "SELECT * FROM employees where emp_no=?"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'i', $itemID); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); mysqli_stmt_bind_result($stmt, $row->emp_no, $row->birth_date, $row->first_name, $row->last_name, $row->gender, $row->hire_date); if(mysqli_stmt_fetch($stmt)) { return $row; } else { return null; } }
/** * Updates the passed item in the table. * * Add authroization or any logical checks for secure access to your data *
* @param stdClass $item * @return void */ public function updateEmployees($item) { $stmt = mysqli_prepare($this->connection, "UPDATE employees SET emp_no=?, birth_date=?, first_name=?, last_name=?, gender=?, hire_date=? WHERE emp_no=?"); $this->throwExceptionOnError(); mysqli_bind_param($stmt, 'isssssi', $item->emp_no, $item->birth_date, $item->first_name, $item->last_name, $item->gender, $item->hire_date, $item->emp_no); $this->throwExceptionOnError(); mysqli_stmt_execute($stmt); $this->throwExceptionOnError(); mysqli_stmt_free_result($stmt); mysqli_close($this->connection); }
/** * Utitity function to throw an exception if an error occurs * while running a mysql command. */ private function throwExceptionOnError($link = null) { if($link == null) { $link = $this->connection; } if(mysqli_error($link)) { $msg = mysqli_errno($link) . ": " . mysqli_error($link); throw new Exception('MySQL Error - '. $msg); } } } >?>
EmployeeService (ColdFusion)
EmployeeService.cfc implmente un service contenant une seule fonction. GetEmployeesByID() accepte lID de
dpartement en tant quargument et renvoie tous les employs du dpartement donn. La fonction renvoie galement les dates auxquelles lemploy a rejoint et quitt le dpartement. GetEmployeesByDept() excute la requte SQL suivante :
SELECT employees.emp_no, employees.birth_date, employees.first_name, employees.last_name, employees.gender, employees.hire_date, dept_emp.from_date, dept_emp.to_date FROM employees, dept_emp WHERE dept_emp.emp_no = employees.emp_no and dept_emp.dept_no = departments.dept_no
Important : les exemples de services sont destins uniquement ltablissement dun prototype. Utilisez lexemple de service uniquement dans un environnement de dveloppement fiable. Avant de dployer ce service, assurez-vous daugmenter la protection et de restreindre laccs de faon adquate. Pour obtenir des informations sur la rdaction de services ColdFusion scuriss, voir la documentation ColdFusion About User Security.
<cfcomponent output="false"> <!--This sample service contains functions that illustrate typical service operations. Use these functions as a starting point for creating your own service implementation. This code is for prototyping only. Authenticate the user before allowing them to call these methods. You can find more information at http://www.adobe.com/go/cf9_usersecurity ---> <cffunction name="getEmployeesByDept" output="false" access="remote" <cfargument name="dept_no" type="string" required="true" /> <cfset var qItem=""> <cfquery name="qItem" datasource="employees"> SELECT employees.emp_no, employees.birth_date, employees.first_name, employees.last_name, employees.gender, employees.hire_date, dept_emp.from_date, dept_emp.to_date FROM employees, dept_emp WHERE dept_emp.emp_no = employees.emp_no and dept_emp.dept_no = <CFQUERYPARAM CFSQLTYPE="CF_SQL_VARCHAR" VALUE="#ARGUMENTS.dept_no#"> </cfquery> <cfreturn qItem> </cffunction> </cfcomponent>?> returntype="any" >
(PHP) Lors de la cration du projet, spcifiez PHP comme type de serveurs dapplications. (PHP) Aprs avoir cr le projet, Flash Builder cre un dossier de sortie dans le dossier de racine Web de votre configuration PHP. Le nom par dfaut du projet PHP_Associations est PHP_Associations-debug. (ColdFusion) Lors de la cration du projet, spcifiez ColdFusion comme type de serveurs dapplications. Slectionnez ensuite ColdFusion Flash Remoting.
2 (PHP) Dans PHP_Associations-debug, crez un dossier nomm services. Copiez EmployeeService.php dans
le dossier services.
3 (ColdFusion) Crez un dossier nomm Associations dans la racine Web de votre configuration ColdFusion.
Assurez-vous que PHP_Associations est le projet actif dans Flash Builder. Slectionnez Donnes > Connexion PHP. Pour spcifier la classe PHP, accdez au dossier services et slectionnez EmployeeService.php. Cliquez sur Terminer. Pour plus dinformations, voir Connexion des services de donnes PHP la page 11.
5 Configurez le type de retour des oprations dans EmployeeService.
DepartmentService
Dans le menu contextuel de lopration getAllDepartments, slectionnez Configurer le type de retour. Cliquez sur Suivant pour lancer la dtection automatique du type de retour. Spcifiez Dpartement pour le type de retour personnalis. Cliquez sur Terminer.
EmployeeService
Dans le menu contextuel de lopration getEmployeesByDept(), slectionnez Configurer le type de retour. Cliquez sur Suivant pour lancer la dtection automatique du type de retour. Saisissez la valeur d007 pour le paramtre. Cliquez sur Suivant. Spcifiez Employ comme type de retour personnalis. Cliquez sur Terminer. Pour plus dinformations, voir Configuration des types de donnes pour les oprations de service de donnes la page 28.
Cration de linterface utilisateur et liaison des donnes renvoyes aux composants DataGrid
1 En mode Cration de lditeur MXML, ajoutez deux composants DataGrid la zone de cration.
Le composant DataGrid se trouve dans le dossier Contrles de la vue Composants. Faites glisser deux composants DataGrid vers la zone de cration. Spcifiez deptDG pour le DataGrid Dpartements. Spcifiez empDeptDG pour les ID des composants DataGrid Employs.
2 Dans la vue Donnes/Services, faites glisser lopration getEmployeesByDept() sur le composant DataGrid
Employs.
Lditeur passe en mode Source et met en vidence le paramtre getEmployeesByDept(). Veillez supprimer le gestionnaire dvnement gnr. Accdez au composant DataGrid Employs. Supprimez la rfrence lattribut du gestionnaire creationComplete pour le DataGrid empDeptDG. Une fois supprime la rfrence au gestionnaire dvnement, la premire ligne de code du DataGrid ressemble ce qui suit :
<mx:DataGrid x="361" y="27" id="empDeptDG" dataProvider="{getEmployeesByDeptResult.lastResult}">
Remarque : le gestionnaire creationComplete nest pas requis pour le composant DataGrid Employs. Ce dernier est renseign lorsquun dpartement est slectionn dans le composant DataGrid Dpartements.
3 Passez en mode Cration de lditeur. Dans la vue Donnes/Services, faites glisser lopration
getAllDepartments() sur le composant DataGrid Dpartement.
4 Crez un gestionnaire dvnement pour les modifications apportes au composant DataGrid Dpartements.
Assurez-vous que le composant DataGrid Dpartements est bien slectionn. Dans la vue Proprits, cliquez sur licne Lors de la modification, puis slectionnez Gnrer un gestionnaire dvnement. Lditeur passe en mode Source et slectionne le corps du gestionnaire dvnement. Spcifiez les lments suivants pour le gestionnaire dvnement :
protected function deptDG_changeHandler(event:ListEvent):void { getEmployeesByDeptResult.token = employeeService.getEmployeesByDept(deptDG.selectedItem.dept_no); }
Lorsque vous cliquez sur un dpartement du composant DataGrid Dpartements, le composant DataGrid Employs affiche tous les employs de ce dpartement. Fermez lapplication.
6 En mode Cration de lditeur MXML, slectionnez le composant DataGrid Employs. Dans le menu contextuel,
8 En mode Cration, faites glisser le formulaire sous les composants DataGrid. 9 Ajoutez un bouton ct du formulaire et apportez les modifications suivantes dans la vue Proprits :
Pour ID, spcifiez updateButton. Pour Libell, spcifiez Mise jour de lemploy.
Cliquez sur licne Lors dun clic et spcifiez Gnrer un appel de service.
Pour Service, slectionnez EmployeeService. Pour Opration, spcifiez updateEmployees(). Lditeur passe en mode Source.
77
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="send_data()"> <fx:Declarations> <s:HTTPService id="userRequest" url="http://myserver/myproj/request_post2.php" useProxy="false" method="POST"> <mx:request xmlns=""> <username>{username.text}</username> <emailaddress>{emailaddress.text}</emailaddress> </mx:request> </s:HTTPService> </fx:Declarations> <fx:Script> <![CDATA[ private function send_data():void { userRequest.send(); } ]]> </fx:Script> <mx:Form x="20" y="10" width="300"> <mx:FormItem> <s:Label text="Username" /> <s:TextInput id="username"/> </mx:FormItem> <mx:FormItem> <s:Label text="Email Address" /> <s:TextInput id="emailaddress"/> </mx:FormItem> <s:Button label="Submit" click="send_data()"/> </mx:Form> <mx:DataGrid id="dgUserRequest" x="20" y="160" dataProvider="{userRequest.lastResult.users.user}"> <mx:columns> <mx:DataGridColumn headerText="User ID" dataField="userid"/> <mx:DataGridColumn headerText="User Name" dataField="username"/> </mx:columns> </mx:DataGrid> <s:TextInput x="20" y="340" id="selectedemailaddress" text="{dgUserRequest.selectedItem.emailaddress}"/> </s:Application>
La mthode send() du composant HTTPService effectue lappel la page PHP. Cet appel est effectu dans la mthode send_data() dans le bloc Script du fichier MXML. La proprit resultFormat du composant HTTPService tant dfinie sur object, les donnes sont renvoyes lapplication en tant que graphique dobjets ActionScript. Il sagit de la valeur par dfaut de la proprit resultFormat. Une autre possibilit consiste utiliser une proprit resultFormat dfinie sur e4x pour renvoyer les donnes en tant quobjet XMLList sur lequel vous pouvez excuter ECMAScript pour les oprations XML (E4X). Si vous slectionnez la valeur e4x pour la proprit resultFormat, vous devrez apporter les quelques modifications suivantes au code MXML. Remarque : si le format de rsultat est e4x, nincluez pas le nud racine de la structure XML dans la notation par point lors de la liaison au contrle DataGrid.
Les donnes XML renvoyes dans cet exemple ne contiennent aucune information despace de noms. Pour obtenir des informations sur lutilisation de donnes XML ne contenant pas despaces de noms, voir Traitement de rsultats en tant que donnes XML avec le format de rsultat E4X la page 130.
... <s:HTTPService id="userRequest" url="http://myserver/myproj/request_post2.php" useProxy="false" method="POST" resultFormat="e4x"> ... <mx:DataGrid id="dgUserRequest" x="22" y="150" dataProvider="{userRequest.lastResult.user}"> ...
Le format de rsultat e4x permet en outre de lier la proprit lastResult un objet XMLListCollection, puis de lier cet objet la proprit DataGrid.dataProvider, comme lillustre le fragment de code suivant :
<fx:Declarations> ... <mx:XMLListCollection id="xc" source="{userRequest.lastResult.user}"/> ... </fx:Declarations> ... <mx:DataGrid id="dgUserRequest" x="22" y="128" dataProvider="{xc}"> ...
Script de base de donnes MySQL Le code PHP de cette application utilise une table de base de donnes appele users dans une base de donnes MySQL appele sample. Le script MySQL suivant permet de crer la table :
CREATE TABLE `users` ( `userid` int(10) unsigned NOT NULL auto_increment, `username` varchar(255) collate latin1_general_ci NOT NULL, `emailaddress` varchar(255) collate latin1_general_ci NOT NULL, PRIMARY KEY (`userid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;
Code PHP Cette application appelle la page PHP suivante. Ce code PHP effectue des insertions dans la base de donnes SQL et linterroge, puis retourne les rsultats de linterrogation lapplication dans une structure XML.
//connect to the database. $mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD); mysql_select_db( DATABASE_NAME ); // Quote variable to make safe function quote_smart($value) { // Stripslashes if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Quote if not integer if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } if( $_POST["emailaddress"] AND $_POST["username"]) { //add the user $Query = sprintf("INSERT INTO users VALUES ('', %s, %s)", quote_smart($_POST['username']), quote_smart($_POST['emailaddress'])); $Result = mysql_query( $Query ); } //return a list of all the users $Query = "SELECT * from users"; $Result = mysql_query( $Query ); $Return = "<users>"; while ( $User = mysql_fetch_object( $Result ) ) { $Return .= "<user><userid>".$User->userid."</userid><username>". $User->username."</username><emailaddress>". $User->emailaddress."</emailaddress></user>"; } $Return .= "</users>"; mysql_free_result( $Result ); print ($Return) ?>
La mthode send() du composant HTTPService effectue lappel la page ColdFusion. Cet appel est effectu dans la mthode send_data() dans le bloc Script du fichier MXML. La proprit resultFormat du composant HTTPService tant dfinie sur object, les donnes sont renvoyes lapplication en tant que graphique dobjets ActionScript. Il sagit de la valeur par dfaut de la proprit resultFormat. Une autre possibilit consiste utiliser un format de rsultat e4x pour renvoyer les donnes en tant quobjet XMLList sur lequel vous pouvez excuter ECMAScript pour les oprations XML (E4X). Si vous slectionnez la valeur e4x pour la proprit resultFormat, vous devrez apporter les quelques modifications suivantes au code MXML. Remarque : si le format de rsultat est e4x, nincluez pas le nud racine de la structure XML dans la notation par point lors de la liaison au contrle DataGrid. Les donnes XML renvoyes dans cet exemple ne contiennent aucune information despace de noms. Pour obtenir des informations sur lutilisation de donnes XML ne contenant pas despaces de noms, voir Traitement de rsultats en tant que donnes XML avec le format de rsultat E4X la page 130.
... <s:HTTPService id="userRequest" url="http://myserver:8500/flexapp/returncfxml.cfm" useProxy="false" method="POST" resultFormat="e4x"> ... <mx:DataGrid id="dgUserRequest" x="22" y="128" dataProvider="{userRequest.lastResult.user}"> ...
Le format de rsultat e4x permet de lier la proprit lastResult un objet XMLListCollection, puis de lier cet objet la proprit dataProvider de DataGrid, comme lillustre le fragment de code suivant :
<fx:Declarations> ... <mx:XMLListCollection id="xc" source="{userRequest.lastResult.user}"/> ... </fx:Declarations> ... <mx:DataGrid id="dgUserRequest" x="22" y="128" dataProvider="{xc}"> ...
Script SQL Le code ColdFusion de cette application utilise une table de base de donnes appele users dans une base de donnes MySQL appele sample. Le script MySQL suivant cre la table :
CREATE TABLE `users` ( `userid` int(10) unsigned NOT NULL auto_increment, `username` varchar(255) collate latin1_general_ci NOT NULL, `emailaddress` varchar(255) collate latin1_general_ci NOT NULL, PRIMARY KEY (`userid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;
Code ColdFusion Lapplication rpertorie dans Utilisation de donnes ColdFusion et SQL la page 81 appelle lapplication ColdFusion returncfxml.cfm. Ce code ColdFusion effectue des insertions dans la base de donnes SQL et linterroge, puis renvoie les rsultats de linterrogation lapplication. La page ColdFusion utilise la balise cfquery pour insrer des donnes dans la base de donnes et linterroger. Elle fait appel la balise cfxml pour formater les rsultats de linterrogation dans une structure XML.
<!--- returncfxml.cfm ---> <cfprocessingdirective pageencoding = "utf-8" suppressWhiteSpace = "Yes"> <cfif isDefined("username") and isDefined("emailaddress") and username NEQ ""> <cfquery name="addempinfo" datasource="sample"> INSERT INTO users (username, emailaddress) VALUES ( <cfqueryparam value="#username#" cfsqltype="CF_SQL_VARCHAR" maxlength="255">, <cfqueryparam value="#emailaddress#" cfsqltype="CF_SQL_VARCHAR" maxlength="255"> ) </cfquery> </cfif> <cfquery name="alluserinfo" datasource="sample"> SELECT userid, username, emailaddress FROM users </cfquery> <cfxml variable="userXML"> <users> <cfloop query="alluserinfo"> <cfoutput> <user> <userid>#toString(userid)#</userid> <username>#username#</username> <emailaddress>#emailaddress#</emailaddress> </user> </cfoutput> </cfloop> </users> </cfxml> <cfoutput>#userXML#</cfoutput> </cfprocessingdirective>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <s:HTTPService id="srv" url="catalog.jsp"/> </fx:Declarations> <mx:DataGrid dataProvider="{srv.lastResult.catalog.product}" width="100%" height="100%"/> <s:Button label="Get Data" click="srv.send()"/> </mx:Application>
La mthode send() du composant HTTPService effectue lappel la page JSP. Cet appel est effectu dans lvnement click de lobjet Button dans le fichier MXML. La proprit resultFormat du composant HTTPService tant dfinie sur object, les donnes sont renvoyes lapplication en tant que graphique dobjets ActionScript. Il sagit de la valeur par dfaut de la proprit resultFormat. Une autre possibilit consiste utiliser un format de rsultat e4x pour renvoyer les donnes en tant quobjet XMLList sur lequel vous pouvez excuter ECMAScript pour les oprations XML (E4X). Si vous slectionnez la valeur e4x pour la proprit resultFormat, vous devrez apporter les quelques modifications suivantes au code MXML. Remarque : si le format de rsultat est e4x, nincluez pas le nud racine de la structure XML dans la notation par point lors de la liaison au contrle DataGrid. Les donnes XML renvoyes dans cet exemple ne contiennent aucune information despace de noms. Pour obtenir des informations sur lutilisation de donnes XML ne contenant pas despaces de noms, voir Traitement de rsultats en tant que donnes XML avec le format de rsultat E4X la page 130.
... <s:HTTPService id="srv" url="catalog.jsp" resultFormat="e4x"/> ... <mx:DataGrid dataProvider="{srv.lastResult.product}" width="100%" height="100%"/>
Lorsque vous utilisez le format de rsultat e4x, vous pouvez si vous le souhaitez lier la proprit lastResult un objet XMLListCollection, puis lier cet objet la proprit DataGrid.dataProvider :
<fx:Declarations> ... <mx:XMLListCollection id="xc" source="{userRequest.lastResult.user}"/> ... </fx:Declarations> ... <mx:DataGrid id="dgUserRequest" x="22" y="128" dataProvider="{xc}"> ...
Code JSP Lexemple suivant prsente la page JSP utilise dans cette application. Cette page JSP nappelle pas de base de donnes directement. Elle obtient ses donnes dune classe Java appele ProductService, qui son tour utilise une classe Java appele Product pour reprsenter des produits particuliers.
<%@page import="flex.samples.product.ProductService, flex.samples.product.Product, java.util.List"%> <?xml version="1.0" encoding="utf-8"?> <catalog> <% ProductService srv = new ProductService(); List list = null; list = srv.getProducts(); Product product; for (int i=0; i<list.size(); i++) { product = (Product) list.get(i); %> <product productId="<%= product.getProductId()%>"> <name><%= product.getName() %></name> <description><%= product.getDescription() %></description> <price><%= product.getPrice() %></price> <image><%= product.getImage() %></image> <category><%= product.getCategory() %></category> <qtyInStock><%= product.getQtyInStock() %></qtyInStock> </product> <% } %> </catalog>
<?xml version="1.0"?> <!-- fds\rpc\HttpServiceInAS.mxml. Compiles --> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Script> <![CDATA[ import mx.controls.Alert; import mx.rpc.http.HTTPService; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; private var service:HTTPService public function useHttpService(parameters:Object):void { service = new HTTPService(); service.url = "catalog.jsp"; service.method = "POST"; service.addEventListener("result", httpResult); service.addEventListener("fault", httpFault); service.send(parameters); } public function httpResult(event:ResultEvent):void { var result:Object = event.result; //Do something with the result. } public function httpFault(event:FaultEvent):void { var faultstring:String = event.fault.faultString; Alert.show(faultstring); } ]]> </fx:Script> </mx:Application>
Adobe Flash Player fonctionne au sein dun sandbox de scurit qui limite les donnes auxquelles les applications Flex et les autres applications cres avec Flash peuvent accder via HTTP. Les applications cres avec Flash peuvent accder par HTTP uniquement aux ressources figurant dans le mme domaine et par le mme protocole les ayant traites. Cela constitue un problme pour les services Web qui sont gnralement atteints partir demplacements distants. Le service Proxy, disponible dans LiveCycle Data Services ES et BlazeDS, intercepte les demandes aux services Web distants et les redirige, puis renvoie les rponses au client. Si vous nutilisez pas LiveCycle Data Services ES ou BlazeDS, vous pouvez accder aux services Web dans le mme domaine que lapplication ou utiliser un fichier crossdomain.xml (de rgulation interdomaines) permettant laccs partir du domaine de lapplication et devant tre install sur le serveur Web hbergeant le service RPC. Pour obtenir des informations de rfrence API sur le composant WebService, voir mx.rpc.soap.mxml.WebService. Exemple dapplication WebService Lexemple de code suivant concerne une application qui utilise un composant WebService pour appeler des oprations de service Web. Code MXML Dans lexemple suivant, lapplication appelle un service Web. Ce service interroge une table de base de donnes SQL appele users et renvoie des donnes lapplication, dans laquelle ces donnes sont lies la proprit dataProvider dun contrle DataGrid o elles sont affiches. Lapplication envoie galement le nom dutilisateur et ladresse lectronique des nouveaux utilisateurs au service Web, qui procde une insertion dans la table de base de donnes des utilisateurs. Limplmentation principale du service Web est un composant ColdFusion ; le mme composant ColdFusion est accd en tant quobjet distant dans Utilisation de composants RemoteObject la page 104.
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <s:WebService id="userRequest" wsdl="http://localhost:8500/flexapp/returnusers.cfc?wsdl"> <mx:operation name="returnRecords" resultFormat="object" fault="mx.controls.Alert.show(event.fault.faultString)" result="remotingCFCHandler(event)"/> <mx:operation name="insertRecord" result="insertCFCHandler()" fault="mx.controls.Alert.show(event.fault.faultString)"/> </s:WebService> </fx:Declarations> <fx:Script> <![CDATA[ import mx.rpc.events.ResultEvent; private function remotingCFCHandler(e:ResultEvent):void { dgUserRequest.dataProvider = e.result; } private function insertCFCHandler():void { userRequest.returnRecords();
} private function clickHandler():void { userRequest.insertRecord(username.text, emailaddress.text); } ]]> </fx:Script> <mx:Form x="22" y="10" width="300"> <mx:FormItem> <s:Label text="Username" /> <s:TextInput id="username"/> </mx:FormItem> <mx:FormItem> <s:Label text="Email Address" /> <s:TextInput id="emailaddress"/> </mx:FormItem> <s:Button label="Submit" click="clickHandler()"/> </mx:Form> <mx:DataGrid id="dgUserRequest" x="22" y="160"> <mx:columns> <mx:DataGridColumn headerText="User ID" dataField="USERID"/> <mx:DataGridColumn headerText="User Name" dataField="USERNAME"/> </mx:columns> </mx:DataGrid> <s:TextInput x="22" y="320" id="selectedemailaddress" text="{dgUserRequest.selectedItem.emailaddress}"/> </s:Application>
Document WSDL Lexemple suivant prsente le document WSDL qui dfinit lAPI du service Web :
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://flexapp" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://flexapp" xmlns:intf="http://flexapp" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://rpc.xml.coldfusion" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!--WSDL created by ColdFusion version 8,0,0,171651--> <wsdl:types> <schema targetNamespace="http://rpc.xml.coldfusion" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://flexapp"/> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="CFCInvocationException"> <sequence/> </complexType> <complexType name="QueryBean"> <sequence> <element name="columnList" nillable="true" type="impl:ArrayOf_xsd_string"/>
<element name="data" nillable="true" type="impl:ArrayOfArrayOf_xsd_anyType"/> </sequence> </complexType> </schema> <schema targetNamespace="http://flexapp" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://rpc.xml.coldfusion"/> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="ArrayOf_xsd_string"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> </restriction> </complexContent> </complexType> <complexType name="ArrayOfArrayOf_xsd_anyType"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[][]"/> </restriction> </complexContent> </complexType> </schema> </wsdl:types> <wsdl:message name="CFCInvocationException"> <wsdl:part name="fault" type="tns1:CFCInvocationException"/> </wsdl:message> <wsdl:message name="returnRecordsRequest"> </wsdl:message> <wsdl:message name="insertRecordResponse"> </wsdl:message> <wsdl:message name="returnRecordsResponse"> <wsdl:part name="returnRecordsReturn" type="tns1:QueryBean"/> </wsdl:message> <wsdl:message name="insertRecordRequest"> <wsdl:part name="username" type="xsd:string"/> <wsdl:part name="emailaddress" type="xsd:string"/> </wsdl:message> <wsdl:portType name="returncfxml"> <wsdl:operation name="insertRecord" parameterOrder="username emailaddress"> <wsdl:input message="impl:insertRecordRequest" name="insertRecordRequest"/> <wsdl:output message="impl:insertRecordResponse" name="insertRecordResponse"/> <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/> </wsdl:operation> <wsdl:operation name="returnRecords"> <wsdl:input message="impl:returnRecordsRequest" name="returnRecordsRequest"/> <wsdl:output message="impl:returnRecordsResponse" name="returnRecordsResponse"/> <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="returncfxml.cfcSoapBinding" type="impl:returncfxml"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="insertRecord"> <wsdlsoap:operation soapAction=""/>
<wsdl:input name="insertRecordRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://flexapp" use="encoded"/> </wsdl:input> <wsdl:output name="insertRecordResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://flexapp" use="encoded"/> </wsdl:output> <wsdl:fault name="CFCInvocationException"> <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://flexapp" use="encoded"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="returnRecords"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="returnRecordsRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://flexapp" use="encoded"/> </wsdl:input> <wsdl:output name="returnRecordsResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://flexapp" use="encoded"/> </wsdl:output> <wsdl:fault name="CFCInvocationException"> <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://flexapp" use="encoded"/> </wsdl:fault> </wsdl:operation> </wsdl:binding> <wsdl:service name="returncfxmlService"> <wsdl:port binding="impl:returncfxml.cfcSoapBinding" name="returncfxml.cfc"> <wsdlsoap:address location="http://localhost:8500/flexapp/returnusers.cfc"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
<?xml version="1.0"?> <!-- fds\rpc\WebServiceInAS.mxml --> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" <fx:Script> <![CDATA[ import mx.rpc.soap.WebService; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; private var ws:WebService; public function useWebService(intArg:int, strArg:String):void { ws = new WebService(); ws.wsdl="http://myserver:8500/flexapp/app1.cfc?wsdl"; ws.echoArgs.addEventListener("result", echoResultHandler); ws.addEventListener("fault", faultHandler); ws.loadWSDL(); ws.echoArgs(intArg, strArg); } public function echoResultHandler(event:ResultEvent):void { var retStr:String = event.result.echoStr; var retInt:int = event.result.echoInt; //Do something. } public function faultHandler(event:FaultEvent):void { //deal with event.fault.faultString, etc } ]]> </fx:Script> </mx:Application>
Balise
<binding>
Description Spcifie le protocole que les clients (les applications Flex, par exemple) utilisent pour communiquer avec un service Web. Il existe des liaisons pour SOAP, HTTP GET, HTTP POST et MIME. Flex ne prend en charge que la liaison SOAP. Spcifie la valeur dune erreur renvoye suite un problme de traitement dun message. Spcifie le message envoy par un client (une application Flex, par exemple) un service Web. Dfinit les donnes transfres par une opration WebService.
<operation> Dfinit une combinaison des balises <input>, <output> et <fault>. <output> <port> <portType> <service>
Spcifie le message envoy par le service Web un client de service Web (une application Flex, par exemple). Spcifie un point de terminaison de service Web, dfinissant lassociation entre une liaison et une adresse de rseau. Dfinit la ou les oprations fournies par un service Web. Dfinit une collection de balises <port>. Chaque service se mappe une balise <portType> et spcifie diffrentes manires daccder aux oprations dans cette balise <portType>. Dfinit les types de donnes utiliss par les messages dun service Web.
<types>
La proprit style de la balise <soap:binding> associe dtermine le style dopration. Dans cet exemple, le style est document. Toute opration dans un service peut spcifier le mme style ou remplacer le style spcifi pour le port associ au service, comme lillustre lexemple suivant :
<operation name="SendMSN"> <soap:operation soapAction="http://www.bindingpoint.com/ws/imalert/ SendMSN"style="document"/>
Pour crer lobjet QName dans le premier paramtre de la mthode SOAPHeader(), utilisez le constructeur suivant :
QName(uri:String, localName:String)
Le paramtre content du constructeur SOAPHeader() est un ensemble de paires nom-valeur bases sur le format suivant :
{name1:value1, name2:value2}
La mthode addSimpleHeader() constitue un raccourci pour un en-tte SOAP nom-valeur unique. Lorsque vous utilisez la mthode addSimpleHeader(), vous crez les objets SOAPHeader et QName dans les paramtres de la mthode. La mthode addSimpleHeader() prsente la signature suivante :
addSimpleHeader(qnameLocal:String, qnameNamespace:String, headerName:String, headerValue:Object):void
qnameLocal est le nom local de len-tte QName. qnameNamespace est lespace de noms de len-tte QName. headerName est le nom de len-tte. headerValue est la valeur de len-tte. Il peut sagir dune chane dans le cas dune valeur simple, dun objet auquel un codage XML de base sera appliqu ou de donnes XML si vous souhaitez spcifier les donnes XML de len-tte vous-mme.
Dans lexemple suivant, le code indique comment utiliser les mthodes addHeader() et addSimpleHeader() pour ajouter un en-tte SOAP. Les mthodes sont appeles dans une fonction dcouteur dvnement nomme headers et lcouteur dvnement est assign dans la proprit load dune balise <mx:WebService> :
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:WebService id="ws" wsdl="http://myserver:8500/flexapp/app1.cfc?wsdl" load="headers();"/> </fx:Declarations> <fx:Script> <![CDATA[ import mx.rpc.soap.SOAPHeader; private var header1:SOAPHeader; private var header2:SOAPHeader; public function headers():void { // Create QName and SOAPHeader objects. var q1:QName=new QName("http://soapinterop.org/xsd", "Header1"); header1=new SOAPHeader(q1, {string:"bologna",int:"123"}); header2=new SOAPHeader(q1, {string:"salami",int:"321"}); // Add the header1 SOAP Header to all web service requests. ws.addHeader(header1); // Add the header2 SOAP Header to the getSomething operation. ws.getSomething.addHeader(header2); // Within the addSimpleHeader method, // which adds a SOAP header to web //service requests, create SOAPHeader and QName objects. ws.addSimpleHeader ("header3", "http://soapinterop.org/xsd", "foo","bar"); } ]]> </fx:Script> </s:Application>
Suppression den-ttes SOAP Utilisez la mthode clearHeaders() de lobjet WebService ou Operation pour supprimer les en-ttes SOAP ajouts lobjet, ainsi que lillustre lexemple suivant pour un objet WebService. Vous devez appeler la mthode clearHeaders() au niveau (WebService ou Operation) auquel len-tte a t ajout.
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <!-- The value of the destination property is for demonstration only and is not a real destination. --> <mx:WebService id="ws" wsdl="http://myserver:8500/flexapp/app1.cfc?wsdl" load="headers();"/> </fx:Declarations> <fx:Script> <![CDATA[ import mx.rpc.*; import mx.rpc.soap.SOAPHeader; private function headers():void { // Create QName and SOAPHeader objects. var q1:QName=new QName("Header1", "http://soapinterop.org/xsd"); var header1:SOAPHeader=new SOAPHeader(q1, {string:"bologna",int:"123"}); var header2:SOAPHeader=new SOAPHeader(q1, {string:"salami",int:"321"}); // Add the header1 SOAP Header to all web service request. ws.addHeader(header1); // Add the header2 SOAP Header to the getSomething operation. ws.getSomething.addHeader(header2); // Within the addSimpleHeader method, which adds a SOAP header to all // web service requests, create SOAPHeader and QName objects. ws.addSimpleHeader("header3","http://soapinterop.org/xsd", "foo", "bar"); } // Clear SOAP headers added at the WebService and Operation levels. private function clear():void { ws.clearHeaders(); ws.getSomething.clearHeaders(); } ]]> </fx:Script> <s:Button label="Clear headers and run again" click="clear()"/> </s:Application>
Lexemple suivant prsente un couteur dvnement result qui stocke dans une variable lURL de point de terminaison retourne par un service Web, puis transmet cette variable une fonction afin de modifier lURL de point de terminaison pour les demandes ultrieures :
... public function onLoginResult(event:ResultEvent):void { //Extract the new service endpoint from the login result. var newServiceURL = event.result.serverUrl; // Redirect all service operations to the URL received in the login result. serviceName.endpointURI=newServiceURL; } ...
Un service Web ncessitant la transmission dinformations didentification de scurit peut galement renvoyer un identifiant que vous devrez attacher un en-tte SOAP pour toute demande ultrieure. Pour plus dinformations, voir Utilisation den-ttes SOAP la page 93.
xsd:element maxOccurs == 1
Object
La valeur dentre est traite comme une entit unique. Si le type associ est un tableau cod SOAP, les tableaux et les implmentations mx.collection.IList sont transmis intacts pour tre traits par le codeur SOAP comme des cas spciaux pour ce type. La valeur dentre doit tre itrable (un tableau ou une implmentation mx.collections.IList, par exemple), bien que les valeurs non itrables soient enveloppes avant traitement. Les lments individuels sont cods en tant quentits distinctes conformment la dfinition. Si la valeur dentre nest pas dfinie ou est null, la sortie code est omise.
Object
xsd:element minOccurs == 0
Object
Le tableau suivant prsente les mappages de codage de types ActionScript 3 en types intgrs de schma XML.
Type de schma XML
xsd:anyType xsd:anySimpleType
Remarques Boolean -> xsd:boolean ByteArray -> xsd:base64Binary Date -> xsd:dateTime int -> xsd:int Number -> xsd:double String -> xsd:string uint -> xsd:unsignedInt
xsd:base64Binary
flash.utils.ByteArray
ligne).
xsd:boolean
Les mthodes daccesseur Date.UTC sont utilises. Nombre utilis pour dfinir Date.time. Chane considre prformate et code telle quelle. Les mthodes daccesseur Date.UTC sont utilises. Nombre utilis pour dfinir Date.time. Chane considre prformate et code telle quelle.
Number.toString() est utilis. Notez que Infinity, -
xsd:dateTime
xsd:decimal
Number String
Infinity et NaN ne sont pas valides pour ce type. Chane dabord convertie en Number.
xsd:double
Number String
xsd:duration
Object
xsd:float
Number String
xsd:gDay
Nombre directement utilis pour le jour. Chane analyse en tant que nombre du jour.
Date.getUTCMonth() est utilis.
xsd:gMonth
Nombre directement utilis pour le mois. Chane analyse en tant que nombre du mois.
Date.getUTCMonth() et Date.getUTCDate() sont
xsd:gMonthDay
Date String
xsd:gYear
Nombre directement utilis pour lanne. Chane analyse en tant que nombre de lanne.
Date.getUTCFullYear() et Date.getUTCMonth()
xsd:gYearMonth
Date String
xsd:hexBinary xsd:integer et drivs : xsd:negativeInteger xsd:nonNegativeInteger xsd:positiveInteger xsd:nonPositiveInteger xsd:int xsd:unsignedInt xsd:long xsd:unsignedLong xsd:short xsd:unsignedShort
mx.utils.HexEncoder est utilis. Limit la plage de Number. Chane dabord convertie en Number.
xsd:string et drivs : xsd:ID xsd:IDREF xsd:IDREFS xsd:ENTITY xsd:ENTITIES xsd:language xsd:Name xsd:NCName xsd:NMTOKEN xsd:NMTOKENS xsd:normalizedString xsd:token xsd:time
Object
Les mthodes daccesseur Date.UTC sont utilises. Nombre utilis pour dfinir Date.time. Chane considre prformate et code telle quelle. Si la dfinition dlment de schma XML correspondante comporte minOccurs > 0, une valeur null est code laide de xsi:nil ; dans le cas contraire, llment est entirement omis.
xsi:nil
null
soapenc:Array
Les tableaux cods SOAP sont traits comme des cas spciaux et ne sont pris en charge quavec les services Web de style cods RPC. Cod de la mme manire que xsd:base64Binary. Tout autre type cod SOAP est trait comme sil figurait dans lespace de noms XSD en fonction de la proprit localName de lobjet QName du type.
Remarques Si le contenu est vide -> xsd:string. Si le contenu est projet sur Number et la valeur est NaN ; ou si le contenu commence par 0 ou -0 , ou si le contenu se termine par E : alors, si le contenu est true ou false -> xsd:boolean dans le cas contraire -> xsd:string. Dans le cas contraire, le contenu est un nombre valide et donc -> xsd:double.
xsd:base64Binary xsd:boolean
flash.utils.ByteArray
Boolean
Si le contenu est true ou 1 , alors true ; dans le cas contraire, false. Sil nexiste aucune information de fuseau horaire, lheure locale est utilise. Sil nexiste aucune information de fuseau horaire, lheure locale est utilise. Le contenu est cr via Number(content) et est donc limit la plage de Number. Le contenu est cr via Number(content) et est donc limit la plage de Number. Le contenu est renvoy avec rduction des espaces. Le contenu est converti via Number(content) et est donc limit la plage de Number. Le contenu est converti via uint(content). Le contenu est converti via uint(content). Le contenu est renvoy avec rduction des espaces. Le contenu est converti via uint(content). Le contenu est renvoy avec rduction des espaces.
mx.utils.HexDecoder est utilis.
xsd:date
Date
xsd:dateTime
Date
xsd:decimal
Number
xsd:double
Number
xsd:duration xsd:float
String Number
xsd:integer
et drivs : xsd:byte xsd:int xsd:long xsd:negativeInteger xsd:nonNegativeInteger xsd:nonPositiveInteger xsd:positiveInteger xsd:short xsd:unsignedByte xsd:unsignedInt xsd:unsignedLong xsd:unsignedShort xsd:string
Number
String
et drivs :
xsd:ID xsd:IDREF xsd:IDREFS xsd:ENTITY xsd:ENTITIES xsd:language xsd:Name xsd:NCName xsd:NMTOKEN xsd:NMTOKENS xsd:normalizedString xsd:token xsd:time
Date
Sil nexiste aucune information de fuseau horaire, lheure locale est utilise.
xsi:nil
null
Le tableau suivant prsente les mappages de dcodage de types cods SOAP en types ActionScript 3.
Type SOAPENC
soapenc:Array
Remarques
Les tableaux cods SOAP sont traits comme des cas spciaux. Si makeObjectsBindable prsente la valeur true, le rsultat est mx.collections.ArrayCo envelopp dans une classe ArrayCollection ; dans le cas contraire, un llection tableau simple est renvoy.
flash.utils.ByteArray
soapenc:base64 soapenc:*
Dcod de la mme manire que xsd:base64Binary. Tout autre type cod SOAP est trait comme sil figurait dans lespace de noms XSD en fonction de la proprit localName de lobjet QName du type.
Object
Le tableau suivant prsente les mappages de dcodage de types de donnes personnaliss en types de donnes ActionScript 3.
Type personnalis Apache Map
http://xml.apache.org/x ml-soap:Map
Remarques La reprsentation SOAP de java.util.Map. Keys doit tre reprsentable sous forme de chanes.
Apache Rowset
http://xml.apache.org/x ml-soap:Rowset
Tableau dobjets
ColdFusion QueryBean
Tableau dobjets
Si makeObjectsBindable prsente la valeur true, le tableau rsultant est envelopp dans une classe ArrayCollection.
Les structures ou attributs de structures de schma XML suivants sont ignors et ne sont pas pris en charge dans Flex 4 :
<attribute use="required"/> <element substitutionGroup="..." unique="..." key="..." keyref="..." field="..." selector="..."/> <simpleType> <restriction> <minExclusive> <minInclusive> <maxExclusiv> <maxInclusive> <totalDigits> <fractionDigits> <length> <minLength> <maxLength> <enumeration> <whiteSpace> <pattern> </restriction> </simpleType> <complexType final="..." block="..." mixed="..." abstract="..."/> <any processContents="..."/> <annotation>
Vous voulez alors invoquer une opration getUser sur un service Web renvoyant les donnes XML suivantes :
<tns:getUserResponse xmlns:tns="http://example.uri"> <tns:firstName>Ivan</tns:firstName> <tns:lastName>Petrov</tns:lastName> </tns:getUserResponse>
A linvocation de lopration getUser, pour tre certain dobtenir une occurrence de la classe User, et non un objet gnrique, faites figurer le code ActionScript suivant dans une mthode de lapplication :
SchemaTypeRegistry.getInstance().registerClass(new QName("http://example.uri", "getUserResponse"), User); SchemaTypeRegistry.getInstance() est une mthode statique qui renvoie loccurrence par dfaut du registre de
type. Dans la plupart des cas, cest tout ce dont vous avez besoin. Cette manire de procder enregistre toutefois un objet QName donn avec la mme classe ActionScript travers toutes les oprations de service Web de lapplication. Pour enregistrer diffrentes classes pour diffrentes oprations, faites figurer le code suivant dans une mthode de lapplication :
var qn:QName = new QName("http://the.same", "qname"); var typeReg1:SchemaTypeRegistry = new SchemaTypeRegistry(); var typeReg2:SchemaTypeRegistry = new SchemaTypeRegistry(); typeReg1.registerClass(qn, someClass); myWS.someOperation.decoder.typeRegistry = typeReg1; typeReg2.registerClass(qn, anotherClass); myWS.anotherOperation.decoder.typeRegistry = typeReg2;
Lors de linvocation de someOperation, Flex appelle la mthode decodeResponse() de la classe MyDecoder. Il incombe ensuite limplmentation personnalise de traiter le message SOAP intgral et de produire les objets ActionScript attendus.
Vous pouvez galement utiliser des composants RemoteObject contenant des objets PHP et .NET conjointement avec des logiciels tiers, tels que les projets open source AMFPHP et SabreAMF ainsi que Midnight Coders WebORB. Pour plus dinformations, voir les sites Web suivants :
Zend Framework http://framework.zend.com/ AMFPHP http://amfphp.sourceforge.net/ SabreAMF http://www.osflash.org/sabreamf Midnight Coders WebORB http://www.themidnightcoders.com/
Les composants RemoteObject utilisent le protocole AMF pour envoyer et recevoir des donnes, tandis que les composants WebService et HTTPService font appel au protocole HTTP. AMF est considrablement plus rapide que HTTP. Le codage et la configuration ct serveur sont toutefois gnralement plus complexes. De mme que les composants HTTPService et WebService, les composants RemoteObject peuvent tre utiliss pour afficher le rsultat dune requte de base de donnes dans une application. Vous pouvez galement utiliser les composants pour insrer, mettre jour et supprimer les donnes dune base de donnes. Une fois le rsultat de la requte renvoy lapplication, vous pouvez lafficher dans un ou plusieurs contrles de linterface utilisateur. Pour obtenir des informations de rfrence API sur le composant RemoteObject, voir mx.rpc.remoting.mxml.RemoteObject.
dgUserRequest.dataProvider = e.result; } private function insertHandler():void { userRequest.returnRecords(); } private function clickHandler():void { userRequest.insertRecord(username.text, emailaddress.text); } ]]> </fx:Script> <mx:Form x="22" y="10" width="300"> <mx:FormItem> <s:Label text="Username" /> <s:TextInput id="username"/> </mx:FormItem> <mx:FormItem> <s:Label text="Email Address" /> <s:TextInput id="emailaddress"/> </mx:FormItem> <s:Button label="Submit" click="clickHandler()"/> </mx:Form> <mx:DataGrid id="dgUserRequest" x="22" y="200"> <mx:columns> <mx:DataGridColumn headerText="User ID" dataField="userid"/> <mx:DataGridColumn headerText="User Name" dataField="username"/> </mx:columns> </mx:DataGrid> </s:Application>
Dans cette application, la proprit destination du composant RemoteObject est dfinie sur Coldfusion et la proprit source est dfinie sur le nom complet du composant ColdFusion. Par contraste, lorsque vous utilisez LiveCycle Data Services ES ou BlazeDS, vous spcifiez un nom de classe complet dans la proprit source dune destination de service distant dans un fichier de configuration (par dfaut, remotingconfig.xml). Indiquez le nom de la destination dans la proprit destination du composant RemoteObject. La classe de destination doit galement comporter un constructeur no-args. Avec ColdFusion, vous pouvez procder de cette manire pour configurer une destination au lieu dappliquer la proprit source au composant RemoteObject. Composant ColdFusion Lapplication appelle le composant ColdFusion suivant. Ce code ColdFusion effectue des insertions et des interrogations de base de donnes SQL, puis renvoie les rsultats de linterrogation lapplication. La page ColdFusion utilise la balise cfquery pour insrer des donnes dans la base de donnes et pour linterroger. Elle fait appel la balise cfreturn pour formater les rsultats de linterrogation en tant quobjet dinterrogation ColdFusion.
<cfcomponent name="returnusers"> <cffunction name="returnRecords" access="remote" returnType="query"> <cfquery name="alluserinfo" datasource="flexcf"> SELECT userid, username, emailaddress FROM users </cfquery> <cfreturn alluserinfo> </cffunction> <cffunction name="insertRecord" access="remote" returnType="void"> <cfargument name="username" required="true" type="string"> <cfargument name="emailaddress" required="true" type="string"> <cfquery name="addempinfo" datasource="flexcf"> INSERT INTO users (username, emailaddress) VALUES ( <cfqueryparam value="#arguments.username#" cfsqltype="CF_SQL_VARCHAR" maxlength="255">, <cfqueryparam value="#arguments.emailaddress#" cfsqltype="CF_SQL_VARCHAR" maxlength="255"> ) </cfquery> <cfreturn> </cffunction> </cfcomponent>
<?xml version="1.0"?> <!-- fds\rpc\ROInAS.mxml --> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Script> <![CDATA[ import mx.controls.Alert; import mx.rpc.remoting.RemoteObject; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; [Bindable] public var empList:Object; public var employeeRO:RemoteObject; public function useRemoteObject(intArg:int, strArg:String):void { employeeRO = new RemoteObject(); employeeRO.destination = "SalaryManager"; employeeRO.getList.addEventListener("result", getListResultHandler); employeeRO.addEventListener("fault", faultHandler); employeeRO.getList(deptComboBox.selectedItem.data); } public function getListResultHandler(event:ResultEvent):void { // Do something empList=event.result; } public function faultHandler (event:FaultEvent):void { // Deal with event.fault.faultString, etc. Alert.show(event.fault.faultString, 'Error'); } ]]> </fx:Script> <s:ComboBox id="deptComboBox"/> </mx:Application>
Lorsque vous configurez une destination dobjet distant pour accder des objets avec tat, Flex cre lobjet une seule fois sur le serveur et maintient ltat entre les appels de mthode. Si le stockage de lobjet dans ltendue de lapplication ou de la session provoque des problmes de mmoire, utilisez ltendue de la demande.
Dans le ct Java, la mthode getHelloData() peut encapsuler tous les lments ncessaires pour appeler une mthode mtier sur un objet EJB. Dans lexemple ci-aprs, la mthode Java effectue les actions suivantes :
cre un nouveau contexte initial pour appeler lobjet EJB ; effectue une recherche JNDI qui obtient un objet racine EJB ; appelle la mthode create() de lobjet racine EJB ; appelle la mthode sayHello() de lobjet EJB.
... public void getHelloData() { try{ InitialContext ctx = new InitialContext(); Object obj = ctx.lookup("/Hello"); HelloHome ejbHome = (HelloHome) PortableRemoteObject.narrow(obj, HelloHome.class); HelloObject ejbObject = ejbHome.create(); String message = ejbObject.sayHello(); } catch (Exception e); } ...
addHeader() addProperty() deleteHeader() hasOwnProperty() isPropertyEnumerable() isPrototypeOf() registerClass() toLocaleString() toString() unwatch() valueOf() watch()
Veillez en outre ce que les noms des mthodes ne commencent pas par un caractre de soulignement (_). Pour accder aux mthodes (oprations) RemoteObject, il suffit gnralement de les nommer daprs la variable de service. Des conflits de noms risquent toutefois de se produire si le nom dune opration correspond une mthode dfinie pour le service. Dans ActionScript, vous pouvez appliquer la mthode suivante un composant RemoteObject pour renvoyer lopration du nom donn :
public function getOperation(name:String):Operation
Liaison de type Java prise en charge java.util.Collection, Object[ ] (tableau natif) Si le type est une interface, il est mapp sur les implmentations dinterface suivantes :
List devient ArrayList. SortedSet devient TreeSet. Set devient HashSet. Collection devient ArrayList.
Une nouvelle occurrence dune implmentation Collection personnalise est lie ce type. Tableau (trs dense) Boolean Chane "true" ou "false" flash.utils.ByteArray flash.utils.IExternalizable Date byte [] java.io.Externalizable java.util.Date (format pour UTC (Coordinated Universal Time)) int/uint java.lang.Integer java.util.Date, java.util.Calendar, java.sql.Timestamp, java.sql.Time, java.sql.Date java.util.Map java.lang.Boolean java.util.Map Boolean, boolean, String
java.lang.Double, java.lang.Long, java.lang.Float, java.lang.Integer, java.lang.Short, java.lang.Byte, java.math.BigDecimal, java.math.BigInteger, String, types primitifs de double, long, float, int, short, byte primitives java.lang.Double, java.lang.Long, java.lang.Float, java.lang.Integer, java.lang.Short, java.lang.Byte, java.math.BigDecimal, java.math.BigInteger, String, 0 (zro) Si null est envoy, types primitifs de double, long, float, int, short, byte.
null Number
null java.lang.Double
Objet (gnrique)
java.util.Map
Si une interface Map est spcifie, cre un nouveau java.util.HashMap pour java.util.Map et un nouveau java.util.TreeMap pour java.util.SortedMap. java.lang.String, java.lang.Boolean, java.lang.Number, java.math.BigInteger, java.math.BigDecimal, char[], tout type de nombre primitif Objet typ
String
java.lang.String
Objet typ
Objet typ Lorsque vous utilisez une balise de mtadonnes [RemoteClass] qui spcifie un nom de classe distante. Le type Bean doit comporter un constructeur no-args public.
Type ActionScript (AMF 3) Non dfini XML XMLDocument (type XML existant)
org.w3c.dom.Document org.w3c.dom.Document Vous pouvez activer la prise en charge des donnes XML existantes pour le type XMLDocument sur tout canal dfini dans le fichier services-config.xml. Ce paramtre nintervient que dans lenvoi de donnes du serveur au client ; il dtermine la manire dont les occurrences org.w3c.dom.Document sont envoyes ActionScript. Pour plus dinformations, voir .
Les valeurs primitives ne peuvent pas tre dfinies sur null dans Java. Lors de la transmission de valeurs Boolean et Number du client vers un objet Java, Flex interprte les valeurs null comme valeurs par dfaut des types primitifs ; par exemple, 0 pour double, float, long, int, short, byte, \u0000 pour char et false pour Boolean. Seuls les types Java primitifs obtiennent des valeurs par dfaut. LiveCycle Data Services ES et BlazeDS traitent les objets java.lang.Throwable comme tout autre objet typ. Ces objets sont traits avec des rgles recherchant des champs publics et des proprits bean. Des objets typs sont renvoys au client. Ces rgles sont identiques aux rgles bean ordinaires, ceci prs quelles recherchent des getters pour les proprits en lecture seule. La quantit dinformations obtenues dune exception Java est ainsi plus importante. Afin de spcifier un comportement existant pour les objets Throwable, dfinissez la proprit legacy-throwable dun canal sur true. Pour plus dinformations, voir . Vous pouvez transmettre des tableaux stricts en tant que paramtres des mthodes sattendant une implmentation des API java.util.Collection ou de tableau Java natif. Une collection Java peut contenir nimporte quel nombre de types dobjets, alors quun tableau Java ncessite que les entres soient du mme type (java.lang.Object[ ] et int[ ], par exemple). LiveCycle Data Services ES et BlazeDS convertissent aussi les tableaux stricts ActionScript en implmentations appropries pour les interfaces API Collection courantes. Par exemple, si un tableau strict ActionScript est envoy la mthode dobjet Java public void addProducts(java.util.Set products), LiveCycle Data Services ES et BlazeDS le convertissent en une occurrence java.util.HashSet avant de le transmettre en tant que paramtre, car HashSet est une implmentation approprie pour linterface java.util.Set. De mme, LiveCycle Data Services ES et BlazeDS transmettent une occurrence de java.util.TreeSet aux paramtres typs avec linterface java.util.SortedSet. LiveCycle Data Services ES et BlazeDS transmettent une occurrence de java.util.ArrayList aux paramtres typs avec linterface java.util.List et toute autre interface dveloppant java.util.Collection. Ces types sont ensuite renvoys au client en tant quoccurrences mx.collections.ArrayCollection. Pour renvoyer au client les tableaux ActionScript normaux, vous devez dfinir llment legacy-collection sur true dans la section serialization des proprits dune dfinition de canal. Pour plus dinformations, voir . Mappage explicite dobjets ActionScript et Java Pour les objets Java que LiveCycle Data Services ES et BlazeDS ne traitent pas implicitement, les valeurs trouves dans les proprits bean publiques avec les mthodes get/set et les variables publiques sont envoyes au client en tant que proprits sur un objet. Les proprits prives, les constantes, les proprits statiques et les proprits en lecture seule entre autres ne sont pas srialises. Pour les objets ActionScript, les proprits publiques dfinies avec les accesseurs get/set et les variables publiques sont envoyes au serveur.
LiveCycle Data Services ES et BlazeDS utilisent la classe Java standard java.beans.Introspector afin dobtenir des descripteurs de proprits pour une classe JavaBean. Il fait en outre appel la rflexion pour collecter des champs publics sur une classe et a recours de prfrence des proprits bean plutt qu des champs. Les noms des proprits Java et ActionScript doivent correspondre. Le code Flash Player natif dtermine la manire dont les classes ActionScript sont introspectes sur le client. Dans la classe ActionScript, utilisez la balise de mtadonnes [RemoteClass(alias=" ")] pour crer un objet ActionScript se mappant directement sur lobjet Java. La classe ActionScript vers laquelle les donnes sont converties doit tre utilise ou rfrence dans le fichier MXML afin dtre lie dans le fichier SWF et disponible lors de lexcution. Pour ce faire, une manire efficace consiste projeter lobjet de rsultat, comme lillustre lexemple suivant :
var result:MyClass = MyClass(event.result);
La classe elle-mme doit utiliser des rfrences fortement types de sorte que ses dpendances soient aussi lies. Les exemples suivants prsentent le code source dune classe ActionScript utilisant la balise de mtadonnes [RemoteClass(alias=" ")] :
package samples.contact { [Bindable] [RemoteClass(alias="samples.contact.Contact")] public class Contact { public var contactId:int; public var firstName:String; public var lastName:String; public var address:String; public var city:String; public var state:String; public var zip:String; } }
Vous pouvez utiliser la balise de mtadonnes [RemoteClass] sans alias si vous neffectuez pas de mappage un objet Java du serveur, mais que vous renvoyez le type dobjet depuis le serveur. Lobjet ActionScript est srialis vers un objet Map spcial lorsquil est envoy au serveur. Lobjet renvoy du serveur aux clients est toutefois le type ActionScript dorigine. Pour empcher lenvoi dune proprit au serveur partir dune classe ActionScript, utilisez la balise de mtadonnes
[Transient] situe au-dessus de la dclaration de cette proprit dans la classe ActionScript.
Conversion des donnes de Java en ActionScript Un objet renvoy par une mthode Java est converti de Java en ActionScript. LiveCycle Data Services ES et BlazeDS traitent galement les objets figurant dans des objets. LiveCycle Data Services ES traite implicitement les types de donnes Java rpertoris dans le tableau suivant.
Type ActionScript (AMF 3) String Boolean int Si la valeur est < 0xF0000000 || value > 0x0FFFFFFF, la valeur est leve Number en raison des conditions de codage AMF.
java.lang.Short, short
int Si i est < 0xF0000000 || i > 0x0FFFFFFF, la valeur est leve Number.
java.lang.Byte, byte[]
int Si i est < 0xF0000000 || i > 0x0FFFFFFF, la valeur est leve Number.
java.lang.Byte[] java.lang.Double, double java.lang.Long, long java.lang.Float, float java.lang.Character, char java.lang.Character[], char[] java. math.BigInteger java.math.BigDecimal java.util.Calendar
flash.utils.ByteArray Number Number Number String String String String Date Les dates sont envoyes dans le fuseau horaire UTC (Coordinated Universal Time). Les clients et les serveurs doivent rgler lheure en fonction des fuseaux horaires.
java.util.Date
Date Les dates sont envoyes dans le fuseau horaire UTC (Coordinated Universal Time). Les clients et les serveurs doivent rgler lheure en fonction des fuseaux horaires.
java.util.Collection (java.util.ArrayList, par exemple) java.lang.Object[] java.util.Map java.util.Dictionary org.w3c.dom.Document null java.lang.Object (autre type que les types prcdemment rpertoris)
mx.collections.ArrayCollection
Array Objet (non typ). Par exemple, un objet java.util.Map[] est converti en tableau (dobjets). Objet (non typ) Objet XML null Objet typ Les objets sont srialiss laide de rgles dintrospection JavaBean et incluent galement des champs publics. Les champs statiques, transitoires ou non publics ainsi que les proprits bean non publiques ou statiques sont exclus.
Configuration de la srialisation AMF sur un canal Vous pouvez prendre en charge la srialisation du type AMF existant utilis dans les versions prcdentes de Flex et configurer dautres proprits de srialisation dans les dfinitions de canaux du fichier services-config.xml.
Le tableau suivant dcrit les proprits que vous pouvez dfinir dans llment <serialization> dune dfinition de canal.
Proprit
<ignore-property-errors> true</ignore-property-errors>
Description La valeur par dfaut est true. Dtermine si le point de terminaison doit gnrer une erreur lorsquun objet entrant du client comporte des proprits non prvues ne pouvant pas tre dfinies sur lobjet du serveur. La valeur par dfaut est false. La valeur true active la journalisation des erreurs relatives aux proprits non prvues. La valeur par dfaut est false. La valeur true active le renvoi des occurrences de java.util.Collection en tant que tableaux ActionScript. La valeur false active le renvoi des occurrences de java.util.Collection en tant quoccurrences mx.collections.ArrayCollection. La valeur par dfaut est false. La valeur true active la srialisation des occurrences java.util.Map en tant que tableau ECMA ou tableau associatif, et non en tant quobjet anonyme. La valeur par dfaut est false. La valeur true active la srialisation des occurrences org.w3c.dom.Document en tant quoccurrences flash.xml.XMLDocument et non en tant quoccurrences XML (compatibles E4X) intrinsques. La valeur par dfaut est false. La valeur true active la srialisation des occurrences java.lang.Throwable en tant quobjets dinformations de statut AMF ( la place de la srialisation bean normale, incluant les proprits en lecture seule). Spcifie une implmentation de flex.messaging.io.TypeMarshaller qui traduit un objet en occurrence de la classe dsire. Utilis linvocation dune mthode Java ou au remplissage dune occurrence Java, lorsque le type de lobjet dentre de la dsrialisation (un objet anonyme ActionScript par exemple est toujours dsrialis en tant quobjet java.util.HashMap) ne correspond pas lAPI de destination (java.util.SortedMap, par exemple). Le type peut donc tre converti en type souhait. La valeur par dfaut est false. Commutateur avanc permettant loutil de dsrialisation de conserver la trace des objets de rfrences lorsquune traduction de type doit avoir lieu ; par exemple, lorsquun objet anonyme est envoy pour une proprit de type java.util.SortedMap, lobjet est dabord dsrialis en un objet java.util.Map en tant quobjet normal, puis traduit en une implmentation approprie de SortedMap (java.util.TreeMap, par exemple). Si dautres objets pointaient vers le mme objet anonyme dun graphique dobjets, ce paramtre restaure ces rfrences au lieu de crer des implmentations SortedMap. Notez que lattribution de la valeur true cette proprit peut conduire un ralentissement considrable des performances en prsence de larges volumes de donnes. La valeur par dfaut est true. Dfini sur false, ce commutateur avanc empche loutil de dsrialisation de crer des occurrences dobjets fortement typs, retient les informations de type et dsrialise les proprits brutes dans une implmentation Map, en particulier flex.messaging.io.ASObject. Les classes figurant dans les packagesflex.* sont toujours instancies.
<log-property-errors>false</logproperty-errors> <legacy-collection>false</legacycollection>
<legacy-map>false</legacy-map>
<legacy-xml>false</legacy-xml>
<legacy-throwable>false</legacythrowable>
<type-marshaller>className</typemarshaller>
<restore-references> false</restore-references>
<instantiate-types> true</instantiate-types>
La srialisation est souvent utilise pour viter de transmettre lensemble des proprits de la reprsentation ct client ou ct serveur dun objet travers le niveau rseau. Lorsque vous implmentez la srialisation personnalise, vous pouvez coder vos classes afin que les proprits spcifiques uniquement client ou uniquement serveur ne soient pas transmises via le rseau. Lorsque vous utilisez le schma de srialisation standard, toutes les proprits publiques font laller-retour entre le client et le serveur. Ct client, lidentit dune classe qui implmente linterface flash.utils.IExternalizable est crite dans le flux de srialisation. La classe srialise et reconstruit ltat de ses occurrences. La classe implmente les mthodes writeExternal() et readExternal() de linterface IExternalizable pour contrler le contenu et le format du flux de srialisation, mais pas le nom ou le type de classe, pour un objet et ses supertypes. Ces mthodes remplacent le comportement de srialisation AMF natif. Elles doivent tre symtriques leur homologue distant pour enregistrer ltat de la classe. Ct serveur, une classe Java qui implmente linterface java.io.Externalizable excute des fonctionnalits analogues une classe ActionScript implmentant linterface flash.utils.IExternalizable. Remarque : nutilisez pas des types qui implmentent linterface IExternalizable avec la classe HTTPChannel si une srialisation par rfrence prcise est requise. Cette opration conduit en effet la perte des rfrences entre les objets rcurrents, qui apparaissent alors clones au niveau du point de terminaison. Lexemple suivant prsente le code source complet de la version (ActionScript) client dune classe Product se mappant sur une classe Product Java sur le serveur. La classe Product client implmente linterface IExternalizable et la classe Product serveur linterface Externalizable.
// Product.as package samples.externalizable { import flash.utils.IExternalizable; import flash.utils.IDataInput; import flash.utils.IDataOutput; [RemoteClass(alias="samples.externalizable.Product")] public class Product implements IExternalizable { public function Product(name:String=null) { this.name = name; } public public public public var var var var id:int; name:String; properties:Object; price:Number;
public function readExternal(input:IDataInput):void { name = input.readObject() as String; properties = input.readObject(); price = input.readFloat(); } public function writeExternal(output:IDataOutput):void { output.writeObject(name); output.writeObject(properties); output.writeFloat(price); } } }
La classe Product client utilise deux types de srialisation. Elle utilise la srialisation standard, compatible avec linterface java.io.Externalizable, et la srialisation AMF 3. Lexemple suivant prsente la mthode writeExternal() de la classe Product client, qui utilise les deux types de srialisation :
public function writeExternal(output:IDataOutput):void { output.writeObject(name); output.writeObject(properties); output.writeFloat(price); }
Ainsi que lillustre lexemple suivant, la mthode writeExternal() de la classe Product serveur est presque identique la version client de cette mthode :
public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(name); out.writeObject(properties); out.writeFloat(price); }
Dans la mthode writeExternal() de la classe Product client, la mthode flash.utils.IDataOutput.writeFloat() est un exemple de mthode de srialisation standard qui rpond aux spcifications des mthodes java.io.DataInput.readFloat() Java pour utiliser des types primitifs. Cette mthode envoie la proprit price, de type Float, la classe Product serveur. Lexemple de srialisation AMF 3 dans la mthode writeExternal() de la classe Product client est lappel la mthode flash.utils.IDataOutput.writeObject(), qui se mappe lappel de la mthode java.io.ObjectInput.readObject() dans la mthode readExternal() de la classe Product serveur. La mthode flash.utils.IDataOutput.writeObject() envoie la classe Product serveur la proprit properties, qui constitue un objet, et la proprit name, qui constitue une chane. Cette opration est possible car le point de terminaison AMFChannel comporte une implmentation de linterface java.io.ObjectInput qui sattend ce que les donnes envoyes par la mthode writeObject() soient au format AMF 3. Ensuite, lorsque la mthode readObject() est appele dans la mthode readExternal() de la classe Product serveur, elle utilise la dsrialisation AMF 3 ; cest la raison pour laquelle la version ActionScript de la valeur properties est suppose tre de type Map et la valeur name de type String. Lexemple suivant prsente la source complte de la classe Product serveur :
// Product.java package samples.externalizable; import import import import import java.io.Externalizable; java.io.IOException; java.io.ObjectInput; java.io.ObjectOutput; java.util.Map;
/** * This Externalizable class requires that clients sending and * receiving instances of this type adhere to the data format * required for serialization. */ public class Product implements Externalizable { private String inventoryId; public String name; public Map properties; public float price; public Product() { } /** * Local identity used to track third-party inventory. This property is * not sent to the client because it is server specific. * The identity must start with an 'X'. */ public String getInventoryId() { return inventoryId; } public void setInventoryId(String inventoryId) { if (inventoryId != null && inventoryId.startsWith("X")) { this.inventoryId = inventoryId; } else { throw new IllegalArgumentException("3rd party product inventory identities must start with 'X'"); } } /** * Deserializes the client state of an instance of ThirdPartyProxy * by reading in String for the name, a Map of properties * for the description, and * a floating point integer (single precision) for the price. */ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Read in the server properties from the client representation. name = (String)in.readObject(); properties = (Map)in.readObject(); price = in.readFloat();
setInventoryId(lookupInventoryId(name, price)); } /** * Serializes the server state of an instance of ThirdPartyProxy * by sending a String for the name, a Map of properties * String for the description, and a floating point * integer (single precision) for the price. Notice that the inventory * identifier is not sent to external clients. */ public void writeExternal(ObjectOutput out) throws IOException { // Write out the client properties from the server representation. out.writeObject(name); out.writeObject(properties); out.writeFloat(price); } private static String lookupInventoryId(String name, float price) { String inventoryId = "X" + name + Math.rint(price); return inventoryId; } }
La mthode writeExternal() de la classe Product client nenvoie pas la proprit id au serveur pendant la srialisation car elle nest daucune utilit la version serveur de lobjet Product. De mme, la mthode writeExternal() de la classe Product serveur nenvoie pas la proprit inventoryId au client car il sagit dune proprit spcifique au serveur. Notez que pendant la srialisation, les noms des proprits dune classe Product ne sont envoys ni dans un sens, ni dans lautre. Ltat de la classe tant fixe et grable, les proprits sont envoyes dans un ordre bien dfini sans leur nom. La mthode readExternal() les lit dans lordre appropri.
La liaison de paramtres vous permet de copier des donnes de contrles de linterface utilisateur ou de modles pour demander des paramtres. Elle nest disponible que pour les composants daccs aux donnes que vous dclarez dans MXML. Vous pouvez appliquer des validateurs aux valeurs des paramtres avant de soumettre des demandes aux services. Pour plus dinformations sur la liaison de donnes et les modles de donnes, voir Data binding et Storing data. Pour plus dinformations sur la validation de donnes, voir Validating Data. La liaison de paramtres consiste dclarer des balises de paramtres de la mthode RemoteObject imbriques dans une balise <mx:arguments> sous une balise <mx:method>, des balises de paramtres HTTPService imbriques dans une balise <mx:request> ou des balises de paramtres dopration WebService imbriques dans une balise <mx:request> sous une balise <mx:operation>. La mthode send() permet denvoyer la demande.
La transmission de paramtres explicites vous permet de spcifier un objet contenant des paires nom-valeur comme paramtre de la mthode send(). Le paramtre de la mthode send() doit tre un type de base simple ; vous ne pouvez pas utiliser dobjets imbriqus complexes car il nexiste aucune mthode gnrique permettant de les convertir en paires nom-valeur. si vous ne spcifiez pas de paramtre de la mthode send(), le composant HTTPService utilise les paramtres dinterrogation spcifis dans la balise <mx:request>. Les exemples suivants illustrent deux manires dappeler un service HTTP en utilisant la mthode send() avec un paramtre. Le second exemple indique galement comment appeler la mthode cancel() pour annuler un appel de service HTTP.
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:HTTPService id="myService" destination="Dest" useProxy="true"/> </fx:Declarations> <fx:Script> <![CDATA[ public function callService():void { // Cancel all previous pending calls. myService.cancel(); var params:Object = new Object(); params.param1 = 'val1'; myService.send(params); } ]]> </fx:Script> <!-- HTTP service call with a send() method that takes a variable as its parameter. The value of the variable is an Object. --> <s:Button label="Button 1" click="myService.send({param1: 'val1'});" x="0" y="0"/> <!-- HTTP service call with an object as a send() method parameter that provides query parameters. --> <s:Button label="Button 2" click="callService();" x="0" y="30"/> </s:Application>
Remarque : si les balises dargument dans une balise <mx:arguments> portent le mme nom, les appels de service chouent si la mthode distante nattend pas un tableau comme unique source dentre. Aucun avertissement ce sujet nest affich lorsque lapplication est compile. Vous pouvez lier des donnes aux paramtres de mthode dun composant RemoteObject. Vous rfrencez les noms de balise des paramtres en vue de la liaison et de la validation de donnes. Lexemple suivant illustre une mthode comportant deux paramtres lis la proprit text des contrles TextInput. Un validateur PhoneNumberValidator est assign arg1, qui est le nom de la premire balise dargument.
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:RemoteObject id="ro" destination="roDest"> <mx:method name="setData"> <mx:arguments> <arg1>{text1.text}</arg1> <arg2>{text2.text}</arg2> </mx:arguments> </mx:method> </mx:RemoteObject> <mx:PhoneNumberValidator source="{ro.setData.arguments}" property="arg1"/> </fx:Declarations> <s:TextInput id="text1" x="0" y="0"/> <s:TextInput id="text2" x="0" y="30"/> </s:Application>
Flex envoie les valeurs des balises dargument la mthode dans lordre spcifi par les balises MXML. Lexemple suivant utilise la liaison de paramtres dans la balise <mx:method> dun composant RemoteObject pour lier les donnes dun lment ComboBox slectionn lopration employeeRO.getList lorsque lutilisateur clique sur un contrle Button. La liaison de paramtres correspond un appel de service par lutilisation de la mthode send() sans paramtres.
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:RemoteObject id="employeeRO" destination="roDest" showBusyCursor="true" fault="Alert.show(event.fault.faultString, 'Error');"> <mx:method name="getList"> <mx:arguments> <deptId>{dept.selectedItem.data}</deptId> </mx:arguments> </mx:method> </mx:RemoteObject> <s:ArrayCollection id="employeeAC" source="{ArrayUtil.toArray(employeeRO.getList.lastResult)}"/> </fx:Declarations> <fx:Script> <![CDATA[ import mx.controls.Alert; import mx.utils.ArrayUtil; ]]> </fx:Script> <s:HGroup> <s:Label text="Select a department:" x="10" y="200"/> <s:ComboBox id="dept" width="150" x="120" y="200"> <s:dataProvider> <mx:ArrayCollection> <mx:source> <fx:Object label="Engineering" data="ENG"/> <fx:Object label="Product Management" data="PM"/> <fx:Object label="Marketing" data="MKT"/> </mx:source> </mx:ArrayCollection> </s:dataProvider> </s:ComboBox> <s:Button label="Get Employee List" click="employeeRO.getList.send()" x="320" y="200"/> </s:HGroup> <mx:DataGrid dataProvider="{employeeAC}" width="100%"> <mx:columns> <mx:DataGridColumn dataField="name" headerText="Name"/> <mx:DataGridColumn dataField="phone" headerText="Phone"/> <mx:DataGridColumn dataField="email" headerText="Email"/> </mx:columns> </mx:DataGrid> </s:Application>
Si vous ignorez si le rsultat dun appel de service contient un tableau ou un objet individuel, vous pouvez utiliser la mthode toArray() de la classe mx.utils.ArrayUtil pour convertir le rsultat en un tableau, comme lindique cet exemple. Si vous transmettez la mthode toArray() un objet individuel, il renvoie un tableau dont le seul lment est cet objet. Si vous transmettez un tableau la mthode, elle renvoie le mme tableau. Pour plus dinformations sur lutilisation dobjets ArrayCollection, voir Data providers and collections.
<mx:columns> <mx:DataGridColumn dataField="name" headerText="Name"/> <mx:DataGridColumn dataField="phone" headerText="Phone"/> <mx:DataGridColumn dataField="email" headerText="Email"/> </mx:columns> </mx:DataGrid> <s:Label text="Select a department:" x="9" y="190"/> <s:ComboBox id="dept" width="150" x="152" y="190"> <s:dataProvider> <mx:ArrayCollection> <mx:source> <fx:Object label="Engineering" data="ENG"/> <fx:Object label="Product Management" data="PM"/> <fx:Object label="Marketing" data="MKT"/> </mx:source> </mx:ArrayCollection> </s:dataProvider> </s:ComboBox> <s:Button label="Get Employee List" click="employeeSrv.send();" x="327" y="190"/> </s:Application>
Pour vrifier si le rsultat dun appel de service contient un tableau ou un objet individuel, vous pouvez utiliser la mthode toArray() de la classe mx.utils.ArrayUtil afin de convertir le rsultat en tableau, comme lillustre lexemple prcdent. Si vous transmettez la mthode toArray() un objet individuel, il renvoie un tableau avec cet objet comme unique lment de tableau. Si vous transmettez un tableau la mthode, elle renvoie le mme tableau. Pour plus dinformations sur lutilisation dobjets ArrayCollection, voir Data providers and collections.
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:WebService id="employeeWS" destination="wsDest" showBusyCursor="true" fault="Alert.show(event.fault.faultString)"> <mx:operation name="getList"> <mx:request> <deptId>{dept.selectedItem.data}</deptId> </mx:request> </mx:operation> </mx:WebService> <s:ArrayCollection id="employeeAC" source="{ArrayUtil.toArray(employeeWS.getList.lastResult)}"/> </fx:Declarations> <fx:Script> <![CDATA[ import mx.utils.ArrayUtil; import mx.controls.Alert; ]]> </fx:Script> <s:HGroup> <s:Label text="Select a department:"/> <s:ComboBox id="dept" width="150"> <s:dataProvider> <mx:ArrayCollection> <mx:source> <fx:Object label="Engineering" data="ENG"/> <fx:Object label="Product Management" data="PM"/> <fx:Object label="Marketing" data="MKT"/> </mx:source> </mx:ArrayCollection> </s:dataProvider> </s:ComboBox> <s:Button label="Get Employee List" click="employeeWS.getList.send()"/> </s:HGroup> <mx:DataGrid dataProvider="{employeeAC}" width="100%"> <mx:columns> <mx:DataGridColumn dataField="name" headerText="Name"/> <mx:DataGridColumn dataField="phone" headerText="Phone"/> <mx:DataGridColumn dataField=" to email" headerText="Email"/> </mx:columns> </mx:DataGrid> </s:Application>
Vous pouvez aussi spcifier manuellement un corps de demande SOAP entier dans XML avec toutes les informations despace de noms correctement dfinies dans une balise <mx:request>. Pour ce faire, attribuez la valeur xml lattribut format de la balise <mx:request>, comme lillustre lexemple suivant :
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:WebService id="ws" wsdl="http://api.google.com/GoogleSearch.wsdl" useProxy="true"> <mx:operation name="doGoogleSearch" resultFormat="xml"> <mx:request format="xml"> <ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <key xsi:type="xsd:string">XYZ123</key> <q xsi:type="xsd:string">Balloons</q> <start xsi:type="xsd:int">0</start> <maxResults xsi:type="xsd:int">10</maxResults> <filter xsi:type="xsd:boolean">true</filter> <restrict xsi:type="xsd:string"/> <safeSearch xsi:type="xsd:boolean">false</safeSearch> <lr xsi:type="xsd:string" /> <ie xsi:type="xsd:string">latin1</ie> <oe xsi:type="xsd:string">latin1</oe> </ns1:doGoogleSearch> </mx:request> </mx:operation> </mx:WebService> </fx:Declarations> </s:Application>
Alert.show(event.fault.faultString, "Error"); } public function defaultFault(event:FaultEvent):void { // Handle service fault. if (event.fault is SOAPFault) { var fault:SOAPFault=event.fault as SOAPFault; var faultElement:XML=fault.element; // You could use E4X to traverse the raw fault element // returned in the SOAP envelope. // ... } Alert.show(event.fault.faultString, "Error"); } public function log(event:ResultEvent):void { // Handle result. } ]]> </fx:Script> <s:TextInput id="myZip"/> </s:Application>
Dans lexemple ActionScript suivant, un couteur dvnement result est ajout une opration WebService. Un couteur dvnement fault est ajout au composant WebService :
<?xml version="1.0"?> <!-- fds\rpc\RPCResultFaultAS.mxml --> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Script> <![CDATA[ import mx.rpc.soap.WebService; import mx.rpc.soap.SOAPFault; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; private var ws:WebService; public function useWebService(intArg:int, strArg:String):void { ws = new WebService(); ws.destination = "wsDest"; ws.echoArgs.addEventListener("result", echoResultHandler); ws.addEventListener("fault", faultHandler); ws.loadWSDL(); ws.echoArgs(intArg, strArg); }
public function echoResultHandler(event:ResultEvent):void { var retStr:String = event.result.echoStr; var retInt:int = event.result.echoInt; //do something } public function faultHandler(event:FaultEvent):void { //deal with event.fault.faultString, etc. if (event.fault is SOAPFault) { var fault:SOAPFault=event.fault as SOAPFault; var faultElement:XML=fault.element; // You could use E4X to traverse the // raw fault element returned in the SOAP envelope. // ... } } ]]> </fx:Script> </mx:Application>
Vous pouvez galement utiliser lvnement mx.rpc.events.InvokeEvent pour indiquer lorsquune requte de composant daccs aux donnes a t invoque. Cela est utile si les oprations sont places en file dattente et invoques ultrieurement.
Traitement de rsultats en tant que donnes XML avec le format de rsultat E4X
Vous pouvez dfinir la proprit resultFormat des composants HTTPService et des oprations WebService sur la valeur e4x pour crer une proprit lastResult de type XML. Vous pouvez accder la proprit lastResult en utilisant ECMAScript pour les expressions XML (E4X). Vous nincluez pas le nud racine de la structure XML dans la notation par point lorsque vous utilisez un objet XML E4X dans une expression de liaison. Cela diffre de la syntaxe dune proprit lastResult dfinie sur object pour lequel vous devez inclure le nud racine de la structure XML dans la notation par point. Par exemple, lorsque la proprit lastResult est dfinie sur e4x, vous utilisez {srv.lastResult.product} ; lorsque la proprit lastResult est dfinie sur object, vous utilisez {srv.lastResult.products.product}. Lutilisation du format de rsultat e4x est privilgier pour travailler directement dans XML. Vous pouvez toutefois galement dfinir la proprit resultFormat sur xml pour crer un objet lastResult de type flash.xml.XMLNode, qui est lobjet existant pour utiliser XML. De plus, vous pouvez dfinir la proprit resultFormat des composants HTTPService sur flashvars ou text pour crer des rsultats en tant quobjets ActionScript contenant des paires nom-valeur ou en tant que texte brut, respectivement. Remarque : pour appliquer la syntaxe E4X aux rsultats de service, vous devez dfinir la proprit resultFormat du composant HTTPService ou WebService sur e4x. La valeur par dfaut est object. Lorsque vous dfinissez la proprit resultFormat dun composant HTTPService ou dune opration WebService sur
e4x, vous devrez ventuellement traiter les informations despace de noms contenues dans le code XML renvoy. Pour
un composant WebService, les informations despace de noms sont contenues dans le corps de lenveloppe SOAP renvoye par le service Web. Lexemple suivant prsente une partie dun corps SOAP contenant des informations despace de noms. Ces donnes ont t renvoyes par un service Web qui obtient des cotes de titres. Les informations despace de noms sont en gras.
... <soap:Body> <GetQuoteResponse xmlns="http://ws.invesbot.com/"> <GetQuoteResult><StockQuote xmlns=""> <Symbol>ADBE</Symbol> <Company>ADOBE SYSTEMS INC</Company> <Price><big><b>35.90</b></big></Price> ... </soap:Body> ...
Le corps soap:Body contenant des informations despace de noms, la dfinition de la proprit resultFormat de lopration WebService sur e4x ncessite la cration dun objet despace de noms pour http://ws.invesbot.com/namespace. Lexemple suivant prsente une application effectuant cette opration :
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:WebService id="WS" destination="stockservice" useProxy="true" fault="Alert.show(event.fault.faultString), 'Error'"> <mx:operation name="GetQuote" resultFormat="e4x"> <mx:request> <symbol>ADBE</symbol> </mx:request> </mx:operation> </mx:WebService> </fx:Declarations> <fx:Script> <![CDATA[ import mx.controls.Alert; private namespace invesbot = "http://ws.invesbot.com/"; use namespace invesbot; ]]> </fx:Script> <s:HGroup> <mx:Button label="Get Quote" click="WS.GetQuote.send()"/> <s:TextArea text="{WS.GetQuote.lastResult.GetQuoteResult.StockQuote.Price}" /> </s:HGroup> </s:Application>
Si vous le souhaitez, vous pouvez crer une variable pour un espace de noms et y accder dans une liaison au rsultat de service, comme lillustre lexemple suivant :
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:WebService id="WS" destination="stockservice" useProxy="true" fault="Alert.show(event.fault.faultString), 'Error'"> <mx:operation name="GetQuote" resultFormat="e4x"> <mx:request> <symbol>ADBE</symbol> </mx:request> </mx:operation> </mx:WebService> </fx:Declarations> <fx:Script> <![CDATA[ import mx.controls.Alert; public var invesbot:Namespace = new Namespace("http://ws.invesbot.com/"); ]]> </fx:Script> <s:HGroup> <s:Button label="Get Quote" click="WS.GetQuote.send()"/> <s:TextArea text="{WS.GetQuote.lastResult.invesbot::GetQuoteResult.StockQuote.Price}"/> </s:HGroup> </s:Application>
Utilisez la syntaxe E4X pour accder aux lments et aux attributs des donnes XML renvoyes dans un objet lastResult. La syntaxe varie en fonction de la prsence ou non dun ou de plusieurs espaces de noms dclars dans les donnes XML. Aucun espace de noms Lexemple suivant indique comment obtenir une valeur dlment ou dattribut lorsquaucun espace de noms nest spcifi sur llment ou lattribut :
var attributes:XMLList = XML(event.result).Description.value;
Tout espace de noms Lexemple suivant indique comment obtenir une valeur dlment ou dattribut lorsquun espace de noms quelconque est spcifi sur llment ou lattribut :
var attributes:XMLList = XML(event.result).*::Description.*::value;
Le code prcdent renvoie xxx pour lun des documents XML suivants :
Espace de noms spcifique Lexemple suivant indique comment obtenir une valeur dlment ou dattribut lorsque lespace de noms rdf dclar est spcifi sur llment ou lattribut :
var rdf:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); var attributes:XMLList = XML(event.result).rdf::Description.rdf::value;
Lexemple suivant prsente une autre manire dobtenir une valeur dlment ou dattribut lorsque lespace de noms rdf dclar est spcifi sur un lment ou un attribut :
namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; use namespace rdf; var attributes:XMLList = XML(event.result).rdf::Description.rdf::value;
Traitement de rsultats de service Web contenant des objets DataSet ou DataTable .NET
Les services Web crits avec la structure Microsoft .NET peuvent renvoyer au client des objets DataSet ou DataTable .NET spciaux. Un service Web .NET fournit un document WSDL trs basique sans informations sur le type de donnes quil manipule. Lorsque le service Web renvoie un objet DataSet ou DataTable, les informations sur le type de donnes sont incorpores dans un lment de schma XML dans le message SOAP, qui indique comment le reste du message doit tre trait. Pour traiter au mieux les rsultats de ce type de service Web, dfinissez la proprit resultFormat dune opration WebService Flex sur object. Vous pouvez galement dfinir la proprit resultFormat de lopration WebService sur e4x. Les formats XML et e4x ne sont toutefois pas adapts la structure inhabituelle de la rponse et la liaison des donnes (par exemple un contrle DataGrid) ncessite limplmentation de solutions de contournement. La dfinition de la proprit resultFormat dune opration WebService Flex sur object entrane la conversion automatique des DataTable ou DataSet renvoys par un service Web .NET en objets comportant une proprit Tables, qui contient le mappage dun ou de plusieurs objets DataTable. Chaque objet DataTable du mappage Tables contient deux proprits : Columns et Rows. La proprit Rows contient les donnes. Lobjet event.result obtient les proprits suivantes correspondant aux proprits DataSet et DataTable dans .NET. Les tableaux dobjets DataSet ou DataTable comportent les mmes structures que celles dcrites ici, mais sont imbriqus dans un tableau de niveau suprieur sur lobjet de rsultat.
Proprit
result.Tables
Description Mappage des noms de tableaux des objets contenant des donnes de tableaux. Tableau des noms des colonnes suivant lordre spcifi dans le schma DataSet ou DataTable pour le tableau. Tableau dobjets reprsentant les donnes de chaque ligne du tableau, par exemple {columnName1:value, columnName2:value, columnName3:value}.
result.Tables["someTable"].Columns
result.Tables["someTable"].Rows
Lapplication MXML suivante renseigne un contrle DataGrid avec les donnes DataTable renvoyes par un service Web .NET.
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <mx:WebService id="nwCL" wsdl="http://localhost/data/CustomerList.asmx?wsdl" result="onResult(event)" fault="onFault(event)" /> </fx:Declarations> <fx:Script> <![CDATA[ import mx.controls.Alert; import mx.controls.DataGrid; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; private function onResult(event:ResultEvent):void { // A DataTable or DataSet returned from a .NET webservice is
// automatically converted to an object with a "Tables" property, // which contains a map of one or more dataTables. if (event.result.Tables != null) { // clean up panel from previous calls. dataPanel.removeAllElements(); for each (var table:Object in event.result.Tables) { displayTable(table); } // Alternatively, if a table's name is known beforehand, // it can be accessed using this syntax: var namedTable:Object = event.result.Tables.Customers; //displayTable(namedTable); } } private function displayTable(tbl:Object):void { var dg:DataGrid = new DataGrid(); dataPanel.addChild(dg); // Each table object from the "Tables" map contains two properties: // "Columns" and "Rows". "Rows" is where the data is, so we can set // that as the dataProvider for a DataGrid. dg.dataProvider = tbl.Rows; } private function onFault(event:FaultEvent):void { Alert.show(event.fault.toString()); } ]]> </fx:Script> <s:Button label="Get Single DataTable" click="nwCL.getSingleDataTable()"/> <s:Button label="Get MultiTable DataSet" click="nwCL.getMultiTableDataSet()"/> <s:Panel id="dataPanel" width="100%" height="100%" title="Data Tables"/> </s:Application>
Lexemple suivant illustre la classe .NET C#. Cette classe est limplmentation back-end du service Web appele par lapplication et utilise la base de donnes modle Microsoft SQL Server Northwind :
<%@ WebService Language="C#" Class="CustomerList" %> using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Services.Description; using System.Data; using System.Data.SqlClient; using System; public class CustomerList : WebService { [WebMethod] public DataTable getSingleDataTable() { string cnStr = "[Your_Database_Connection_String]"; string query = "SELECT TOP 10 * FROM Customers"; SqlConnection cn = new SqlConnection(cnStr); cn.Open(); SqlDataAdapter adpt = new SqlDataAdapter(new SqlCommand(query, cn)); DataTable dt = new DataTable("Customers"); adpt.Fill(dt); return dt; } [WebMethod] public DataSet getMultiTableDataSet() { string cnStr = "[Your_Database_Connection_String]"; string query1 = "SELECT TOP 10 CustomerID, CompanyName FROM Customers"; string query2 = "SELECT TOP 10 OrderID, CustomerID, ShipCity, ShipCountry FROM Orders"; SqlConnection cn = new SqlConnection(cnStr); cn.Open(); SqlDataAdapter adpt = new SqlDataAdapter(new SqlCommand(query1, cn)); DataSet ds = new DataSet("TwoTableDataSet"); adpt.Fill(ds, "Customers"); adpt.SelectCommand = new SqlCommand(query2, cn); adpt.Fill(ds, "Orders"); return ds; } }