ADOBE FLEX 4.6 - Développement d'applications web

FLEX 4.6 - Développement d'applications web ADOBE - Notice d'utilisation et mode d'emploi gratuit

Retrouvez gratuitement la notice de l'appareil FLEX 4.6 ADOBE au format PDF.

📄 136 pages Français FR Télécharger 💬 Question IA 10 questions ⚙️ Specs
Notice ADOBE FLEX 4.6 - page 1
Choisissez votre langue et indiquez votre email : nous vous enverrons une version traduite specifiquement.
Type de produit Logiciel de développement d'applications web
Version 4.6
Éditeur Adobe
Langue de la notice Français
Nombre de pages 136
Services de données pris en charge PHP, ColdFusion, BlazeDS, LiveCycle Data Services, HTTP, Web Services (SOAP)
Composants d'accès aux données RemoteObject, HTTPService, WebService
Format de sérialisation AMF (Action Message Format)
Environnement de développement Flash Builder
Fonctions principales Accès asynchrone aux données, liaison de données, génération de code client, support REST et SOAP
Configuration requise (serveur) Serveur web compatible PHP, ColdFusion ou J2EE avec BlazeDS/LCDS
Sécurité Fichier crossdomain.xml requis pour accès inter-domaines
Note utilisateur 6.0/10

FOIRE AUX QUESTIONS - FLEX 4.6 ADOBE

Comment se connecter à un service de données dans Flex 4.6 ?
Utilisez l'assistant de service Flash Builder. Selon le type de service (PHP, ColdFusion, HTTP, SOAP), sélectionnez l'option correspondante dans le menu Données, puis configurez l'URL ou le fichier du service.
Quelle est la différence entre RemoteObject, HTTPService et WebService ?
RemoteObject utilise AMF pour une communication binaire rapide avec des objets distants (ColdFusion, PHP, BlazeDS). HTTPService envoie des requêtes HTTP GET/POST et convient aux services REST. WebService utilise SOAP pour interagir avec des services Web.
Comment gérer les erreurs lors d'un appel de service ?
Définissez des écouteurs d'événements fault sur le composant ou l'opération. Par exemple, fault="showErrorDialog(event)" sur une opération WebService ou un composant HTTPService.
Qu'est-ce que la liaison de données (data binding) dans Flex ?
La liaison de données permet de mettre à jour automatiquement un composant d'interface utilisateur lorsque les données d'un objet source changent. Par exemple, lier le résultat d'un appel de service à un DataGrid via dataProvider="{getAllItemsResult.lastResult}".
Comment configurer le type de retour d'une opération de service ?
Dans la vue Données/Services, faites un clic droit sur une opération et sélectionnez Configurer le type de retour. Flash Builder peut détecter automatiquement le type à partir de données échantillons ou vous pouvez choisir un type existant.
Les services PHP nécessitent-ils une installation particulière ?
Oui, Flash Builder installe automatiquement une version minimale de Zend Framework pour sérialiser les données en AMF. Vous pouvez aussi l'installer manuellement en configurant le fichier amf_config.ini.
Comment accéder à un service Web sécurisé ?
Pour les services web, vous pouvez utiliser un proxy BlazeDS/LiveCycle Data Services. Lors de la connexion, sélectionnez Par une destination proxy et fournissez les identifiants d'authentification si nécessaire.
Qu'est-ce que le fichier crossdomain.xml ?
C'est un fichier XML placé à la racine du serveur web qui autorise les applications Flex chargées à partir d'autres domaines à accéder aux données du serveur. Sans lui, Flash Player bloque l'accès inter-domaines.
Comment générer un formulaire à partir d'une opération de service ?
Sélectionnez une opération dans la vue Données/Services, faites un clic droit et choisissez Générer le formulaire. Suivez l'assistant pour choisir les champs et le type de contrôle.
Puis-je utiliser Flex 4.6 avec des bases de données directement ?
Non, Flex ne communique pas directement avec une base de données. Vous devez passer par un service distant (PHP, ColdFusion, etc.) qui interroge la base et renvoie les données à l'application Flex.

Questions des utilisateurs sur FLEX 4.6 ADOBE

0 question sur cet appareil. Repondez a celles que vous connaissez ou posez la votre.

Poser une nouvelle question sur cet appareil

L'email reste privé : il sert seulement à vous prévenir si quelqu'un répond à votre question.

Aucune question pour l'instant. Soyez le premier à en poser une.

Téléchargez la notice de votre Développement d'applications web au format PDF gratuitement ! Retrouvez votre notice FLEX 4.6 - ADOBE et reprennez votre appareil électronique en main. Sur cette page sont publiés tous les documents nécessaires à l'utilisation de votre appareil FLEX 4.6 de la marque ADOBE.

MODE D'EMPLOI FLEX 4.6 ADOBE

Accès aux données avec ADOBE FLEX 4.6

Informations juridiques

Pour consulter les informations juridiques, rendez-vous à l'adresse suivante: http://help.adobe.com/fr_FR/legal notices/index.html.

Sommaire

Chapitre 1: Présentation de l'accès aux services de donnéesés

Accès aux données dans Flex comparé à d'autres technologies 1

Utilisation de Flash Builder pour acceder aux services de données 3

Composants d'accès aux données 4

Chapitre 2 : Création d'applications centrées sur les données avec Flash Builder

Creation d'un projet Flex pour l'accès aux services de données 8

Connexion à des services de données 9

Installation de Zend Framework 21

Utilisation d'une instance de serveur unique 22

Génération de l'application client 23

Configuration des types de données pour les opérations de service de données 27

Test des opérations de service 31

Gestion de l'accès aux données à partir du serveur 32

Génération du code Flash Builder pour les applications client 36

Déploiement des applications accédant aux services de données 43

Chapitre 3 : Implémentation de services pour des applications centrées sur les données

AMF (Action Message Format) 46

Définition de type côté client et côté serveur 46

Implémentation de services ColdFusion 47

Implémentation de services PHP 53

Débogage de services distants 65

Example d'implémentation de services à partir de plusieurs sources 67

Chapitre 4: Accès aux données côté serveur

Utilisation de composants HTTPService 74

Utilisation de composants WebService 83

Utilisation de composants RemoteObject 101

Transmission de paramètres explicés et liaison de paramètres 117

Traitement des résultats des services 125

Chapitre 1: Présentation de l'accès aux services de données

Accès aux données dans Flex comparé à d'autres technologies

Flex n'utilise pas les sources de données et les données de la même manière que les applications dont l'interface utiliseur fait appel à HTML.

Traitement côté client et traitement côté serveur

Contrairement aux ensembles de modèles HTML créés à l'aide de servlets, d'environnements JSP, ASP, PHP ou CFML, Flex sépare le code client du code serveur. L'interface utilisateur de l'application est compilation dans un fjichier binaire SWF envoyé au client.

Lorsque l'application effectue une demande à un service de données, le fichier SWF n'est pas recompilé et aucune réactualisation de page n'est requise. Le service distant ne renvoie que des données. Flex lie les données renvoyées à des composants de l'interface utilisateur dans l'application client.

Lorsqu'un utiliser clique sur le contrôle Button d'une application par exemple, le code côté client appelle un service Web. Les données de résultat provenant du service Web sont renvoyées dans le fichier SWF binaire sans réactualisation de page. Les données de résultat peuvent alors être utilisées comme contenu dynamique dans l'application.

<?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/halo" minWidth="1024" minHeight="768"
        \xmlns:employeesservice="services.employeesservice.*" xmlns:valueObjects="valueObjects.*">
        <fx:Declarations>
            <s:WebService
             id="RestaurantSvc"
                        wsdl="http://examples.adobe.com/flex3app/restaurantWs/RestaurantWS.xml?wsdl" />
            <s:CallResponder id="getRestaurantsResult"
                    result="restaurants = getRestaurantsResult.lastResult as Restaurant"/> </fx:Declarations>
        <fx:Script>
            <![CDATA[ import mx.controlss.Aclert;
            protected function b1.clickHandler(event:MouseEvent):void {
            (getRestaurantsResult_token = RestaurantWS.getRestaurantss());
            } ]
        ]">
    </fx:Script>
</s:Button id="b1" label="GetRestaurants" click="buttonclickHandler(event)" /> 

Comparons cet exemple Flex à l'exemple suivant, dans lequel du code JSP est utilisé pour appeler un service Web avec une balise personnalisée JSP. Lorsqu'un utilisateur demande le code JSP, la demande du service Web est effectuee sur le serveur et non pas sur le client. Le résultat est utilisé pour generer du contenu dans la page HTML. Le serveur d'application regenere la page HTML entiere avant de la renvoyer au navigateur Web de l'utiliser.

<@taglibprefix "web"uri "webservicetag" %> String str2 = "USD" %> </--Call the web service. -->
<web:param name "fromCurr"value "<%=str1"%>/ <web:param name "ToCurr"value "<%=str2"%>/

</--Display the web service result. -->
<%= pageContext.getAttribute("myresult") %>

Accès à la source de données

Une autre différence entre Flex et les autres technologies d'application Web réside dans l'absence (dans Flex) de communication directe avec une source de données. Vous utilisez un composant d'accès aux données pour vous connecter à un service distant et interagir avec la source de données côté serveur.

L'exemple suivant présente une page ColdFusion accédant directement à une source de données :

<CFQUERY DATASOURCE="Dsn" NAME="myQuery"> SELECT \* FROM table   
</CFQUERY> 

Une fonctionnalité similaire est obtenu dans Flex en ayant recours à un service HTTPService, un service Web ou un composant RemoteObject afin d'appeler un objet côté serveur qui renvoie les résultats d'une source de données.

Evénements, appeals de service et liaison de données

Flex est une technologie orientée événement. Une action de l'utiliser ou un événement de programme peut déclencher l'accès à un service. Par exemple, l'utiliser cliquant sur un bouton constitue un événement d'action qui peut être utilisé pour déclencher un appel de service. Un événement de programme peut être une application terminant la création d'un composant de l'interface utilisateur tel qu'un composant DataGrid. L'évenement creationComplete pour le composant DataGrid peut être utilisé pour appeler un service distant qui renseignera ce composant.

Dans Flex, les appeals de service sont asynchrones. L'application client n'a pas besoin d'attendre les données renvoyées. Les appeals de service asynchrones doivent des avantages lors de l'extraction ou de la mise à jour de produits de données volumineux. L'application client n'est pas bloquée par l'atte de l'extraction ou de la mise à jour des données.

Les données renvoyées par un appel de service sont stockées dans une propriété CallResponder associée à l'appoint de service. Les composants de l'interface utilisateur font alors appel à la liaison de données pour extraire de la propriété CallResponder les données renvoyées.

La liaison de données dans Flex vous permet demettre a jour dynamiquement un composant de l'interface utiliseur avec une source de données. Par exemple, un composant Flex peut associer son attribut text a l'attribut lastResult d'une propriete CallResponder. En cas de modification des données de CallResponder, le composant Flex est automatiquement mis a jour.

Flex implèmenté également la liaison de données bidirectionnelle qui garantit la mise à jour automatique d'un composant Flex ou d'une source de données dont les données sont modifiées. Un autre avantage de la liaison de données bidirectionnelle réside dans la mise à jour de données distances à partir des saisies effectuees par un utilisateur dans un composant Form ou dans un composant de données Flex.

Voir aussi

« Création d'applications centrées sur les données avec Flash Builder » à la page 8

Utilisation de Flash Builder pour acceder aux services de données

Flex Builder 3 permet d'implémenter des appels de procédures distant à des services de données à l'aide des composants d'accès aux données Flex. Cependant, Flash Builder simplifie ce processus.

Flash Builder fournit des assistants et des outils permettant d'effectuer les opérations suivantes :

  • Accès aux services de données
  • Configuration des données renvoyées par le service de données
  • Assistance pour la pagination des données renvoyées par le service
  • Assistance pour la fonctionnalité de gestion des données qui synchronise plusieurs mises à jour des données du serveur
  • Génération de code client pour l'accès aux services de données
  • Liaison des données renvoyées par le service aux composants de l'interface utilisateur

Flux de travaux Flash Builder pour l'accès aux services

Applique le flux de travaux suivant lorsque vous utilisez Flash Builder pour creer une application qui accede a des services de données.

1 Selon les circonstances, vous commencerez soit par vous connecter à un service de données, soit par construire l'interface utilisé.

Connexion au service distant : si vous commencez par vous connecter au service distant, vous doivent ensuite construire l'interface utilisateur.

Construction de l'interface utilisateur : si vous commencez par construire l'interface utilisateur, vous doivent ensuite vous connecter au service distant.

Remarque: la première action effectuee relève d'un choix personnel. Par exemple, si la conception d'une interface utilisateur est déjà prévue, vous pouvez commencer par construire l'interface utilisateur. A l'inverse, vous pouvez commencer par vous connecter aux données et laisser Flash Builder vous aider a générer les composants d'application.

2 Liez les opérations de données à des composants d'applications.
3 (Facultatif) Gérez l'extraction et la mise à jour des données.

Les outils Flash Builder vous permettent d'implémenter la pagination des données renvoyées et de coordonnner la mise à jour des yeux de données.

Lors du retour de gross volumes d'enregistrents de données, vous implémentez généralement la pagination pour extraire un jeu d'enregistrents selon vos besoin.

Pour les applications mettant à jour plusieurs enregistements, vous pouvez implémenter des fonctions de gestion de données. Les fonctions de gestion de données incluent :

  • Fonction de validation pour la mise à jour simultanée des enregistements modifiés
  • Mécanisme d'annulation des modifications avant leur écriture sur le serveur
  • Génération de code pour la mise à jour automatique des composants d'interface utilisateur au fur et à mesure que des enregistements sont ajustés, supprimés ou modifiés

4 Executez l'application et surveillez le flux de données.

Une fois l'application terminée, execute la pour en observer le fonctionnement. Utilisez le Moniteur de réseau Flash Builder pour afficher les données transmises entre l'application et le service. Le Moniteur de réseau est utile pour diagnostiquer les erreurs et analyser les performances.

Flash Builder fournit également des environnements robustes de débogage et de définition de profil. Le Moniteur de réseau et le profilur Flash sont disponibles avec Flash Builder Premium.

Voir aussi

« Création d'applications centrées sur les données avec Flash Builder » à la page 8

Développement des services pris en charge par Flash Builder

Les assistants et les outils Flash Builder prennant en charge l'accès aux implémentsations des types de services suivants :

  • Services PHP
  • Services ColdFusion
  • BlazeDS
    LiveCycle Data Services
  • Services HTTP (de style REST)
  • Services Web (SOAP)
    Fichiers XML statiques

Si vous avez besoin d'une prise en charge d'outils pour d'autres types de services (Ruby on Rails, par exemple), vous pouze développer l'implementation Flash Builder. Voir Reforence d'extensibilité Flash Builder.

Composants d'accès aux données

Les composants d'accès aux données permettent à une application client d'appeler des opérations et des services à travers un réseau. Les composants d'accès aux données utilisent des appeals de procédure distante pour interagir avec les environnementés de serveur. Les trois composants d'accès aux données sont les composants RemoteObject, HTTPService et WebService.

Les composants d'accès aux données sont concus pour les applications client dans lesquelles un modele d'appel et de réponse constitue un bon choix pour acceder aux données externes. Ces composants permettent au client d'effectuer des demandes asynchrones à des services distants quitrait les demandes, puis de renvoyer les données à l'application.

Un composant d'accès aux données appelle un service distant. Il stocke ensuite les données de réponse du service dans un objet ActionScript ou tout autre format renvoyé par le service. Utilisez les composants d'accès aux données dans l'application client pour qu'elle fonctionne avec trois types de services :

  • Services d'objets distants (RemoteObject)
  • Services Web basés sur SOAP (WebServices)
  • Services HTTP, incluant les services Web basés sur REST (HTTPService)

Adobe® Flash® Builder™ fournit des assistants et des outils permettant d'envelopper l'implémentation d'un composant d'accès aux données dans une enveloppe de service. L'enveloppe de service encapsule la fonctionnalité du composant d'accès aux données, rendant invisible une grande partie de l'implémentation de niveau inférieur et vous permettant ainsi de vous concentrer sur l'implémentation de services et la génération d'applications client pour acceder à ces services. Pour plus d'informations sur l'utilisation de Flash Builder pour acceder aux services de données, voir « Création d'applications centrées sur les données avec Flash Builder » à la page 8.

Accès aux services

Par défaut, Adobe Flash Player bloque l'accès à tout hôte qui ne correspond pas exactement à celui utilisé pour charger une application. Si vous n'utilissez pas LiveCycle Data Services ou BlazeDS pourTRAiter les demandes par proxy, un service HTTP ou Web doit résider sur le serveur hébergeant l'application ou le serveur distant hébergeant le service HTTP ou Web doit définir un fjichier crossdomain.xml. Le fjichier crossdomain.xml permet à un serveur d'indiquer que ses données et ses documents sont disponibles pour les fjichiers SWF traités à partir de certains domaines ou de tous les domaines. Le fjichier crossdomain.xml doitfigurer à la racine Web du serveur que l'application contacte.

Composants HTTPService

Utilisez les composants HTTPService pour l'envoi de requêtes HTTP GET ou POST et afin d'inclure les données de réponses HTTP dans une application client. Si vous utilise Flex pour développer des applications d'ordinateur (exécutées dans Adobe AIR®), les requêtes HTTP PUT et DELETE sont prises en charge.

Si vous utilisez LiveCycle Data Services ou BlazeDS, vous pouvez faire appel à un HTTPProxyService grâce auquel vous pourrez utiliser des méthodes HTTP supplémentaires. Le service HTTPProxyService vous permet d'envoyer des requêtes GET, POST, HEAD, OPTIONS, PUT, TRACE ou DELETE.

Un service HTTP peut consister en n'importe quel URI HTTP qui accepte des demandes HTTP et envoie des réponses. Un autre nom courant pour ce type de service est service Web de style REST. REST signifie RÉpresentational State Transfer, un style architectural pour les systèmes hypermédia distribués.

Les composants HTTPService s'avent utiles lorsqu vous ne pouvez pas exposer la même fonctionnalité en tant que service Web SOAP ou service d'objet 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 méthode send() de l'objet HTTPService, elle effectue une demande HTTP auprès de l'URI spécifique et une réponse HTTP est renvoyée. Si vous le souhaitez, vous pouvez transmettre des arguments à l'URI spécifique.

Flash Builder fournit des flux de travaux qui vous permettent de vous connecter de manière interactive à des services HTTP. Pour plus d'informations, voir « Accès aux services HTTP » à la page 13.

Voir aussi

« Accès aux services HTTP » à la page 13

Thèse : Representational State Transfer (REST) par Roy Thomas Fielding

Composants WebService

Les composants WebService vous permettent d'acceder aux services Web SOAP (modules logiciels comportant des méthodes). Les méthodes de service Web sont aussi appelées opérations. Les interfaces de service Web sont définies à l'aide du langage WSDL (Web Services Description Language). Les services Web fournissant aux modules logiciels réalisés sur différentes plateformes une méthode conforme aux standards leur permettant d'interagir entre eux. Pour plus d'informations 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 définissent leurs interfaces dans un document WSDL, disponible en tant qu'URL. WSDL est un format standard permettant de déscrire les messages qu'un service Web comprend, le format des réponses de ce service à ces messages, les protocôles que le service Web prend en charge et l'adresse à laquelle envoyer les messages.

Flex prend en charge WSDL 1.1, décrit à l'adresse www.w3.org/TR/wSDL, ainsi que les services Web codés RPC et litteral document.

Il prend également en charge les demandes et les résultats de service Web formats en tant que messages SOAP et transporte's via HTTP. SOAP fournit la definition du format XML que vous pouvez utiliser pour échanger des informations structurées et typées entre un client de service Web (une application créé avec Flex, par exemple) et un service Web.

Voupez utilise un composant WebService pour vous connecter à un service Web SOAP lorsque les services Web constituent un standard établi dans l'environnement. Les composants WebService sont également utiles pour les objets situés dans un environnement d'entreprise mais qui ne sont pas nécessairement disponibles sur le chemin source de l'application Web.

Flash Builder fournit des flux de travaux qui vous permettent de vous connecter de manière interactive à des services Web. Pour plus d'informations, voir « Accès aux services Web » à la page 16.

Composants RemoteObject

Les services d'objets distants vous permettent d'acceder à 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 nécessaire pour exposer la logique existante au format XML. Un autre avantage des services d'objets distants réside dans la vitesse de communication à travers le réseau. Les échanges de données s'effectuent encore via HTTP ou https, mais les données elles-memes sont sérieisées dans une représentation binaire. L'utilisation de composants RemoteObject réduit le volume de données qui transit sur le réseau, diminue la mémoire utilisée côté client et accélère le traitement.

ColdFusion, PHP, BlazeDS and LiveCycle Data Services peuvent utiliser une définition de type côté serveur lors de l'accès à des données du serveur. L'application client accède à un objet Java, à un composant ColdFusion (qui constitue un objet Java en interne) ou à une classe PHP directement par l'invocation distante d'une méthode sur un objet désigné. L'objet sur le serveur utilise ses propres types de données natifs en tant qu'arguments, interrogé une base de données avec ces arguments, puis renvoie les valeurs dans leurs types de données natifs.

Lorsque la définition de type côté serveur n'est pas disponible, Flash Builder dispose d'outils pour implémenter la définition de type côté client. Utilisez Flash Builder afin de configurer et de définir des types pour les données renvoyées du service. La définition de type côté client permet à l'application client d'introger une base de données et d'extraire des données correctement typées. La définition de type côté client est requise pour un service qui ne définit pas le type de données renvoyées par le service.

Flash Builder fournit des flux de travaux qui vous permettent de vous connecter de manière interactive à des services d'objets distants. Pour plus d'informations, voir « Connexion à des services de données » à la page 9.

Chapitre 2: Création d'applications centrées sur les données avec Flash Builder

Les outils Flash Builder peuvent vous aider à creer des applications accedant à des services de données. Commencez par créé un projet Flex pour vos applications. Vous pouze ensuite étabir une connexion à un service de données, configurer l'accès aux données du service, puis créé une interface utilisateur pour une application. Dans certains cas, vous doivent commencer par créé l'interface utilisateur, puis acceder au service de données.

Création d'un projet Flex pour l'accès aux services de données

Flex accede aux services de données en tant qu'objet distant, service HTTP (de type REST) ou service Web SOAP.

Utilisez un objet distant pour acceder aux types de services de données suivants :

  • Services ColdFusion
  • Services PHP au format AMF
  • BlazeDS
    LiveCycle Data Services

Pour plus d'informations sur l'utilisation de l'assistant LiveCycle Service Discovery, voir Utilisation de LiveCycle Discovery.

Pour tout service auquel l'accès s'effectue par le biais d'un object distant, créez un projet Flex configuré pour le type de serveur d'application approprié. L'assistant de nouveau projet Flex vous guide au cours des étapes de configuration d'un projet pour les types de serveurs d'applications répertoriés ci-dessous.

Type de serveurServices d'objects distants pris en charge
PHP• Services PHP au format AMF
ColdFusion• ColdFusion Flash Remoting • BlazeDS • LiveCycle Data Services
J2EE• BlazeDS • LiveCycle Data Services

Vouss pouvez you connecter à des services HTTP et Web SOAP à partir de n'importe quel projet Flex, y compris les projets sans technologie de serveur spécifiée.

Un projet configuré pour acceder à un objet distant peut acceder uniquement à un service d'objets distants pour lequel il est configuré. Par exemple, vous ne pouze pas acceder à un service PHP base sur AMF à partir d'un projet configuré pour ColdFusion. Cependant, vous pouze vous connecter à un service PHP à partir d'un tel projet si vous vous y connectez en tant que service Web ou HTTP.

Voir aussi

« Présentation de l'accès aux services de données » à la page 1

Changement du type de serveur d'un projet

Flash Builder you avertit si you tentez d'acceder à un service pour lequel aucun projet Flex n'est configuré. Si le projet Flex ne spécifie pas la configuration de serveur correcte, Flash Builder fournit un lien vers la boite de dialogue Propriétés du projet. Cette boite de dialogue vous permet de configurer le projet afin d'acceder au service de données. Flash Builder you avertit par exemple lorsque you tentez d'acceder à un service PHP base sur AMF à partir d'un projet qui ne spécifie aucune configuration de serveur.

Si le projet Flex a eté precedemment configuré pour l'accès à un另一种 type de service, configrez un nouveau projet Flex ou modifiez la configuration du projet actuel. En cas de modification de la configuration de serveur d'un projet, vous ne pourrez plus acceder aux services precedemment configurés. Par exemple, si vous modifiez une configuration de projet de ColdFusion vers PHP, les services ColdFusion auxquels vous tenterez d'acceder dans le projet ne seront plus disponibles.

Vou puez acceder à différents types de services à partir du même projet en configurant des services en tant que services HTTP ou Web.

Fichier de régulation interdomaines

Un fichier de régulation interdomaines est requis pour l'accès aux services se trouvant sur un autre domaine à partir du fichier SWF pour l'application. Situés dans le même Domaine que l'application, les services au format AMF ne nécessitant généralement pas de fichier de régulation interdomaines.

Connexion à des services de données

Utilisez l'assistant de service Flash Builder pour vous connecter à un service de données.

Pour les services d'objets distants, vous créez généralement un projet Flex ayant un type de serveurs d'applications correspondant. Flash Builder introspecte le service et peut configurer des types de回头 pour les données renvoyées par le service.

Les services d'objets distants incluent les services de données implémentés dans ColdFusion, PHP, BlazeDS et LiveCycle Data Services.

Pour plus d'informations sur l'utilisation de l'assistant LiveCycle Service Discovery, voir Utilisation de LiveCycle Discovery.

Voir aussi

« Création d'un projet Flex pour l'accès aux services de données » à la page 8

Accès aux services ColdFusion

Utilisez l'assistant de service Flash Builder pour acceder au service de données ColdFusion implémenté en tant que composant ColdFusion (CFC). Flex accède à ces services en qualité d'objets distants.

Utilisez un projet Flex spécifique ColdFusion comme type de serveurs d'applications. Lors de la création du projet Flex, activez l'options Utiliser le service d'accès aux objets distants et Sélectionnéz ColdFusion Flash Remoting.

Connexion à des services de données ColdFusion

Cette procédure part du principe que vous avez implémenté un service ColdFusion et créé un projet Flex afin d'acceder aux services ColdFusion.

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion à ColdFusion pour ouvrir l'assistant de connexion à un service.
2 Dans la boite de dialogue Configuration du service ColdFusion, recherche l'emplacement du fichier CFC qui implante le service.

Remarque: si vous n'avez pas implémentede service ColdFusion, Flash Builder peut generer un exemple de service a partir d'un tableau de base de données simple. Utilisez l'exemple generé en guise d'illustration de l'accès aux services de données. Voir « Génération d'un exemple de service ColdFusion à partir d'un tableau de base de données » à la page 10.

3 (Facultatif) Modifiez les détails du service.

Nom du serviceSpécifiez un nom pour le service. Flash Builder génére un nom pour le service, basé le nom du fichier du service. Les noms possibles pour un service sont soumis à certaines restrictions. Voir « Affection de noms aux services de données » à la page 20.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder génére un package basé sur le nom du service et le place dans un package services.
Package du type de donnéesSpécifiez un nom pour le package contenant les fichiers de classe ActionScript générés qui définitent les types de données récuperés à partir du service. Par défaut, Flash Builder créé le package valueObjects.

4 (Facultatif) Cliquez sur Suivant pour afficher les opérations de service.
5 Cliques sur Terminer pour générer des fichiers ActionScript qui accedent au service.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Prochaine etape : « Configuration des types de données pour les opérations de service de données » à la page 27.

Génération d'un exemple de service ColdFusion à partir d'un tableau de base de données

Flash Builder peut générer un exemple de service ColdFusion que vous pouvez utiliser en tant que prototype pour vos propres services. L'exemple de service accede à un tableau de base de données simple et dispose de méthodes de création, de lecture, de mise à jour et de suppression.

Flash Builder configure the types of données de return pour les services généres et active des fonctionnalités d'accès aux données telles que la pagination ou la gestion de données.

Important: utilisez le service generé uniquement dans un environnement de développement fiable. Le code génére permet à toute personne disposant d'un accès réseau à votre serveur d'acceder aux données du tableau de données et de les modifier ou supprimer. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajustate. Pour plus d'informations sur la réduction de services sécurisés, voir Sécurisation des services de données.

La procédure suivant part du principe que vous avez créé un projet Flex pour acceder aux services ColdFusion et disposez de sources de données ColdFusion.

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion à ColdFusion pour ouvrir l'assistant de connexion à un service.
2 Dans la boîte de dialogue Configuration du service ColdFusion, cliquez sur le lien afin de générer un exemple de service.
3 Sélectionnez l'options Générer à partir d'une source de données RDS et indiquez une source de données et une table ColdFusion.

Si la table ne définit pas de clé primaire, Sélectionnez-en une.

Remarque: en l'absence de source de données ColdFusion disponible, Sélectionnez l'options Générer à partir d'un modèle. Flash Builder rédige un exemple de composant ColdFusion (CFC) avec des opérations de service courantes. Supprimez les marques de commentaires de certaines fonctions du CFC et modifiez les opérations pour créé un exemple de service que vous pourrait utiliser comme prototype.

4 Utilisez l'emplacement par défaut ou spécifiez-en un nouveau. Cliquez sur OK.

Flash Builder génére l'exemple de service. Modifiez le nom du service et les emplacements de package afin de remplaçer les valeurs par défaut.

5 (Facultatif) Cliquez sur Suivant pour afficher les opérations du service.
6 Cliquez sur Terminer.

Flash Builder génére des fichiers ActionScript qui accedent à l'exemple de service. Il ouvre également l'exemple de service dans un éditeur du système enregistré pour l'edition de fichiers ColdFusion CFC.

Accès aux services PHP

Utilisez l'assistant de service Flash Builder pour vous connecter à un service de données implémenté sous PHP. Flex utilise le format AMF (Action Message Format) pourrialiser les données entre l'application client et le service de données. Flash Builder installe la structure Zend AMF pour fournir un accès aux services implémentés sous PHP. Voir « Installation de Zend Framework » à la page 21.

Accédez aux services de données PHP à partir d'un projet Flex dont le type de serveurs d'applications spécifique est PHP. Le service de données doit être disponible sous la racine Web définie à la configuration du projet pour PHP. Placez le service dans un réseau de services, comme illustré ci-dessous:

« Création d'un projet Flex pour l'accès aux services de données » à la page 8

Connexion à des services de données PHP

Cette procédure part du principe que vous avez implémenté un service PHP et créé un projet Flex afin d'acceder aux services PHP.

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion à PHP pour ouvrir l'assistant de connexion à un service.
2 Dans la boite de dialogue Configuration du service PHP, recherche le fichier PHP implémentant le service.

Remarque: si vous n'avez pas implémenté de service PHP, Flash Builder peut générer un exemple de service à partir d'un tableau de base de données simple. Utilisez l'exemple génééré en guise d'illustration de l'accès aux services de données. Voir « Génération d'un exemple de service PHP à partir d'un tableau de base de données » à la page 12.

3 (Facultatif) Modifiez les détails du service.

Nom du serviceSpécifiez un nom pour le service. Flash Builder géné ren un nom pour le service, basé le nom du fichier du service. Les noms possibles pour un service sont soumis à certaines restrictions. Voir « Affection de noms aux services de données » à la page 20.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder géné ren un package basé sur le nom du service et le place dans un package services.
Package du type de donnéesSpécifiez un nom pour le package contenant les fichiers de classe ActionScript générés qui définitent les types de données récuperés à partir du service. Par défaut, Flash Builder créé le package valueObjects.

4 Cliquez sur Suivant pour afficher les opérations de service.

Si vous ne disposez pas de la version prise en charge de Zend Framework pour l'accès aux services PHP, Flash Builder vous invite à en installer la version minimale. Voir « Installation de Zend Framework » à la page 21.

5 CliqueurTerminer.

Flash Builder génére des fichiers ActionScript qui accedent au service.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Prochaine etape : « Configuration des types de données pour les opérations de service de données » à la page 27.

Génération d'un exemple de service PHP à partir d'un tableau de base de données

Flash Builder peut générer un exemple de service PHP que vous pouvez utiliser en tant que prototype pour vos propres services. L'exemple de service accede à un tableau de base de données MySQL simple et dispose de méthodes de création, de lecture, de mise à jour et de suppression.

Flash Builder configure the types of données de return pour les services généres et active des fonctionnalités d'accès aux données telles que la pagination ou la gestion de données.

Important: utilisez le service generé uniquement dans un environnement de développement fiable. Le code génére permet à toute personne disposant d'un accès réseau à votre serveur d'acceder aux données du tableau de données et de les modifier ou supprimer. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon adequate. Pour plus d'informations sur la réduction de services sécurisés, voir Sécurisation des services de données.

La Procedure suivant part du principe que vous avez créé un projet Flex pour acceder aux services PHP et disposez de sources de données MySQL.

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion à PHP pour ouvrir l'assistant de connexion à un service.
2 Dans la boite de dialogue Configuration du service PHP, cliquez sur le lien afin de générer un exemple de service.
3 Sélectionnez Générer à partir d'une base de données et spécifie les informations de connexion à la base de données. Cliquez sur Connexion à la base de données.

Remarque: en l'absence de source de données PHP disponible, sélectionnez l'options Générer à partir d'un modèle. Flash Builder rédige un exemple de projet avec des opérations de service courantes. Supprimez les marques de commentaires de certaines zones du projet et modifiez les opérations pour créé un exemple de service que vous pourrait utiliser comme prototype.

4 Sélectionnez un tableau dans la base de données et spécifie la clé primaire.
5 Utilisez l'emplacement par défaut ou spécifiez-en un nouveau. Cliquez sur OK.

Si vous ne disposez pas de la version prise en charge de Zend Framework pour l'accès aux services PHP, Flash Builder vous invite à en installer la version minimale. Voir « Installation de Zend Framework » à la page 21.

Flash Builder génére l'exemple de service. Modifiez le nom du service et les emplacements de package afin de remplaçer les valeurs par défaut.

6 (Facultatif) Cliquez sur Suivant pour afficher les opérations du service.
7 CliqueurTerminer.

Flash Builder génére des fichiers ActionScript qui accedent à l'exemple de service. Il ouvre également l'exemple de service dans un éditeur du système enregistré pour l'edition de fichiers PHP.

Accès aux services HTTP

Utilisez l'assistant de service Flash Builder pour vous connecter aux services HTTP basés sur REST. Vous pouvez vous connecter à des services HTTP à partir de n'importe quel projet Flex. Il n'est pas nécessaire de spécifique une technologie de serveur pour le projet.

Un fichier de régulation interdomaines est requis pour l'accès aux services dont le domaine ne correspond pas à celui du fichier SWF de l'application client. Voir Utilisation de fichiers de régulation interdomaines.

Il existe plusieurs fonctions de configurer l'accès aux services HTTP basés sur REST. L'assistant de configuration du service HTTP prend en charge les options suivantes.

  • URL de base en tant que préfixe

Cette option s'avère pratique pour acceder à plusieurs opérations à partir d'un service unique. Si vous spécifie une URL de base vers le service, il vous suffit ensuite de spécifique pour chaque operation le chemin relatif vers les opérations HTTP.

L'utilisation d'une URL de base ne permet pas d'acceder à plusieurs services.

  • URL avec paramètres de requête

Lors de la Specification d'une URL vers une opération, vous pouvez inclure les paramètres de requête pour les opérations de service. L'assistant de configuration du service HTTP renseigne le tableau Paramètres avec chaque paramètre inclus dans l'URL de l'opération.

  • Services RESTful avec des paramètres délimités

Flash Builder prend en charge l'accès aux services RESTful qui utilise des paramétres délimités au lieu du paramètre de requête GET. Par exemple, supposons que vous utilisez l'URL suivante pour acceder à un service RESTful :

http://restfulService/items/itemID

Utilisez des accolades ({}) pour spécifier les paramètres de l'URL de l'opération, Par exemple :

http://restfulService/{items}/{itemID}

L'assistant L'assistant: L'assistant.

NomType de donnéesType de paramètre
itemsStringURL
itemIDStringURL

Lorsque vous spécifie des paramètres pour un service RESTful, Type de données et Type de paramètre sont toujours configurés en tant que String et URL respectivement.

Remarque: vous pouvez associier des paramétres de service RESTful avec des paramétres de requête lors de la Specification de l'URL vers une opération.

  • Chemin vers un fichier local pour une URL d'opération

Pour une URL d'opération, vous pouvez désigner un chemin vers un fisier local qui implèmente les services HTTP. Par exemple, désigné ce qui suit pour une URL d'opération :

c:/MyHttpServices/MyHttpService.xml

  • Ajout d'opérations GET et POST

Vou puez ajouter des opérations supplémentaires lors de la configuration d'un service HTTP. Cliquez sur le bouton Ajouter du tableau Opérations.

Spcificiez la méthode de l'opération (GET ou POST).

  • Ajout de paramètres à une opération

Voupez ajouter des parametes à l'opération que vous aurez préalablement selectionnee dans le tableau Opérations. Sélectionnez une opération, puis cliquez sur le bouton Ajouter du tableau Paramétres.

Sécífiez un nom et un type de données pour le paramètre ajouté. Le type de paramètre (GET ou POST) correspond à la méthode de l'opération.

  • Type de contenu pour les opérations POST

Pour les opérations POST, vous pouvez spécifique le type de contenu. Il peut s'agir de application/x-ww-formurlencode du de application/xml.

Si vous sélectionnez application/xml comme type de contenu, Flash Builder génére un paramètre de requête non modifiable, dont le nom par défaut est strXML. Vous pourrez spécifique le paramètre actué à l'opération.

NomType de donnéesType de paramètre
strXMLStringPOST

Vou ne pouvez pas ajouter de paramètres supplémentaires pour le type de contenu application/xm1.

Connexion à des services HTTP

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion à HTTP pour ouvrir l'assistant de connexion à un service.
2 (Facultatif) Séc品牌形象 une URL de base à utiliser en tant que préfixe pour toutes les opérations.
3 Sous Opérations, spécifie les éléments suivants pour chaque opération à laquelle vous souhaitez acceder :

  • Méthode de l'opération (GET ou POST)
  • URL de l'opération de service

Vous pouvez inclure dans l'URL n'importe quel paramètre d'opération. Utilisez des accelades ({}) pour spécifique des paramètres de service de style REST.

Flash Builder prend en charge l'accès aux protocoles suivants :

http://

https://

Chemins d'accès standard tels que C:/ ou /Applications/

  • Nom de l'opération

4 Spécifiez le nom et le type de données de chaque paramètre d'opération de l'URL sélectionnée.
5 (Facultatif) Cliquez sur Ajouter ou Supprimer pour ajouter ou supprimer des parametes pour l'opération selectionnee.
6 (Facultatif) Modifiez les détails du service.

Nom du serviceSpécifiez un nom pour le service. Flash Builder génére un nom pour le service, basé le nom du fichier du service. Les noms possibles pour un service sont soumis à certaines restrictions. Voir « Affection de noms aux services de données » à la page 20.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder génére un package basé sur le nom du service et le place dans un package services.
Package du type de donnéesSpécifiez un nom pour le package contenant les fichiers de classe ActionScript générés qui définissent les types de données récuperés à partir du service. Par défaut, Flash Builder créé le package valueObjects.

7 (Facultatif) Modifiez le nom du package génére pour le service.
8 CliqueurTerminer.

Flash Builder génére des fichiers ActionScript qui accedent au service.

Une fois la connexion au service HTTP établie, configurez les types de回头 des opérations de service. Lors de la configuration du type de回头, les types de paramètres de l'opération sont également configurés. Voir « Configuration des types de données pour les opérations de service de données » à la page 27.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Prochaine etape : « Configuration des types de données pour les opérations de service de données » à la page 27.

Accès à un fichier XML implémentant des services HTTP

Voupez acceder a un fisier XML statique qui implémente un service HTTP. Ce fisier XML statique peut etre un fisier local ou etre disponible sous la forme d'une URL.

Le service utilise une méthode GET qui renvoie une réponse XML. Cette fonctionnalité est utile pour apprendre à connaître les services HTTP dans Flex et pour étabir des prototypes de données fictives dans les applications client.

Lors de l'accès au service, spécifique le nœud renvoyant la réponse XML. Flash Builder utilise ce nœud pour configurer automatiquement un type de回头 pour les données. Une fois la connexion au service établie, vous pouvez lier des opérations du service à des composants d'interface utiliser.

Connexion à un fichier de service XML

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion à HTTP pour ouvrir l'assistant de connexion à un service.
2 Spécifiez Fichier local ou URL, puis accédez au fichier.
3 Sélectionnez un nœud dans le fjichier contenant la réponse souhaïée.

Indiquez si la réponse est un tableau Array.

Flash Builder configure un type de return pour le nœud sélectionné.

4 Modifiez les détails du service.

Nom du serviceSpécifiez un nom pour le service. Flash Builder génére un nom pour le service, basé le nom du fichier du service. Les noms possibles pour un service sont soumis à certaines restrictions. Voir « Affection de noms aux services de données » à la page 20.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder génére un package basé sur le nom du service et le place dans un package services.
Package du type de donnéeséesSpécifiez un nom pour le package contenant les fichiers de classe ActionScript générés qui définissant les types de donnéesées récuperés à partir du service. Par défaut, Flash Builder créé le package valueObjects.

5 (Facultatif) Modifiez le nom du package génére pour le service.
6 CliqueurTerminer.

Flash Builder génére des fischiers ActionScript qui accedent au service.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Accès aux services Web

Utilisez l'assistant de service Flash Builder pour vous connecter aux services Web (SOAP). Vous pouvez vous connecter à des services Web à partir de n'importe quel projet Flex. Il n'est pas nécessaire de spécifique une technologie de serveur pour le projet.

Un fichier de régulation interdomaines est requis pour l'accès aux services se trouvant sur un autre domaine à partir du fichier SWF pour l'application client.

Voir aussi

Utilisation des fichiers de régulation interdomaines

Connexion à des services Web

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion au service Web pour ouvrir l'assistant de connexion à un service.
2 (BlazeDS/Data Services) Si vous avez installe LiveCycle Data Services ou BlazeDS, vous pouvez acceder au service Web via un proxy.

Sélectionnez l'options Par une destination proxy BlazeDS/Data Services.

Sécífiez une destination. Cliquez sur Suivant et passez à l' étape 5.

Remarque: l'option d'accès aux services Web via un proxy est activée uniquement si le type de serveurs d'applications spécifique pour le projet Flex est J2EE.

3 Saisissez un URI pour le service SOAP.
4 (Facultatif) Modifiez les détails du service.

Nom du serviceSpécifiez un nom pour le service. Flash Builder génére un nom pour le service basé sur l'URI WSDL. Les noms possibles pour un service sont soumis à certaines restrictions. Voir « Affection de noms aux services de données » à la page 20.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder génére un package basé sur le nom du service et le place dans un package services.
Package du type de donnéesSpécifiez un nom pour le package contenant les fichiers de classe ActionScript générés qui définitent les types de données récuperés à partir du service. Par défaut, Flash Builder créé le package dataValues.

5 (Facultatif) Configurez la génération de code pour le service.

ServiceSélectionnez l'un des services disponibles.
PortFlash Builder génére un nom pour le service basé sur l'URI WSDL.
Liste d'opérationsSélectionnez les opérations du service auquel vous souhaitez accéder dans votre application client.

6 Cliques sur Terminer.

Flash Builder génére des fischiers ActionScript qui accedent au service.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Une fois la connexion au service Web établie, configurez les types de回头 des opérations de service. Pour plus d'informations, voir « Configuration des types de données pour les opérations de service de données » à la page 27.

Accès à BlazeDS

Vou puez acceder aux services BlazeDS quinquement si vous aee instalé Adobe BlazeDS et configuré un serveur RDS (Remote Development Services). Pour plus d'informations sur l'installation et la configuration de BlazeDS, voir la documentation de LiveCycle Data Services ES.

En règle générale, vous accédez aux services de données BlazeDS à partir d'un projet Flex dont le type de serveurs d'applications spécifique est J2EE.

Voir aussi

« Création d'un projet Flex pour l'accès aux services de données » à la page 8

Connexion à des services BlazeDS

Cette procédure part du principe que vous avez installé BlazeDS, configuré un serveur de développement distant et créé un projet Flex afin d'acceder aux services BlazeDS.

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion à BlazeDS pour ouvrir l'assistant de connexion à un service.

2 Sélectionnez une destination à importer.
3 (Facultatif) Modifiez les détails du service.

Nom du serviceSpécifiez un nom pour le service. Flash Builder génére un nom pour le service basé sur la destination. Les noms possibles pour un service sont soumis à certaines restrictions. Voir « Affoctation de noms aux services de données » à la page 20.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder génére un package basé sur le nom du service et le place dans un package services.
Package du type de donnéeséesSpécifiez un nom pour le package contenant les fichiers de classe ActionScript générés qui définitent les types de donnéesées récapurrés à partir du service. Par défaut, Flash Builder créé le package valueObjects.

4 CliqueurTerminer.

Flash Builder génére des fischiers ActionScript qui accedent au service.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Accès à LiveCycle Data Services

Voupe au ceder aux services disribles a partir de LiveCycle Data Services uniquement si vous ave installé LiveCycle Data Services et configuré un serveur RDS (Remote Development Services). Pour plus d'informations, voir la documentation de LiveCycle Data Services.

Voupeace acceder à LiveCycle Data Services a partir d'un projet Flex dont le type de serveur d'applications specifie est soit J2EE soit ColdFusion.

Types de service pour LiveCycle Data Services

Lors de la connexion à LiveCycle Data Services, les types de services de données suivants sont disponibles en tant que destinations.

Service distant

Les services distants sont implémentés à l'aide de la définition de types AMF. Ils ne fournissent aucune gestion de données côté serveur. Vous pouvez utiliser les outils Flash Builder pour configurer la gestion de données côté client. Voir « Activation de la gestion des données » à la page 34.

Service de données

Les services de données implémentant la gestion de données cote serveur. Pour plus d'informations, voir la documentation LiveCycle Data Services.

Service Web

Les services Web sont disponibles par le biais d'un proxy LiveCycle Data Services configuré en tant que destination LiveCycle Data Services. La définition de type côté serveur n'est généralement pas fournie lors de la connexion à un service Web.

Configuration et gestion de types de données

Flash Builder fournit des outils pour la configuration et la gestion des données cote client. Les outils Flash Builder disponibles dépendent du type de destination LiveCycle Data Services.

Service distant

Les services distants implémentant la définition de types AMF sur le service. Il n'est pas nécessaire de configurer des types de données de retard pour les destinations de service distant.

Les services de données implémentent les types de données cote serveur. Il n'est pas nécessaire de configurer des types de données de retard pour les destinations de service de données.

Les destinations de service de données fournissent également la gestion des données cote serveur. Vous ne pouvez pas utiliser la gestion des données cote client avec les destinations de service de données.

Service Web

En règle générale, les destinations de service Web disponibles par le biais d'un proxy LiveCycle Data Service n'implement pas la définition de type côté serveur. Vous pouvez utiliser les outils Flash Builder pour configurer des types de回头 pour les opérations de service Web. Voir « Configuration des types de données pour les opérations de service de données » à la page 27.

Vouss pouze utiliser Flash Builder pour générer du code pour la gestion des données cote client. Voir « Activation de la gestion des données » à la page 34.

Connexion aux destinations LiveCycle Data Service (destinations de service de données et de service distant)

Cette procédure part du principe que vous avez installé LiveCycle Data Services, configuré un serveur de développement distant et créé un projet Flex afin d'acceder aux services LCDS.

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion aux données/services pour ourir l'assistant de connexion à un service.
2 Dans la boîte de dialogue Sélection d'un type de service, choisissez LCDs. Cliquez sur Suivant.
3 Saisissez votre identificant de connexion,le cas échéant.
4 (Facultatif) Modifiez les détails du service.

Nom du serviceN'indiquez aucun nom de service. Flash Builder génére un nom de service. Flash Builder génére un nom pour le service basé sur la destination.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder génére un package basé sur le nom du service et le place dans un package services.
DestinationsSpécifiez une ou plusieurs destinations disponibles à partir du serveur LiveCycle Data Services.
Package du type de donnéeséesSpécifiez un nom pour le package de type de donnéesées. Ce package contient les fichiers de classe ActionScript générés qui définissant les types de donnéesées récapérés à partir du service. Par défaut, Flash Builder créé le package valueObjects.

5 Cliquez sur Terminer.

Flash Builder génére des fischiers ActionScript qui accedent au service.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Connexion aux destinations LiveCycle Data Service (destinations de service Web)

Cette procédure part du principe que vous avez installé LiveCycle Data Services, configuré un serveur de développement distant (RDS) et créé un projet Flex pour l'accès aux services DS.

1 Dans le menu Données de Flash Builder, Sélectionnez Connexion aux données/services pour ourir l'assistant de connexion à un service.
2 Dans la boite de dialogue Sélection d'un type de service, choisissez Service Web. Cliquez sur Suivant.
3 Sélectionnéz l'option Par une destination proxy LCDS/BlazeDS.
4 Saisissez votre identificant de connexion,le cas échéant.
5 Sélectionnez la destination.
6 (Facultatif) Modifiez les détails du service. Cliquez sur Suivant.

Nom du serviceSpécifiez un nom pour le service. Flash Builder génére un nom pour le service basé sur le nom de la destination. Les noms possibles pour un service sont soumis à certaines restrictions. Voir « Affection de noms aux services de données » à la page 20.
Package de servicesSpécifiez un nom pour le package contenant les fichiers ActionScript générés qui accèdent au service. Flash Builder génére un package basé sur le nom du service et le place dans un package services.
Package du type de donnéeséesSpécifiez un nom pour le package contenant les fichiers de classe ActionScript générés qui définissant les types de données récuperés à partir du service. Par défaut, Flash Builder créé le package dataValues.

7 (Facultatif) Configurez la génération de code pour le service.

Service PortSélectionnez un service et un port à partir des services et ports disponibles.
Liste d'opérationsSélectionnez les opérations du service auquel vous souhaitez accéder dans votre application client.

8 CliqueurTerminer.

Flash Builder génére des fichiers ActionScript qui accedent au service.

Remarque: une fois la connexion établie, vous pouvez modifier les propriétés du service. Sélectionnez le service dans la vue Données/Services. Dans le menu contextuel, Sélectionnez Propriétés.

Voir aussi

« Création d'un projet Flex pour l'accès aux services de données » à la page 8

Affectation de noms aux services de données

Il existe des restrictions sur les noms autorisés pour les services de données dont l'accès s'effectue à partir de Flash Builder. Certaines restrictions ne sont pas apparentes tant que vous ne compiez pas votre application.

Les règles d'attribution des noms pour les services sont :

  • Le nom du service ne peut pas commencer par un nombre.

  • Les nombres de service ne peuvent pas etre des mots-clés ActionScript.

  • Vous ne pouvez pas utiliser un nom de classe ActionScript, y compris les classes personnalisées, 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é d'utiliser des noms de service différant des noms de vos fichiers MXML.

Installation de Zend Framework

Lors de l'accès initial aux services PHP, Flash Builder déterminé si la version de Zend Framework prise en charge est installée. Si cette version est introuvable, Flash Builder vous invite à en confirmer l'installation. Si vous acceptez, Flash Builder installe une version minimale de Zend Framework. Si vous refusez, installez manuellement Zend Framework si vous souhaitez acceder aux services PHP.

Installation par défaut de Flash Builder

Flash Builder installe Zend Framework dans un dossier ZendFrameworkitué dans le repertoire racine de votre serveur Web :

<web root>/ZendFramework/ 

Pour les projets Flex accédant aux services PHP, Flash Builder créé 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 recommende de déplacerZendFramework hors de la racine Web. Mettez à jour la variable zend_path définitie dans le fichier amf_config.ini.

Si la variable zend_path est commentée, supprimez-en les marques de commentaire. Sécífiez l'emplacement de l'installation Zend Framework.

Installation manuelle de Zend Framework

You've ase la possibilité d'installer manuellement Zend Framework.

1 Telechargez la derniere version de Zend Framework.

VoussoupiezinstallerlepackageminimaloulepackagecompletFlashBuilderinstallelepackageminimal.

2 Extrayez la version teléchargee dans un emplacement du système.
3 Dans le dossier du projet Flex permettant d'acceder aux services PHP, mettez à jour la variable zend_path définitie dans le fichier amf_config.ini.

Si la variable zend_path est commentede, supprimez-en le commentaire. Specified le chemin absolu vers l'emplacement de l'installation Zend Framework.

Dépannage d'une installation Zend Framework

Voici quelques conseils pour résoudre les erreurs susceptibles de survenir lors de la connexion à Zend Framework.

Installation manuelle de Zend Framework

Si vous avez installe manuellement Zend Framework, examinez la variable zend_path dans le fichier amf_config.ini.

Le fichier amf_config.ini se trouve dans le dossier de sortie du projet.

Vérifiez ce qui suit :

  • zend_amf n'est pas commentedé.
  • Le chemin spécifique vers votre installation Zend Framework est correct :

  • Il s'agit d'un chemin absolu vers une destination située sur le système de fichiers local. Vous ne pouvez pas spécifique un chemin vers une ressource réseau mapped.

  • Le chemin mène au dossier de bibliothèque de l'installation Zend Framework. Habituellement, le dossier de bibliothèque est situé dans les emplacements suivants :

(Windows) C:\apache\PHPFrameworks/ZendFramework/library

(Mac OS)/utilisateur/apache/PHP/frameworks/ZendFramework/library

Installation de Zend Framework par Flash Builder

Si Zend Framework a eté installé par Flash Builder, vérifie ce qui suit :

L'emplacement du dossier racine Web

Flash Builder installe Zend Framework dans le dossier racine Web du projet. Vérifiez-en l'emplacement. Sélectionnez Projet > Propriétés > Serveur Flex.

Assurez-vous que le serveur Web est configuré pour utiliser PHP.
- La variable zend_path du fichier amf_config.ini

Le fichier amf_config.ini se trouve dans le dossier de sortie du projet.

Vérifiez ce qui suit :

  • zend_amf n'est pas commenté.
  • Le chemin spécifique pointe vers l'installation Zend Framework à la racine Web du projet.
  • Il s'agit d'un chemin absolu vers une destination située sur le système de fichiers local. Vous ne pouvez pas spécifique un chemin vers une ressource réseau mapped.

Utilisation d'une instance de serveur unique

Une fois la connexion à un service de données établie, chaque application d'un projet peut acceder à ce service. Par défaut, chaque application creée sa propre instance de service lorsqu'elle accede au serveur.

Vouss pouvez modifier ce comportement de sorte qu'un projet ne compte qu'une seule instance de service. Chaque application dans le projet accede à la même instance de service. En règle générale, vous créez une instance de serveur unique lorsque vous souhaitez coordonnner l'accès aux données à partir d'applications multiples.

Vou puez socrifier laccs a une seule instance de service par projet ou en tant que prefeence pour tous les projets.

Accès à une instance de serveur unique pour un projet

1 Cliques sur Projet > Propriétés > Données/Services.
2 Sélectionnez la case à cocher pour l'utilisation d'une instance de serveur unique. Cliquez sur OK.

Spécification d'une instance de serveur unique en tant que préférence

1 Ouvrez la boite de dialogue Preférences.
2 Sélectionnez Flash Builder > Données/Services.
3 Sélectionnéz la case à cocher pour l'utilisation d'une instance de serveur unique. Cliquez sur OK.

Génération de l'application client

Youusutilizez l'éditeur de code MXML pour creer une interface utilisateur.

Après avoir défini les composants de l'application à l'aide de l'éditeur de code, vous pouze lier les données renvoyées par le service aux composants de l'interface utilisateur. Générez des gestionnaires d'évenement en fonction des interactions de l'utilisateur avec l'application.

Vou puez aussi gencer un formule a partir des opérations de service disponibles dans la vue Données/Services.

Liaison d'opérations de service à des contrôleires

Utilisez la boite de dialogue Lier aux données pour lier une opération de service à un composant d'interface utilisateur.

La boite de dialogue Lier aux données est disponible à partir du menu Données de la barre d'outils dans la vue Données/Services.

Lorsque you liez une opération de service à un composant, Flash Builder génére du code MXML et ActionScript pour acceder à l'opération de service à partir de l'application client.

Types de回头 pour les opérations de service

Lorsque vous liez une opération de service à un contrôle, Flash Builder utilise le type des données renvoyées par l'opération. En règle générale, vous configrez le type de回头 pour une opération de service avant de la lier à un composant.

Si le type de回头 d'une opération de service n'a pas eté configuré, la boîte de dialogue Lier aux données vous invite à terminer cette étape.

Voir « Configuration des types de données pour les opérations de service de données » à la page 27.

Liaison d'un contrôle DataGrid à une opération de service (boîte de dialogue Lier aux données)

Cette procédure part du principe que vous âtes connecté à un service de données.

1 Dans la vue Structure, selectionnez le contrôle DataGrid. Vous pouvez également placer votre curses dans la balise dans l'éditeur MXML.
2 Ouvrez ensuite la boîte de dialogue Lier aux données en scélectionnant l'option Lier aux données du menu Données de Flash Builder.
3 Sélectionnez Nouvel appel de service, puis un service et une opération.

Si vous avez lié une opération de service à un composant, vous pouvez utiliser ces résultats. Dans ce cas, spécifie Résultat d'appeil existant et Sélectionné l'opération à utiliser.

4 (Facultatif) Sélectionnez Modifier type de retour.

Selectionnez Modifier type de return si vous pouze reconfigurer le type de return pour l'opération de service.

Si le type de return de l'opération n'a pas ete precedemment configuré, selectionnez Configurer le type de return.

Voir « Configuration des types de données pour les opérations de service de données » à la page 27.

5 Cliquez sur OK.

Le composant DataGrid change pour afficher les champs extraits de la base de données.

Voir Configuration de composants DataGrid et AdvancedDataGrid.

6 Enregistrez et executez l'application.

Génération d'un appel de service à une opération

Flash Builder peut générer une méthode ActionScript qui appelle une opération de service. Cette méthode n'est pas liée à un composant d'interface utiliser, mais peut être utilisé dans le code de l'application.

Outre la méthode ActionScript, Flash Builder génére une propriété CallResponder donnant accès aux données renvoyées à partir de l'appoint de service. Voir « CallResponder » à la page 38.

Génération d'un appel de service à une opération

Cette procédure part du principe que vous étés connecté à un service de données.

1 Dans la vue Données/Services, Sélectionnez une opération.
2 Dans le menu contextuel de l'opération, Sélectionnez Générer l'emploi de service.

Flash Builder génére une méthode pour appeler l'opération et affiche la méthode généree en mode Source dans l'éditeur MXML. Il create une propriété CallResponder qui contient le résultat de l'appel de service.

Cette option est également disponible à partir de la barre d'outils Données/Services.

Creation d'un-formulaire pour uneapplication

Les formulaires sont l'une des méthodes les plus courantes que les applications Web utilisent pour recueillir des informations des utilisateurs. Flash Builder peut générer des formulaires pour les données obtenues à partir des appeals de service ou pour les types de données personalisés utilisés pour acceder aux données distances.

Lors de la génération d'un-formulaire,Flash Builder create un conteneur de presentation Form et ajoute des composants afin d'afficher ou de modifier les données spécifiques recupérées à partir du service.

Flash Builder génére les types de formulaires suivants.

FormDescription
Type de donnéesCe formulaire contient les composants représentant les champ s'un type de données.
Détail des données principalesLe composant « principal » correspond en règle générale à un contrôle de données répertoriant les données obtenues d'un service. Le formulaire « détaillé » représentée des éléments individuels sélectionnés dans le composant principal.
Appel de serviceCréez deux formulaires. Le premier spécifique les entrées d'une opération. Le second affiche les données renvoyées.

Lors de la génération d'un-formulaire, définissez les champs à inclure, spécifiez le type du contrôle d'interface utilisateur utilisé pour représentier chaque champ et indiquez si le formulaire est modifiable ou non.

Création d'un-formulaire

Cette procédure indique comment générer un-formulaire pour un appel de service. Les procédures pour générer d'autres types de formulaires sont similaires.

1 Pour executer l'assistant Général le formulaire, Sélectionnez une opération depuis la vue Données/Services. Effectuez ensuite l'une des opérations suivantes :

  • Dans le menu contextuel de l'opération, Sélectionnez Générer le formulaire.
  • Dans le menu Données de Flash Builder, Sélectionnez Générer le formulaire.

2 Dans l'assistant Generer le formualeir, selectionnez Appel de service dans le champ Generer le formualeire pour.
3 Sélectionnez Nouvel appel de service ou Résultat d'appoint existant.

Spcificiez Résultat d'appeil existant pour utiliser le code génére précédemment pour un appel de service.

Sinon, activez Nouvel appel de service et selectionnez un service et une opération pour le formulaire.

4 (Facultatif) Les options disponibles sur le formulaire génére variant en fonction de l'opération.

Si l'opération accepte les paramètres, vous pouvez désir d'inclure un-formulaire pour les paramètres.

Si l'opération renvoie une valeur, vous pouvez désir d'inclure un-formulaire pour la valeur renvoyée.

Vousspovezchoisirendreleformulairemodifiableoude Irendreuniquementaccessiblelenlecture.

5 (Facultatif) Configurez les types d'entrée et les types de départ.

Si l'opération selectionnée dispose de paramètres d'entrée ou renvoie une valeur, vous pouvez configurer le type d'entrée ou le type de départ.

Configures precedemment, vous avez ici la possibilité de les configurer à nouveau.

Voir « Configuration des types de données pour les opérations de service de données » à la page 27.

6 Cliquez sur Suivant. Dans la boite de dialogue Mappage de contrôle de propriete, selectionnez les champs à inclure dans le formulaire et le type de contrôle pour représentier les données.
7 CliqueurTerminer.

Les formulaires généres par Flash Builder peuvent être superposés. Pour réarranger les formulaires générés, assurez-vous d'avoir bien sélectionné et déplace un-formalier et non un composant de ce dernier.

ADOBE FLEX 4.6 - Création d'un-formulaire - 1

La selection de formulaires superposés peut s'avérer difficile. Dans l'éditeur de code, sélectionnez la balise correspondant à un formulaire.

Génération d'un-formulaire de détails

Pour générer un-formulaire de détails,ajoutez un composant de contrôle de données à l'application et liez les résultats d'une opération au contrôle.

Ajoutez par exemple un composant DataGrid, puis liez à ce composant les résultats d'une opération telle que getItems_paged().

1 Dans la vue Structure, selectionnez un contrôle de données tel que DataGrid.
2 Dans le menu Données, Sélectionnez Générer le formulaire de détails.
3 Générez le formulaire en suivant les instructions fournies dans le paragraphe Création d'un formulaire.

Création d'un-formulaire pour un type de données

Pour générer un-formulaire avec des composants représentant les champs d'un type de données personalisé, commencez par configurer le type de données. Voir « Configuration des types de données pour les opérations de service de données » à la page 27.

1 Dans la vue Données/Services, Sélectionnez un type de données personalisé.
2 Dans le menu contextuel, selectionnez Générer le formulaire.
3 Assurez-vous que l'option Générer le formulaire pour Type de données est SéLECTIONNée, puis désissez un type de données.
4 (Facultatif) Rendez le formulaire modifiable si vous le souhaitez.
5 Cliquez sur Terminer.

Génération de gestionnaires d'événement pour l'extraction de données distances

Lorsque vous reliiez une opération de service de données à un composant, Flash Builder create un gestionnaire d'évenement qui renseigne le composant avec les données extraites du service.

Par exemple, si vous reliez une opération getAllItems() à un DataGrid, Flash Builder génére un gestionnaire d' événement creationComplete. Le composant DataGrid ↔reference le gestionnaire d'événements généré. Les résultats de l'appel deviennent le fournisseur de données du composant DataGrid.

protected function dataGrid creationCompleteHandler(event:FlexEvent):void { getAllItemsResult_token = productService.getAllItems(); } . . . <mx:DataGrid creationComplete="dataGrid creationCompleteHandler(event)" dataProvider="_{getAllItemsResult.lastResult}"> </mx:DataGrid> 

Lorsque vous exécutez l'application, le gestionnaire d'évenement renseigne le composant DataGrid créé avec les données extraites du service.

Lorsque vous creez des gestionnaires d'evénement, vous pouze accepter les gestionnaires créés ou les remplacer par des gestionnaires adaptés à vos besoin. Vous pouze par exemple replacer le gestionnaire d'evénement creationComplete sur DataGrid par un gestionnaire creationComplete sur Application.

Voupe qu egelement generer ou creer des gestionnaires d'evenement pour des contrôles acceptant les interactions avec l'utilisateur, par exemple les contrôles Button et Text.

Création d'un gestionnaire d'événement pour un composant d'interface utilisateur

1 Creez une application contenant un composant d'interface utiliser tel que DataGrid ou Button.
2 Flash Builder comporte un assistant de contenu facilitant la generation du gestionnaire d'évenement. Appuyez sur Ctrl+Espace ou Cmd+Espace (Mac) et selectionnez l'options Générer un gestionnaire d'évenement.
3 Flash Builder génére un nom unique pour le gestionnaire d' événement et place ce dernier dans le bloc Script. Flash Builder met en surbrillance le stub génére pour le gestionnaire d' événement dans l'éditeur de code. Completz le code restant pour le gestionnaire d' événement. Utilisez l'assistant de contenu afin de coder le gestionnaire d' événement.

Configuration des types de données pour les opérations de service de données

Lors de la connexion à un service de données, Flash Builder doit connaître le type des données renvoyées par une opération de service. Les types de données pris en charge sont ceux reconnus par AMF pour échanger des données avec un service de données ou un service distant.

De nombreux services de données définissent le type des données renvoyées sur le serveur (définition de type côté serveur). Toutefois, si le serveur ne définit pas le type, l'application client doit configurer le type des données renvoyées (définition de type côté client).

Les opérations de service qui spécifient les paramètres doivent également spécifique un type correspondant aux données auxquelles le service permet d'acceder. La définition de type côté client permet de configurer le type des paramètres d'entrée.

Lors de la configuration des types pour la définition de type côté client, Flash Builder reconnaît uniquement les types de données AMF. Le type peut également être un type de données personalisé représentant des données complexes ou un type vide pour indiquer que l'opération ne renvoie aucune donnée.

Voues pouvez configurer des types definis par l'utilisateur pour les opérations de service qui renvoient des données complexes. Si vous recuperez par exemple des enregistements d'une base de données d'employés, vous allez définir le retard de données complexes comme Employé. Dans ce cas, le type de données personalisé pour Employé contient des entrées pour chaque champ de l'enregistrement de base de données.

Types de données pour la définition de type côté client

Type défini par l'utilisateur (Employé)

Type deTTYesDescription
Types ActionScriptBoolean
Boolean[]
Array
Array[]
Date
Date[]
int
int[]
Number
Number[]
Object
Object[]
String
String[]
Aucune donnée renvoyéevoid
Type défini par l'utilisateurCustomType
CustomType[]
ChampType de données
emp_noNumber
first_nameString
last_nameString
hire_dateDate
birth_dateDate

Authentication de l'accès aux services

Les services de données nécessitent généralement une authénticipation de l'utilisateur avant d'autorisier l'accès aux services. Les services PHP, BlazeDS et ColdFusion donnant accès à l'aide du protocole HTTP peuvent requérir une authénticipation supplémentaire. Dans certains cas, ces types de services nécessitent une authénticipation HTTP et une authénticipation distante.

Flash Builder offre une option d'authentication du service lorsque vous effectuez les opérations suivantes :

  • Configuration du type de回头 pour une opération

Voir « Configuration du type de return pour les données d'une opération » à la page 29.

  • Utilisation de l'interface Opération de test

Voir « Test des opérations de service » à la page 31.

Lorsque vous selectionné l'option Authentication requise, Flash Builder ouvre la boîte de dialogue Authentication des services. Suivant le type de service auquel vous accédez, vous pouvez désirir l'authentication de base ou l'authentication distante.

Authentication de base

L'authentication de base permet d'acceder aux services HTTP et Web. Fournissez le nom d'utilisateur et le mot de passé pour acceder à ces services.

Selectionnez les options de mémorisation du nom d'utilisateur et du mot de passer si vous souhaitez que Flash Builder utilise les autorisations spécifiées tout au long de la session.

Authentication à distance

L'authentication distante permet d'acceder aux services d'objets distants. Les services d'objets distants sont des services implémentés en tant qu'objets distants à l'aide de ColdFusion, PHP, BlazeDS ou LiveCycle Data Services.

Flash Builder ne fournit pas l'interface d'authentication distante pour les projets qui n'implément pas de services d'objets distants.

Fournissez le nom d'utilisateur et le mot de passage pour acceder aux services d'objets distants.

Selectionnez les options de mémorisation du nom d'utilisateur et du mot de passer si vous souhaitez que Flash Builder utilise les autorisations spécifiées tout au long de la session.

Configuration des paramètres d'entrée d'une opération

Pour la définition de type côté client, configurez les paramètres d'entrée des opérations disponibles à partir du service de données.

La procédure suivant part du principe qu'une connexion à un service de données a été établie dans Flash Builder et que le service de données dispose d'opérations nécessitant des paramètres d'entrée configurable.

1 Dans la vue Données/Services, Sélectionnez une opération contenant des paramètres d'entrée configurable. Dans le menu contextuel de l'opération, Sélectionnez Configurer les types d'entrée.
2 Dans la boite de dialogue Configurer les types d'entrée, Sélectionnez un type de données dans la liste pour chaque argument de l'opération. Cliquez sur OK.

Vou prourez également sélectionner les types de données de return personnelisés préalablement définis.

Pour la définition de type côté serveur, le service spécifique le type de données pour les paramètres d'entrée.

Configuration du type de return pour les données d'une opération

Un service qui définit le type des données renvoyées par une opération fournit la définition de type côté serveur. Si un service ne définit pas le type des données renvoyées par une opération, Flash Builder utilise la définition de type côté client pour définir le type des données renvoyées.

Flash Builder introspecte les données renvoyées par une opération de service afin d'en déterminer le type. Lorsque vous configurez le type de retard d'une opération, vous avez deux options :

  • Détector automatiquement le type de return à partir de l'exemple de données

Si le service implémente la définition de type côté serveur, Flash Builder détecte le type de données définis par le service.

Si le service n'implemente pas la définition de type côté serveur, Flash Builder create un type personnelisé pour l'application client. Pour la définition de type côté client, spécifie un nom pour le type personnelisé. En règle générale, le nom décrit les données renvoyées. Par exemple, si l'opération renvoie un tableau de livres à partir d'un tableau de base de données, nombre le type Livre.

Utiliser un type de données existant

Un type existant peut être défini par le service, un type ActionScript ou un type personnelisé précédemment défini.

La procédure utilisé par Flash Builder pour introspecter les données varie légèrement en fonction du type de service de données. Par exemple, la procédure utilisé pour introspecter et configurer le type de retour pour un service HTTP est différente de cette utilisé pour les services PHP ou ColdFusion.

Fusion et modification de types de données

Lors de l'introspection des données de serveur, vous pouvez fusionner les champs d'un autre type de données ou creer un type de données basé sur un type de données existant. Voici quelques méthodes de modification d'un type de données personalisé.

  • Utilisation d'un nouveau nom pour un type de données existant

Utilisez un nouveau nom si vous prévoyez d'utiliser les données renvoyées de différentes manières dans l'application client.

Par exemple, vous pouvez extraire des données employé qui peuvent être utilisées dans le résumé de l'employé et dans les tableaux d'informations des employés dans l'application client.

  • Fusion de champs

Vous pouvez ajouter des champs renvoyés à un type de données existant. L'ajout de,champs supplémentaires peut être utile lors de l'association de données provenant de plusieurs sources, par exemple pour une opération JOIN renvoyant des données extraites de plusieurs tableaux de base de données.

Un autre exemple est celui de données provenant de différents services, par exemple la fusion de données de type Livre reçues d'un service HTTP et d'un service ColdFusion.

Configuration d'un type de données personalisé (services PHP ou ColdFusion)

Cette procédure part du principe que vous étés connecté à un service de données implémenté avec PHP ou ColdFusion.

1 Dans la vue Données/Services, Sélectionnez Configurer le type de retour dans le menu contextual d'une opération.
2 Si l'opération comporte des arguments, entrez les valeurs d'argument. Sécífiez le type de données correct pour l'argument.
3 (Type personnelisé nouveau ou modifié) Sélectionnez l'option de détction automatique du type des données renvoyées par cette opération.

Si ce service nécessite une authentification, selectionnez Authentication requise et fournissez les autorisations requis. Voir « Authentication de l'accès aux services » à la page 28.

Flash Builder introspecte l'opération et create un type de données personalisé.

Sécífiez un nom pour le type de données personalisé.

Si vous avez préalablement defini un type de données personnalisé, vous pouvez ajouter les champs renvoyés à la définition du type de données personnalisé existant.

4 (Utilisation du type existant) Utilisez cette option pour spécifier un type ActionScript ou un type que vous avez précédemment configuré.
5 Cliquez sur Terminer.

Configuration d'un type de données personalisé (services HTTP)

Cette procédure part du principe que vous étés connecté à un service HTTP.

1 Dans la vue Données/Services, Sélectionnez Configurer le type de回头 dans le menu contextual d'une opération.
2 (Nouveau type personnelisé) Sélectionnez l'option de détction automatique du type des données renvoyées par cette opération.

Si ce service nécessite une authentification, selectionnez Authentication requise et fournissez les autorisations requires.

Flash Builder introspecte l'opération et create un type de données personnalisé. Choisissez une méthode permettant à Flash Builder de passer les valeurs des paramètres de l'opération et cliquez sur Suivant.

  • (Saisie des valeurs des paramètres) Pour chaque paramètre, spécifie une valeur.

Vou puez egalent specier le type de donnees des parametes. Flash Builder selectionne automatique le type de donnees par defaut.

  • (Saisie de l'URL du service) Saisissez l'URL du service HTML, en incluant les paramètres et les valeurs dans l'URL. Par exemple :
  • (Saisie de la réponse XML/JSON) Copiez la réponse XML/JSON dans la zone de texte.

Utilisez cette option si vous estes hors ligne ou si le service HTTP est encore en cours de développement, mais vous connaissiez la reponse provenant du serveur.

3 (Nouveau type personnelisé, suite) Sécífiez un nom de type de données personalisé ou Sélectionnez un nœud provenant des données renvoyées.

Si vous scélectionnez un nœud pour les données renvoyées, Flash Builder create un type de données personnalisé pour les données renvoyées pour ce nœud.

Indiquez si les données sont renvoyees sous forme de tableau.

Si le service renvoie un fjichier XML, la liste déroulante Sélection de la racine est activée. Sélectionnez un nœud dans le fjichier XML pour spécifier un type de données.

4 (Utilisation du type existant) Utilisez cette option pour spécifier un type ActionScript ou un type que vous avez précédemment configuré.
5 Cliquez sur Terminer.

Test des opérations de service

Voupeus potier Flash Builde por teter des opertions de service et afficher les donnees renvoyees par une opération. Cette fonction est utile pour verifier le comportement des services.

Important: certaines opérations, telles que la mise à jour ou la suppression, entraînant une modification des données sur le serveur.

Test d'une opération de service

Cette procédure part du principe que vous étés connecté à un service de données.

1 Dans la vue Données/Services, Sélectionnez une opération de service. Dans le menu contextuel, Sélectionné Opération de test.

La vue Opération de test s'ouvre et affiche l'opération sélectionnée. Si l'opération nécessite des paramètres d'entrée, la vue Opération de test comporte une liste des paramètres.

2 Pour chaque paramètre d'entrée requis, cliquez sur le champ Entrer une valeur et spécifiez une valeur.

Si le paramètre nécessite un type complexe, cliquez sur les points de suspension pour ouvrir un éditeur de saisie d'argument. Saisissez une valeur dans l'éditeur.

L'éditeur de saisie d'argument accepte la notation JSON pour la représentation de types complexes dans ActionScript.

3 Si le serveur requiert une authentification, selectionnez l'option Authentification requise. Cliquez sur Tester.

Fournisse les autorisations le cas échéant. Voir « Authentication de l'accès aux services » à la page 28.

Flash Builder affiche les données renvoyees par le service.

4 (Facultatif) Dans la vue Opération de test, Sélectionnéz et testez d'autres services et opérations disponibles.

Gestion de l'accès aux données à partir du serveur

Pagination: la pagination est l'extraction incrémentede quelques de données volumieux d'un service distant.

Supposons par exemple que vous souhaitiez acceder à une base de données contenant 10 000 enregistrements pour en afficher les données dans une grille composée de 20 lignes. Vous pouvez dans ce cas implémenter une opération de pagination chargée d'extraire les lignes par incréements de 20 jours. Une demande de données supplémentaires (matérialisée par exemple par le défilament de la grille de données par l'utilisateur) conduit à l'extraction et à l'affichage de la page d'enregistrements suivante.

Gestion des données: dans Flash Builder, la gestion de données est la synchronisation des mises à jour des données sur le serveur à partir de l'application client. Elle permet de modifier un ou plusieurs éléments dans une application client sans partager à jour le serveur, puis de valider l'ensemble des modifications apportées au serveur en une seule opération. Vous pouvez également annuler les modifications sans partager à jour les données.

La gestion de données implique la coordination de plusieurs opérations (creatio, recuperation, mise a jour et suppression) repondant aux événements de l'application client, tels que la mise a jour de l'enregistrement de l'employé.

Lors de l'activation de la gestion des données avec Flash Builder, ce dernier génére un code mettant automatiquement à jour les composants de l'interface utilisé. Par exemple, Flash Builder génére un code assurant la synchronisation des composants DataGrid avec les données sur le serveur.

Activation de la pagination

Vouss pouvez activer la pagination pour un service de données qui implémente une fonction de pagination avec la signature suivante :

getItems_paged(startIndex:Number, numItems:Number): myDataType

Nom de la fonctionVous pouvez utiliser n'importequel nom valide pour la fonction.
startIndexLa première ligne de données à extraire.Définissez le type de données pour startIndex en tant que nombre dans l'opération client.
numItemsLe nombre de lignes de données à extraire dans chaque page.Définissez le type de données pour numItems en tant que nombre dans l'opération client.
myDataTypeLe type de données renvoyé par le service de données.

Lors de l'implémentation de la pagination à partir d'un service, vous pouze aussi implémenter une opération count(). L'opération count() renvoie le nombre d'éléments renvoyés par le service. Flash Builder requiert que l'opération count() implémente la signature suivante:

count():Number

Nom de la fonctionVous peuvent utiliser n'importequel nom valide pour la fonction.
NumberNombre d'enregistrements extrait de l'opération.

Flex utilise l'opération count pour afficher correctement les composants de l'interface utiliser qui extraient des jours de données volumineux. L'opération count() contribue par exemple à déterminer la taille du curseur de la barre de défilament d'un objet DataGrid.

Certains services distants ne fournissant pas d'opération count(). La pagination continue à fonctionner, mais le contrôle qui affiche les données paginées risque de ne pas représententer correctement la taille du jeu de données.

Opérations de pagination des interrogations filtrées

Activez la pagination des interrogations pour filtrer les résultats envoyés par la base de données. Lorsque vous filtrez les résultats de l'interrogation, 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)

filterParam1Paramètre de filtré facultatif. Ce paramètre est le même dans les fonctions getItems_PagedFiltered() et countFiltered().
filterParam2Paramètre de filtré facultatif. Ce paramètre est le même dans les fonctions getItems_PagedFiltered() et countFiltered().

Voici un fragment de code d'une fonction getItems_pagedFiltered() implémentée dans PHP pour acceder à la base de données MySQL. Il indique comment utiliser le paramètre de filtré facultatif.

get_Statements_paged( expression, startIndex, $numItems) { SELECT * from employees where name LIKE expression LIMIT startIndex, $numItems; }

Activation de la pagination pour une opération

Cette procédure part du principe que vous avez code les opérations��Items_paged() et count() du service distant et que vous avez configuré le type de données de return pour l'opération, ainsi que décrit dans « Configuration des types de données pour les opérations de service de données » à la page 27.

1 Dans la vue Données/Services, ouvre le menu contextual de l'opération Items_paged() et selectionnez Activer la pagination.
2 En l'absence de clé unique pour le type de données, spécifie les attributs qui caractériseront une instance de ce type de données de manière univoque. Cliquez sur Suivant.

Cet attribut est généralement la clé primaire.

3 (Facultatif) Sécífiez le nombre d'éléments à récapérer pour définir un format de page personnalisé.

Si vous ne spécifie pas de format de page personnalisé, un format par défaut est définir au niveau du service. Par défaut, une page peut containir 20 enregistrements.

4 (Facultatif) Sécífiez l'opération count(). Cliquez sur Terminer.

L'opération count() permet à Flash Builder d'afficher correctement les éléments de l'interface utiliser, tels que la taille du curseur de la barre de défilament.

La pagination est activée pour l'opération.

Dans la vue Données/Services, la signature de la fonction qui implèmente la pagination n'inclut plus les paramètres startIndex et numItems. Flash Builder ajoute maintenant ces valeurs de façon dynamique et les détermine en fonction de la taille des pages définie par l'utilisateur ou de la taille des pages par défaut (20 enregistrements par page).

Activation de la gestion des données

Pour activer la gestion de données pour un service, le service implémente une ou plusieurs des fonctions suivantes. La gestion de données utilise ces fonctions pour synchroniser les mises à jour des données sur le serveur distant :

  • Ajout (createItem)
createItem(item: myDatatype):int createItem(item: myDatatype):String createItem(item: myDatatype):myDataType 

Le type de回头 de la méthode creation() est le type de la clé principale de la base de données.

  • Obtention de toutes les propriétés (getItem)
getItem(itemID:Number):myDatatype
  • Mise à jour (updateItem)
updateItem((item: myDataType):void  
updateItem((item: myDataType, originalItem: myDataType):void  
updateItem((item: myDataType, originalItem: myDataType, changes: String()));void 
  • Suppression (deleteItem)
deleteItem(itemID:Number):void 

Dans Flash Builder, ces fonctions doivent avoir les signatures suivantes.

Nom de la fonctionVous pouvez utiliser n'importequel nom valide pour la fonction.
item originalItemÉlement du type de données renvoyé par le service de données.
itemIDIdentifiant univoque de l'élement, généralement la clé primaire dans la base de données.
changes[]Tableau correspondant aux champes d'un élément Item spécifique. Cet argument est utilisé uniquement dans une version de la méthode updateItem().
myDataTypeType de données de l'élement du service de données. En général, vous définissez un type de données personnelisé lorsque vous extrayez des données d'un service.

Indicateur autoCommit

La gestion de données permet de synchroniser les mises à jour des données sur le serveur. Les modifications apportées aux données dans l'application client ne sont pas mises à jour sur le serveur tant que l'appel de la méthode service.commit() n'a pas été effectué.

Cependant, si vous souhaitez désactiver cette fonctionnalité, définissez l'indicateur autoCommit sur true. Si autoCommit est défini sur true, les mises à jours des données du serveur ne sont pas mises en cache, mais sont effectuées immédiatement. Voir « Activation de la gestion de données pour un service » à la page 41.

Indicateur 删除ItemOnRemoveFromFill

Lorsque vous supprimez des éléments alors que la gestion des données est activée, utilisez l'indicateur deleteItemOnRemoveFromFill. Par défaut, cet indicateur est défini sur true. Lorsque vous supprimez un élément, cet élément est immédiatement retire de la base de données.

Définissez deleteItemOnRemoveFromFill sur false pour différer la suppression jusqu'à l'appoint de la méthode commit(). L'exemple suivant illustré le code pour la création d'un gestionnaire d'évenement complet pour un contrôle DataGrid. Si l'utiliseur supprime un élément Employee Sélectionné dans le DataGrid, l'élement sélectionné n'est terminé de la base de données qu'à l'appoint de la méthode commit().

protected function dg creationCompleteHandler(event:FlexEvent):void { employeeService. getDataManager employeeService.DATAMANAGEREMPLOYEE).autoCommit=false; employeeServicegetDataManager( empl ooyeeService.DATAMANAGEREMPLOYEE).deleteItemOnRemoveFromFill = true; getAllEmployeesResult_token employeeService.getAllEmployees();
}

Activation de la gestion de données pour une opération

Cette procédure part du principe que vous avez implémenté les opérations requises dans le service distant et que vous avez configuré le type de données de return pour les opérations utilisant un type de données personnalisé. Voir « Configuration des types de données pour les opérations de service de données » à la page 27.

1 Dans la vue Données/Services, développer le œud Types de données.
2 Accedez au menu contextuel d'un type de données et selectionnez Activer la gestion de données.
3 En l'absence de clé unique pour le type de données, spécifie les attributs qui caractériseront une instance de ce type de données de manière univoque. Cliquez sur Suivant.

Cet attribut est généralement la clé primaire.

4 Spécifiez les opérations d'ajout, d'obtention de toutes les propriétés, de mise à jour et de suppression que vous avez implémentées. Cliquez sur Terminer.

Remarque : il n'est pas nécessaire d'implémenter toutes ces fonctions. Implémentez uniquement celles qui sont requisées pour votre application.

La gestion des données est activée pour l'opération.

Génération du code Flash Builder pour les applications client

Flash Builder génére du code clientdonnant acces aux operations du service distant. La generation de code est déclenchée par les opérations suivantes:

  • Connexion à un service de données
  • Actualisation du service de données dans la vue Données/Services
  • Configuration d'un type de return pour une opération
  • Liaison d'une opération de service à un contrôle de l'interface utilisateur
  • Activation de la pagination pour une opération de service
  • Activation de la gestion de données pour un service
  • Création d'un gestionnaire d'évenement ou d'un appel de service

Classes du service

Utilisez l'assistant de service pour vous connecter à un service de données. Lorsque vous vous connectez à un service, Flash Builder génére un fjichier de classe ActionScript donnant accès aux opérations du service.

Pour les services qui accèdent à un composant RemoteObject, la classe généraee étend la classe RemoteObjectServiceWrapper. En règle générale, les services implémentés avec PHP, ColdFusion, BlazeDS et LiveCycle Data Services accèdent à un RemoteObject.

Pour les services HTTP, la classe générae estend la classe HTTPServiceWrapper.

Pour les services Web, la classe générae estend la classe WebServiceWrapper.

Flash Builder base le nom du fjichier de la classe généree sur le nom attribué au service dans l'assistant de service. Par défaut, Flash Builder place cette classe dans le dossier source principal d'un projet. En règle générale, ce dossier est nommé src. Le nom du package est basé sur celui du service. Par exemple, Flash Builder génére les classes ActionScript suivantes pour une classe EmployeeService.

La super-classe contient l'implémentation de la classe EmployeeService.

La super-classe est une classe généree. Ne l'éditez jamais. Les modifications apportées à la super-classe risquent d'être replacées. Les modifications apportées à l'implémentation peuvent provoquer un comportement non défini.

Dans cet exemple, utilisez EmployeeService.as pour étendre la super-classe généree et ajouter l'implementation.

Voir aussi

« Connexion à des services de données » à la page 9

Classes de types de données personalisés

De nombreux services de données distants fournissant une définition de type côté serveur. Ces services reçoient des données complexes comme type de données personnalisé.

Pour les services de données distantes ne renvoyant pas de données typées, Flash Builder fournit une définition de type côté client. Avec la définition de type côté client, vous utilisez l'assistant de connexion Flash Builder pour définir et configurer le type des données complexes renvoyées par le service. Vous pouvez par exemple définir et configurer un type de données Employé pour un service renvoyant des enregistements d'une base de données d'employés.

Flash Builder généra une classe ActionScript pour l'implementation de chaque type de données personnalisé envoyé par le service. Il utilise cette classe pour creer des objets de valeur, qu'il utilise ensuite pour acceder aux données à partir du service distant.

Par exemple, Flash Builder générale les classes ActionScript suivantes pour une classe EmployeeService qui contient un type de données Employee :

Les super-classes contiennent respectivement l'implémentation de la classe EmployeeService et le type de données Employee.

N'éditez jamais une super-classe généree. Les modifications apportées à la super-classe risquent d'être remplacées. Les modifications apportées à l'implementation peuvent provoquer un comportement non défini.

Dans cet exemple, utilisez EmployeeService.as et Employee.as pour étendre la super-classe généree et ajouter l'implementation.

Liaison d'une opération de service à un contrôle de l'interface utilisateur

Pour obtenir des informations sur la liaison des données renvoyées par des opérations de service à un contrôle de l'interface utilisateur, voir « Liaison d'opérations de service à des contrôles » à la page 23. Lorsque vous liez une opération de service à un contrôle, Flash Builder génére le code suivant :

  • Une balise Declarations contenant une propriété CallResponder et une balise de service
  • Un gestionnaire d'évenement pour appeler l'appeal de service
  • Une liaison de données entre le contrôle et les données renvoyées par l'opération

Balise Declarations

Une balise Declarations est un élément MXML qui déclare des propriétés de la classe actuelle qui ne sont pas des propriétés par défaut ni visuelles. Lors de la liaison d'une opération de service à une interface utilisateur, Flash Builder généraune une balise Declarations contenant une propriété CallResponder et une balise de service. La propriété CallResponder et la classe de service généraee sont les propriétés de l'élément de conteneur, qui est généralement la balise Application.

L'exemple suivant présente une balise Declarations donnant accès à 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 propriété CallResponder gère les résultats des appel effectuels à un service. Elle contient une propriété de jeton définie sur le jeton Async renvoyé par un appel de service. La propriété CallResponder contient également une propriété lastResult, définié sur le dernier résultat réussi de l'appoint de service. Vous ajoutez des gestionnaires d'évenement à la propriété CallResponder pour donner accès aux données renvoyées par l'intémédiaire de la propriété lastResult.

Lorsque Flash Builder génére une propriété CallResponder, il génère une propriété ID en fonction du nom de l'opération de service à laquelle elle est liée. L'exemple de code suivant illustrer les propriétés CallResponder de deux opérations d'un service EmployeeService. L'opération getAllItems est liée au gestionnaire d'évenement creationComplete d'un composant DataGrid. L'opération delete est liée à l'objet selectionné dans le composant DataGrid. Immediatement après sa création, le composant DataGrid affiche les éléments extraits de l'appel de service getAllItems. Le contrôle Delete Item Button supprime de la base de données l'enregistrement selectionné dans le composant DataGrid.

<fx:Script>
    <!-- CDATA[ import mx.events.FlexEvent; import mx.controlss.Aclert; protected function dg creationCompleteHandler(event:FlexEvent):void { getAllItemsResult_token = employeesService>AllItems(); } protected function button clickHandler(event:MouseButton):void { deleteItemResult_token = employeesService.deleteItem(dgSelectedItem.emp_no); } ]
</fx:Script>
<fx:Declarations>
    <s:CallResponder id="getAllItemsResult"/>
    <employeeservice: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.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>
<s:Button label="Delete Item" id="button" click="button.ClickHandler(event)" /> 

Gestionnaires d' événement

Lorsque vous reliiez une opération de service à un composant de l'interface utiliser, Flash Builder create un gestionnaire d'évenement pour la propriété CallResponder. Le gestionnaire d'évenement gère les résultats de l'opération. Vous pouze également créé un gestionnaire d'évenement dans un bloc de code ActionScript et réféencer ce gestionnaire d'évenement à partir d'une propriété d'un composant de l'interface utilisé.

Vous renseignez généralement les contrôle tels que List et DataGrid avec les données renvoyées par un service. Par défaut, Flash Builder généra pour le contrôle un gestionnaire d'evénement creationComplete qui est déclenché immidiatement après la création du contrôle. Pour d'autres contrôle, il génère un gestionnaire pour l'événement par défaut. Pour un bouton par exemple, il génère un événement pour l'événement click.

La propriété event du contrôle est définié sur le gestionnaire d'évenement généré. L'exemple suivant illustré le gestionnaire d'évenement creationComplete généré pour un contrôle DataGrid :

<fx:Script>
    <!-- CDATA[ import mx.events.FlexEvent; import mx.controlss.Aclert; protected function dg creationCompleteHandler(event:FlexEvent):void {
        getAllItemsResult_token = employeesService所有人都;
    } ]
])
</fx:Script>
...
<mx:DataGrid id="dg" editable="true"
    creationComplete="dg creationCompleteHandler(event)" dataProvider="{{四个方面Result}}">
    <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> 

Voupez generer des gestionnaires d'evénement pour des contrôles repondant aux événements user (les contrôles Button, par exemple). L'exemple suivant presente un gestionnaire d'evénement génére pour un bouton qui renseigne un contrôle DataGrid :

<fx:Script>
    <!--[CDATA[ import mx.events.FlexEvent; import mx.controlss.Altet; protected function button.clickHandler(event:MouseEvent):void { deleteItemResult_token = employeesService(deleteItem(dgSelectedItemermo); } ]]">
</fx:Script>
... <s:Button label="Delete Item" id="button" click="button.clickHandler(event)" /> 

Liaison de données

Lorsque vous creez une interface utiliseur, vous liez les opérations de service aux contrôles. Voir « Liaison d'opérations de service à des contrôles » à la page 23.

Flash Builder génére du code qui lie les données renvoyées par une opération de service au contrôle de l'interface utilisé affichant les données.

L'exemple suivant illustré le code que Flash Builder génére pour renseigner un contrôle DataGrid. L'opération getAllItems renvoie un ensemble d'enregistements d'employés pour le type de données personnalisé Employé.

La propriété dataProvider du contrôle DataGrid est liée aux résultats stocks dans la propriété CallResponder, getAllItemsResult. Flash Builder met automatiquement à jour le contrôle DataGrid en fonction des colonnes DataGridColumn correspondant à chaque champ renvoyé pour un enregistrement Employé. Les propriétés headerText et dataField de chaque colonne sont définies en fonction des données renvoyées 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> 

Activation de la pagination pour une opération de service

Lorsque vous activez la pagination, Flash Builder modifie l'implémentation du service génére. Lorsque vous renseignez un contrôle de données (un contrôle DataGrid ou List, par exemple) avec des données paginées, Flash Builder détermine le nombre d'enregistrentes visibles dans le contrôle de données et le nombre total d'enregistrentes dans la base de données. Il fournit ces valeurs en tant qu'arguments à l'opération de service que vous avez utilisée pour implémenter la pagination.

Vous n'vez pas à modifier de code d'application client une fois la pagination activée.

Pour plus d'informations, voir « Activation de la pagination » à la page 32.

Activation de la gestion de données pour un service

Dans Flash Builder, la gestion de données est la synchronisation d'un ensemble de mises à jour des données sur le serveur. Vous pouvez activer la gestion de données pour les types de données personnalisés renvoyés par un service. Avec la gestion de données activée, vous pouvez modifier un ou plusieurs éléments dans une application client sans mesure à jour le serveur. Vous pouvez ensuite valider l'ensemble des modifications apportées au serveur en une opération. Vous pouvez aussi annuler les modifications sans mesure à jour les données sur le serveur. Pour plus d'informations sur l'implementation de cette fonction, voir « Activation de la gestion des données » à la page 34.

Lorsque vous activez la gestion des données, Flash Builder modifie l'implémentation de la classe de service généree et de la classe générée pour les types de données personalisés. Il create une classe DataManager pour implémenter cette fonctionnalité.

Synchronisation des mises à jour avec les données de serveur

Lorsque vous appelez des opérations de service pour un type de données géné, les changements sont reflétés dans l'application client. Toutefois, vous pouvez spécifique que les données sur le serveur ne soient mises à jour que lorsque vous appelez la méthode commit() de la classe DataManager.

Lorsque la gestion des données est activée pour un service, le service comporte un indicateur autoCommit. Par défaut, autoCommit est définir sur false.

L'indicateur autoCommit détermine si les changements sont validés immédiatement ou s'il faut attendre l'appel de service.commit().

Si autoCommit est défini sur false, toutes les mises à jour du service dans l'application client sont mises en cache jusqu'à l'appel de service.commit(). Vous pouvez appeler la méthode revertChanges() du service pour ignorer les changements.

Si autoCommit est défini sur true, les mises à jours sont envoyées immédiatement au serveur. Vous ne pouvez pas appeler la méthode revertChanges() pour ignorer les changements.

L'indicateur deleteItemOnRemoveFromFill déterminé si un élément supprimé est immédiatement retire de la base de données. Si l'indicateur est défini sur true, l'élement n'est supprimé qu'à l'appel de service.commit().

Le code suivant désactive la synchronisation par gestion des données des mises à jour avec les données du serveur. Les modifications apportées aux données du type géré sont mises à jour immédiatement sur le serveur.

bookServicegetDataManager(bookService.DATAMANAGERBOOK).autoCommit = true;

Le code suivant active la synchronisation de la gestion de données des mises à jour des données du serveur. Les modifications apportées aux données pour le type géré ne sont mises à jour qu'à l'appoint ( ) pour le service. En outre, les éléments supprimés ne sont retirés de la base de données qu'à l'appoint de commit ( ).

bookServicegetDataManager(bookService.DATAMANAGERBOOK).autoCommit = false;
bookServicegetDataManager(bookService.DATAMANAGERBOOK).deleteItemOnRemoveFromFill = true;

Annulation des modifications

La classe DataManager fournit la méthode revertChanges qui permet de rétablier dans l'application client les valeurs extraites du serveur avant le dernier appel de la méthode commit.

Appelez revertChanges() avant d'appeler commit() pour annuler les modifications apportées à un type de données géné dans l'application client :

bookServicegetDataManager(bookService.DATAMANAGER.Book).revertChanges();

Pour valider les modifications apportées au type de données géné, appelez la méthode commit().

bookServicegetDataManager employeeService.DATAMANAGER_EMPLOYEE).commit();

Vous pouvez également appeler la méthode committ directement à partir de l'instance bookService. L'expérience de la méthode committ directement à partir de l'instance de service valide toutes les modifications pour l'ensemble des types de données générés.

bookService.commit();

Remarque: vous ne pouvez pas appeler revertChanges() directement à partir de l'instance de service pour annuler les modifications apportées à tous les types de données générés. Vous ne pouvez l'appeler que pour un type de données géné spécifique.

Si vous souhaitez remplaner le comportement par defaut de la gestion des données et deselectiver la possibilité de rétablir les modifications, définissez l'indicateur autoCommit sur true. Par exemple, si vous disposé d'une instance de bookService et avez activé la gestion des données pour le type de données Book, définissez autoCommit sur true :

bookServicegetDataManager(bookService.DATAMANAGERBOOK).autoCommit = true;

Les modifications apportées aux données pour le type géré sont désormais mises à jour immédiatement sur le serveur.

Déploiement des applications accédant aux services de données

Il existe de nombreux facteurs à considérer lorsqu'vous déplacez votre application d'un environnement de développement vers un environnement de déploiement. Le processus de déploiement d'une application dépend de votre application, de ses exigences et de leur environnement de déploiement.

Par exemple, le processus de déploiation d'une application d'un site Web interne accessible uniquement aux employés de l'entreprise est différent du processus de déploiation de la même application sur un site Web public.

La section Deploying applications présente les différents éléments à considérer et inclut une liste de contrôle de déploiement (Deployment checklist). La liste de contrôle aborde les problèmes courants de configuration de système que les clients ont pu rencontres lors du déploiement des applications pour la mise en production. La documentation contient également des conseils de dépannage permettant de détecter les problèmes de déploiement les plus courants.

Meilleures pratiques pour le codage de l'accès aux services de données

Les outils Flash Builder vous permettent de générer du code client pour acceder aux données d'une base de données. Cette fonction est disponible pour PHP et ColdFusion. Cependant, ce code est destiné uniquement au prototypage. N'utilise pas ce code comme modèle pour écrire des applications sécurisées.

Par défaut, le code génééré permet à toute personne disposant d'un accès reseau à votre serveur d'insérer, de seLECTIONner, de mettre à jour ou de supprimer des éléments du tableau de base de données. Voici quelques recommendations à prendre en compte lors de la modification du code génééré ou de la réduction de code accédant aux services. Pour plus d'informations, voir Sécurisation des services de données.

Suppression de fonctions inutilisées

Supprimez ou ajoutez un commentaire à toute fonction que vous ne souhaitez pas utiliser dans votre application.

Ajout d'authentication

Ajoutez l'authentication utilisateur afin de vous assurer que leurs utilisateurs de confiance peuvent acceder à vos informations de base de données.

Ajout des vérifications d'autorisation

Si l'authentication est nécessaire, ajoutez les vérifications d'autorisation. Meme si vous avez donné accès à des utilisateurs authentifiés à votre application, vousdezvezvousassurer quilsont autorisés à faire des requêtes spécifique.

Par exemple, vous pouvez autoriser tous les utilisateurs à selectionner, mais restreindre le nombre d'utilisateurs autorisés à supprimer.

Un autre exemple consiste à autoriser un utilisateur A à extraire ses propres informations à l'aide d'une requête de seLECTION tout en l'empêchant d'utiliser cette même requête pour acceder aux informations de l'utilisateur B.

Validation de données

Assurez-vous d'ajouter la validation de données. Par exemple, effectuez une validation des données fournies à toute instruction d'insertion afin de vous assurer qu'une donnée erronée ou malveillante ne soit acceptée dans la base de données.

La validation cote client ne permet pas de vous protegger des envois de requêtes manuelles à votre serveur Web. La validation des données protège contre les pirates et garantit la qualite des informations stockées.

Restriction de la quantité de données extraites

Les méthodes de sélection peuvent sélectionner la totalité d'un tableau. Dans certains cas, cela peut entraîner la présence d'une quantité trop importante d'informations sur le réseau. Extrayez uniquement les données dont vous avez besoin.

Par exemple, SELECT * à partir d'un tableau d'utilisateurs peut renvoyer le nom de l'utilisateur et son mot de passer sur le réseau.

Utilisation de SSL pour les données sensibles

L'utilisation d'un protocole sécurisé permet d'assurer la sécurité des informations que vous envoyez.

Exportation des fichiers source avec version validée d'une application

Lorsque vous exportez la version validée d'une application, Flash Builder fournit l'option Activer l'affichage de la source. Cette option permet aux utilisateurs d'afficher les fischiers source qui implémentent l'application. Dans le cadre des projets pour serveurs, les fischiers source incluent le dossier services qui contient les fischiers fournissant l'accès à l'implémentation du service.

Important: faites preuve de prudence lorsque vous incluez des fichiers de service avec l'option d'affichage de la source. Lors de l'accès à la base de données, les fichiers de service expositent des détails et peuvent compter des informations sensibles, telles que des noms d'utilisateurs et des mots de passée. Si des services sont inclus dans l'option d'affichage de la source, toute personne ayant accès à l'application lancée peut également acceder à des données sensibles.

Voir aussi

Sécurité Flex

Écriture de services sécurisés

Les exemples de la documentation Adobe, y compris les didacticiels et les applications créées à l'aide de la génération de code Flash Builder, sont instructifs de par leur nature. Ils illustrent comment acceder aux services de données à partir d'une application client. Cependant, dans la mesure où ces exemples sont conçus dans une optique de clarté, ils n'illustrent pas les;
meilleures pratiques en matière d'accès sécurisé aux données.

La documentation Flash Builder contient des exemples, dont des applications créées à partir de code génére. Ces exemples doivent être déployés dans un environnement de développement faisible. Un environnement de développement faisible peut être un ordinateur local ou un emplacement à l'intérieur d'un pare-feu. Sans mesures de sécurité supplémentaires, toute personne disposant d'un accès au réseau peut acceder à votre base de données.

Les mêtres pratiques en matière de réduction de services incluent :

  • Authentifiez l'utilisateur avant tout appel de méthode sur un service.
  • Utilisez l'authentication de service pour autoriser uniquement certains utilisateurs à effectuer certaines actions.

Par exemple, admettons que vous disposez d'une application permettant de modifier les données d'employés avec un appel RemoteObject. Dans ce cas, utilisez l'authentication RemoteObject afin de vous assurer que ils les gestionnaires puissent modifier les données des employés.

  • Utilisez la sécurité par programmation pour limiter l'accès aux services.
  • Appliquez des contraintes de sécurité déclarative à des services entiers.
  • Lorsque vous accedez à un service Web () ou HTTP (), l'un des éléments suivants doit être vrai :

L'implementation de service se trouve dans le même domaine que l'application qui l'appele.

  • Le système hôte du service possède un filchier crossdomain.xml qui autorise explicitement l'accès à partir du domaine de l'application.

Voir aussi

Sécurité Flex

Sécurisation des services de données

Réduction d'applications sécurisées

Adobe® Flash® Player execute des applications généraes avec Flash. Le contenu est livré sous forme de séries d'instructions au format binaire à Flash Player à l'aide de protocôles Web dans un format de fisquier SWF décrit précisé. Les fischers SWF sont en règle générale hébergés sur un serveur, puis télécharges et affichés sur l'ordinateur client lorsqu'ils sont demandés. La plupart du contenu correspond à des instructions ActionScript binaires. ActionScript est le langage de script basé sur les normes ECMA utilisé par Flash. ActionScript dispose d'API conçues pour permettre la création et la manipulation d'éléments de l'interface utilisateur côté client et pour travailler avec les données.

Le modele de sécurité pour Flex protège le client et le serveur. Tenez compte des deux aspects généraux de sécurité suivants:

  • Autorisation et authortification des utilisateurs accédant aux ressources d'un serveur
  • Flash Player opérant dans un sandbox sur le client

Flex prend en charge l'utilisation de la sécurité d'applications Web de tout serveur d'application J2EE. En outre, les applications précompilées dans Flex peuvent s'intégrer au modele d'authentication et d'autorisation de toute technologie de serveur sous-jacente afin d'empêcher les utilisateurs d'acceder à vos applications. La structure Flex inclut également plusieurs mécanismes de sécurité intégrés vous permettant de contrôle l'accès aux services Web, aux services HTTP et aux ressources basées sur serveur comme les EJB.

Flash Player s'exécute au sein d'un sandbox de sécurité qui empêche le piratage du client par du code d'application malveillant.

Remarque: le contenu SWF exécuté dans Adobe AIR suit des règes de sécurité différentes de celles appliquées au contenu exécuté dans le navigateur. Pour plus de détails, voir la rubrique sur la sécurité Air de la documentation AIR.

Pour obtenir des liens vers différentes rubriques de sécurité, voir Security Topic Center sur le portail Adobe Developer Connection.

Voir aussi

Sécurité Flex

Chapitre 3 : Implémentation de services pour des applications centrées sur les données

AMF (Action Message Format)

Flex utilise des services d'objets distants et AMF pour acceder aux services implémentés dans ColdFusion, PHP, BlazeDS et LiveCycle Data Services. AMF fournit la messagerie nécessaire pour échanger des données entre une base de données et l'application client.

ColdFusion, BlazeDS et LiveCycle Data Services fournissant chacun une structure AMF pour les services d'objets distants. Pour les services implémentés dans PHP, Flash Builder utilise la structure Zend AMF.

Les services ColdFusion et PHP peuvent fournir une définition de type côté serveur. Dans la définition de type côté serveur, le service définit le type des données renvoyées. Toutefois, si l'implémentation de service ne définit pas le type de données de return, Flash Builder fournit la définition de type côté client. Il échantillonne des données du service, ce qui vous permet de configurer le type de return dans l'application client.

Définition de type côté client et côté serveur

Dans Flex, une application client utilise le type des données renvoyées par un appel de service dans les méthodes qui accèdent et affichent les données.

Cependant, les exemples de services énumérés ci-dessous revoient des données non typées.

  • « Implémentation de services ColdFusion » à la page 47
  • « Implementation de services PHP » à la page 53
  • « Exemple d'implémentation de services à partir de plusieurs sources » à la page 67

Par exemple, pour l'opération getAllEmployees, le service rengoie un tableau d'objects non typés représentant des enregistements issus de la base de données. Flash Builder fournit des outils qui activent la définition de type côté client. Les outils Flash Builder vous permettent d'examiner en détaill les données renvoyées et de définir un type personnelisé pour les données.

Vou puez definir le type de données personalisé Employe pour l'objet renvoy e des enregistements d'employés.

Chaque colonne de l'enregistrement devient une propriété du type de données Employé.

A l'aide du type de données personalisé Employé, l'application client peut acceder aux données renvoyées et les afficher correctement.

Flash Builder peut également acceder à des services implémentant une définition de type côté serveur. Pour obtenir des exemples de la définition de type côté serveur, voir Exemples de définition de type côté serveur dans Flash Builder.

Implémentation de services ColdFusion

Lors de l'implémentation de services dans ColdFusion, implémentez les services en tant que fichiers de composants ColdFusion (CFC). Chaque CFC contient des fonctions fournissant des opérations de service.

Voupez create des services ColdFusion dans n'impote quel IDE, tel qu'Adobe ColdFusion® Builder™. Flash Builder ne fournit pas d'éditeur spécifique aux fischiers ColdFusion. L'ouverture d'un fisquier ColdFusion dans Flash Builder conduit toutes au lancement de l'application du système associée aux fischiers ColdFusion.

Voupez implémenter un service ColdFusion de base en creating un composant ColdFusion (CFC) qui contient les fonctions pour les opérations de service. L'exemple suivant, employeeService.cfc, illustrate un EmployeeService qui implmente deux fonctions. La fonction getAllEmployees() extrait tous les enregistrents d'employés de la base de données. La fonction getEmployees() renvoie un enregistrement d'employé unique base sur l'argument emp_no de la fonction.

Cet exemple illustré la définition de type côté client. Le service renvoie des données non typées. Flash Builder utilise la définition de type côté client pour introspecter les données renvoyées et définir le type de données.

Les exemples suivants illustrrent comment implémenter les services pour la pagination et la gestion de données.

Vou puez eaglement utilise Flash Builder pour acceder a des services implémentant la definition de type cote serveur. Voir « Definition de type cote client et cote serveur » à la page 46.

Aucun exemple de definition de type cote serveur n'etait disponible lorsque la redaction de ce document a ete achievee. Pour obtenir des exemples de definition de type cote serveur, voir Exemples de definition de type cote serveur dans Flash Builder.

Exemple d'implémentation d'un service de base dans ColdFusion

Cet exemple illustré comment implémenter un service de base dans ColdFusion. Cet exemple est basé sur le code génééré par Flash Builder lors de l'accès au tableau de la base de données. Voir « Génération d'un exemple de service ColdFusion à partir d'un tableau de base de données » à la page 10.

Cet exemple illustrer la definition de type cote client. Voir « Definition de type cote client et cote serveur » à la page 46.

Pour obtenir des exemples de definition de type côté serveur, voir Flash Builder server-side type examples.

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajustate. Pour obtenir des informations sur la réduction de services ColdFusion sécurisés, voir la documentation ColdFusion About User Security.

Points forts d'EmployeeService :

  • Connexion à la base de données des employés et accès au tableau des employés dans la base de données
  • Renvoi d'un tableau d'objets

Lors de la programmation à l'aide de la structure Flex, les services ne renvoient que des données. L'application client gère le formatage et la presentation des données. Ce modele differe des applications ColdFusion CFM traditionnelles, qui returnent des données formatées dans un modele HTML.

Flex gère les yeux d'enregistrents renvoyés en tant que tableau d'objets. Chaque ligne représentée un enregistrement extrait de la base de données. Chaque colonne de l'enregistrement de base de données devient une propriété de l'objet renvoyé. L'application client peut ainsi acceder aux données renvoyées comme objets avec un ensemble de propriétés.

Configurez le type de données pour l'objet renvoyé. Voir « Définition de type côté client et côté serveur » à la page 46.

  • Fonction de gestion des erreurs du serveur ColdFusion

La gestion des erreurs fournie par ColdFusion est utile lors du débogage d'un service. Dans ColdFusion Administrator, modifiez les paramètres de débogage et de journalisation afin de fournir des informations de débogage plus performantes.

L'interface Opération de test de Flash Builder affiche les informations renvoyées par le serveur ColdFusion.

Pour plus d'informations sur les services de test, voir « Débogage de services distants » à la page 65.

  • Utilisation de cfqueryparam pour creer des requêtes de base de données

cfqueryparam est une defense contre les attaques par instructions d'injection SQL dans les appels au serveur. Pour plus d'informations, voir Enhancing security with cfqueryparam dans la documentation ColdFusion.

  • Il authenticate les utilisateurs avant de donner l'accès aux fonctions dans ce service.

L'exemple de code n'illustre pas comment authenticate les utilisateurs. Voir la documentation ColdFusion About User Security.

Voir aussi

« Configuration des types de données pour les opérations de service de données » à la page 27
« Accès aux services ColdFusion » à la page 9
« Génération d'un exemple de service ColdFusion à partir d'un tableau de base de données » à la page 10

Exemple d'implémentation de la pagination dans ColdFusion

Les outils Flash Builder permettent d'implémenter la pagination des données extraites d'un service distant. La pagination est l'extraction incréementelle de quelques de données volumineux.

Pour implémenter la pagination, Flash Builder nécessite des signatures de fonction spécifique. L'exemple de code suivant ilustré une méthode d'implémentation d'un service ColdFusion pour des données paginées.

L'exemple EmployeeServicePaged est basé sur le code génééré par Flash Builder lors de l'accès au tableau de la base de données. Voir « Génération d'un exemple de service ColdFusion à partir d'un tableau de base de données » à la page 10.

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. L'exemple permet à toute personne disposant d'un accès réseau à votre serveur d'acceder aux données du tableau de la base de données et de les modifier ou supprimer. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon adequate. Pour obtenir des informations sur la réduction de services ColdFusion sécurisés, voir la documentation ColdFusion About User Security.

Le service EmployeeServicePaged renvoie des données non typées. Utilisez les outils Flash Builder pour configurer le type de départ pour getEmployees_Paged(). Une fois le type de départ configéré, activez la pagination sur l'opération getEmployees_Paged().

Voir aussi

« Exemples de services ColdFusion » à la page 47
« Configuration des types de données pour les opérations de service de données » à la page 27
« Gestion de l'accès aux données à partir du serveur » à la page 32

Exemple d'implémentation de la gestion de données dans ColdFusion

Les outils Flash Builder permettent d'implémenter la fonctionnalité de gestion des données pour les services distants. La gestion de données est la synchronisation des mises à jour des données sur le serveur à partir de l'application client.

Pour implémenter la gestion de données, Flash Builder nécessite une combinaison de signatures de fonction spécifique. L'exemple de code suivant illustré une méthode d'implementation d'un service ColdFusion pour la gestion de données.

L'exemple EmployeeServiceDM est basé sur le code généré par Flash Builder lors de l'accès au tableau de la base de données. Voir « Génération d'un exemple de service ColdFusion à partir d'un tableau de base de données » à la page 10.

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajustée. Pour obtenir des informations sur la réduction de services ColdFusion sécurisés, voir la documentation ColdFusion About User Security.

Le service EmployeeServiceDM renvoie des données non typées. Utilisez les outils Flash Builder pour configurer le type de départ des opérations getAllEmployees() et getEmployees(). Utilisez Employe comme type de données personnelé renvoyé par ces opérations.

Une fois le type de return configuré, activez la gestion de données sur le type de données Employé.

Voir aussi

« Exemples de services ColdFusion » à la page 47
« Configuration des types de données pour les opérations de service de données » à la page 27
« Gestion de l'accès aux données à partir du serveur » à la page 32

Génération de CFC à l'aide d'Adobe ColdFusion Builder

Adobe® ColdFusion® Builder™ fournit la fonctionnalité Adobe CFC Generator. Utilisez CFC Generator pour générer un CFC ORM ou un CFC traditionnel à partir d'un ensemble de tables de bases de données. Le CFC généra par ColdFusion Builder peut ensuite être utilisé en tant que service de données dans Flash Builder. Adobe CFC Generator crée des services qui implémentent la définition de type côté serveur.

Pour plus d'informations, voir Using Adobe CFC Generator.

Remarque: la fonctionnalité de mappage object/relational ColdFusion (ORM (object-relational mapping) utilise un modele d'objets afin de définir une strategie de mappage pour le stockage et la récapération de données à partir d'une base de données relationnelle). Voir ColdFusion ORM.

Implémentation de services PHP

Lors de l'implémentation de services dans PHP, vous implémentez généralement les services en tant que classes PHP. Il n'est pas nécessaire que les classes dans PHP soient des classes orientées objet. Chaque classe peut plutôt constituer une bibliothèque de fonctions fournissant les opérations de service.

Vou puez creer des services PHP dans n'importe quel environnement d'edition (DreamWeaver ou Zend Studio, par exemple). Flash Builder ne fournit pas d'éditeur spécifique aux fischiers PHP. L'ouverture d'un fisier PHP dans Flash Builder conduit toutefois au lancement de l'application du système associée aux fisiers PHP. Pour plus de commodité, Flash Builder fournit également un editor de texte brut que vous pouvez utiliser pour editor les fisiers PHP.

Utilisation d'AMF pour l'accès aux services implémentés dans PHP

Les services de données PHP sont accessibles en utilisant le format Action Message Format (AMF). AMF assure l'échange de messages entre un client Flash et le serveur Web. Flash Builder utilise la structure Zend AMF pour implémenter l'échange de messages AMF pour les services de données PHP.

Pour plus d'informations sur Zend AMF, voir Guide de reférence du programmeur Zend Framework.

Pour plus d'informations sur l'installation de Zend Framework, voir « Installation de Zend Framework » à la page 21.

Pour plus d'informations sur l'utilisation de Zend avec Flash Builder pour PHP, voir le site Web de Zend.

Remarque : l'utilisation de la structure Zend AMF par Flash Builder ne signifie pas que vous devez obligatoirement utiliser les composants Zend pour la création de services PHP. Malgré le bon fonctionnement des composants Zend avec Flash Builder, vous pouvez utiliser tout autre environnement de développement pour la création de services.

Voupeimper un service PHP de base en creant un fichier de classe PHP qui contient les fonctions des opérations de service. L'exemple suivant illustrer un EmployeeService qui implémente deux fonctions :

  • getAllEmployees()

Extrait tous les enregistrements d'employés de la base de données.

  • getEmployeeByID($itemID)

Renvoie un seul enregistrement d'employé.

Cet exemple illustré la définition de type côté client. Le service renvoie des données non typées. Flash Builder utilise la définition de type côté client pour introspecter les données renvoyées et définir le type de données.

Les exemples suivants illustrrent comment implémenter les services pour la pagination et la gestion de données.

Vou puez e alement utiliser Flash Builder pour acceder a des services implémentant la definiion de type cote serveur. Voir « Definition de type cote client et cote serveur » à la page 46.

Aucun exemple de définition de type côté serveur n'était disponible lorsque la réduction de ce document a été achievée. Pour obtenir des examples de définition de type côté serveur, voir Exemples de définition de type côté serveur dans Flash Builder.

Exemple de service de base PHP

Cet exemple indique comment implémenter un service de base dans PHP. Cet exemple est basé sur le code génééré par Flash Builder lors de l'accès au tableau de la base de données. Voir « Génération d'un exemple de service PHP à partir d'un tableau de base de données » à la page 12.

Cet exemple illustrer la definition de type cote client. Voir « Definition de type cote client et cote serveur » à la page 46.

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajusté. Pour plus d'informations sur la réduction de services sécurisés, voir « Déploiement des applications accédant aux services de données » à la page 43.

Points forts d'EmployeeService :

  • Il se connecte à la base de données des employés, à laquelle il accede via le port 3306 de l'hote local. Il accede au tableau des employés dans la base de données.
    Il fournit des variables de classe pour la connexion au service et l'accès aux tableaux dans la base de données.

Vous pouvez utiliser ces variables dans des fonctions de la classe.

Remplacez les valeurs de ces variables avec des valeurs de votre système.

  • Il renvoie le tableau d'objets à l'application client.

Lors de la programmation à l'aide de la structure Flex, les services ne renvoient que des données. L'application client gère le formatage et la presentation des données.

Ce modele differe des services PHP traditionnels, qui returnent des données formatedes dans un modele HTML.

  • Il fournit la fonction getEmployeesByID($itemID) qui lie le paramètre d'entrée aux types de données.

Le nombre de variables et la longueur des types de chaînes doivent correspondre aux paramêtres dans l'instruction. Le menu de la palette « ? » de l'instruction de préparation est un espace réservé pour le paramètre.

mysqli reconnait les types suivants :

integer (i)
- double (d)
string (s)
- blob (b)

  • Il lie les résultats, créé ainsi un tableau d'objets ((row[ ]).

Flex gère les yeux d'enregistrements en tant que tableau d'objets. Chaque objet représenté un enregistrement extrait de la base de données. Chaque colonne de l'enregistrement de base de données devient une propriété de l'objet renvoyé. L'application client peut ainsi acceder aux données renvoyées comme objets avec un ensemble de propriétés.

Le serveur ne définissant pas le type des données renvoyées, vous devez configurer le type de données de l'objet renvoyé. Voir « Définition de type)côté client et côté serveur » à la page 46.

  • Il fournit une fonction constructeur pour l'initialisation de la connexion à la base de données.
  • Il utilise les instructions de préparation mysql pour la création de requêtes de base de données.

L'utilisation des instructions de préparation est une défense contre les attaques par instructions d'injection SQL dans les appeals au serveur. L'instruction est executée sur le serveur uniquement après sa préparation.

  • Il authenticate les utilisateurs avant de donner l'accès aux fonctions dans ce service.

L'exemple de code n'illustre pas comment authenticate les utilisateurs. Voir la documentation ColdFusion About User Security. Les principes de sécurité sur l'authentication et l'autorisation des utilisateurs dans cette documentation ColdFusion s'appliquent aux services PHP.

Il renvoie une exception sur l'erreur.

Les informations que vous fournissez dans les exceptions sont utiles lors du débogage de l'implémentation du service. L'interface Opération de test de Flash Builder affiche les informations renvoyées par les exceptions.

Pour plus d'informations sur les services de test, voir « Débogage de services distants » à la page 65.

  • Le nom du fjichier EmployeeService. php correspond au nom de la classe PHP du service.

Si les noms du fichier et de la classe ne correspondent pas, des erreurs se produit lorsque vous accedez au service.

Voir aussi

« Configuration des types de données pour les opérations de service de données » à la page 27
« Accès aux services PHP » à la page 11
« Génération d'un exemple de service PHP à partir d'un tableau de base de données » à la page 12

Exemple d'implémentation de la pagination dans PHP

Les outils Flash Builder permettent d'implémenter la pagination des données extraites d'un service distant. La pagination est l'extraction incréementielle de yeux de données volumineux.

Pour implémenter la pagination, Flash Builder nécessite des signatures de fonction spécifique. L'exemple de code suivant illustre une méthode d'implémentation d'un service PHP pour des données paginées.

Cet exemple est basé sur le code généra par Flash Builder lors de l'accs au tableau de la base de données. Voir « Génération d'un exemple de service PHP à partir d'un tableau de base de données » à la page 12.

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajusté. Pour plus d'informations sur la réduction de services sécurisés, voir « Déploiation des applications accédant aux services de données » à la page 43.

Le service EmployeeServicePaged renvoie des données non typées. Utilisez les outils Flash Builder pour configurer le type de départ pour getEmployees_Paged(). Une fois le type de départ configéré, activez la pagination sur l'opération getEmployees_Paged().

Voir aussi

« Exemples de services PHP » à la page 54
« Configuration des types de données pour les opérations de service de données » à la page 27
« Gestion de l'accès aux données à partir du serveur » à la page 32

Exemple d'implémentation de la gestion de données dans PHP

Les outils Flash Builder permettent d'implémenter la fonctionnalité de gestion des données pour les services distants. La gestion de données est la synchronisation des mises à jour des données sur le serveur à partir de l'application client.

Pour implémenter la gestion de données, Flash Builder nécessite une combinaison de signatures de fonction spécifique. L'exemple de code suivant illustré une méthode d'implémentation d'un service PHP pour la gestion de données.

Cet exemple est basé sur le code génére par Flash Builder lors de l'accès au tableau de la base de données. Voir

« Génération d'un exemple de service PHP à partir d'un tableau de base de données » à la page 12.

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajusté. Pour plus d'informations sur la réduction de services sécurisés, voir « Déploiation des applications accédant aux services de données » à la page 43.

Le service EmployeeServiceDM renvoie des données non typées. Utilisez les outils Flash Builder pour configurer le type de回头 des opérations getAllEmployees() et getEmployeesByID(). Utilisez Employé comme type de données personnelisé renvoyé par ces opérations.

Une fois le type de return configuré, activez la gestion de données sur le type de données Employé.

Voir aussi

« Exemples de services PHP » à la page 54
« Configuration des types de données pour les opérations de service de données » à la page 27
« Gestion de l'accès aux données à partir du serveur » à la page 32

Débogage de services distants

Le débogage des applications accédant aux services distants peut se faire de différentes manières.

  • Vue Opération de test de Flash Builder

La vue Opération de test de Flash Builder vous permet d'appeler des opérations de service et d'afficher les données renvoyées. Elle affiche tous les messages d'erreur interceptés par le service.

  • Scripts côte serveur

Pour le débogage supplémentaire des services, vous pouvez écrire des scripts qui testent le code du serveur et des informations de flux de sortie dans les fichiers journaux.

  • Moniteur de réseau Flash Builder

Après avoir créé une application accédant à un service dans Flash Builder, utilisez le Moniteur de réseau pour visionner les données échangées entre le serveur et le client.

Vue Opération de test de Flash Builder

Utilisez la vue Opération de test de Flash Builder afin d'appeler les opérations d'un service et afficher les résultats de l'opération. Les résultats incluent tout message d'erreur renvoyé par un service.

Voupeus potier la vse Opération de test a fin d'afficher les données renvoyees par les opérations sur les services que you redigez, les services disponibles a partir de HTTP ou les services Web.

Test d'une opération de service

Cette procédure part du principe que vous avez rédigé un service que vous testez ou que vous pouvez acceder à un service HTTP ou à un service Web.

1 Dans la vue Données/Services de Flash Builder, accédez à l'opération de service que vous souhaitez tester.
2 Dans le menu contextuel de l'opération, selectionnez l'options Opération de test.
3 (Facultatif) Dans la vue Opération de test, Sélectionnez Authentication requise afin de saisir les informations de connexion au service.
4 Si l'opération accepte les paramètres, cliquez sur le champ Entrer une valeur afin de fournir une valeur pour le paramètre.

Si le paramètre nécessite un type complexe, cliquez sur les points de suspension dans le champ Entrer une valeur affirm d'ouvrir un editeur acceptant la notation JSON. Spectoriez la valeur pour le parametre à l'aide de la notation JSON.

5 Cliquez sur Tester afin d'afficher le résultat de l'opération.

Scripts de test du code serveur

Utilisez des scripts de test pour afficher et déboguer le code serveur avant d'essayer de vous connecter au serveur dans Flash Builder. Les scripts de test doivent les avantages suivants :

  • Vous pouvez visionner les résultats des tests dans un navigateur Web.
    Rafraîchissez l'affichage du navigateur pour visionner le résultat des modifications que vous apportez au code.
  • Vous pouvez envoyer un écho ou une impression des résultats au flux de sortie, ce qu'il vous est impossible de faire directement à partir d'AMF.
    La mise en forme des erreurs affichees est conviviale. Les erreurs sontsoon plus complètes que celles saisies avec AMF.

Scripts ColdFusion

Utilisez le script suivant (Tester.cfm) pour vider l'appel d'une fonction :

<!--- tester.cfm --->
<cfobject component="EmployeeService" name="o";//>
<cfdump var="#o>AllItems(#)"> 

Spcificiez dans tester2.cfm la methode et les arguments à appeler dans l'URL.

<!--- tester2.cfm --->
<cfdump var="#url#">
<cfinvoke component="#url.cfc#" method="#url.method#" argumentCollection="#url#" returnVariable="r">
<p>Result:</cfif_defined("r>") <cfdump var="#r#">
<cfelse>
(no result)
</cfif> 

Voupez par exemple appeler la methode getItemID dans EmployeeService en utilisant l'URL suivante :

http://localhost/tester2.cfm?EmployeeService&method getItemId&id = 12

Le script tester3.cfm enregistre dans un journal les appeals d'opérations et vide les arguments entrants en utilisant cfdump.

<!---- tester3.cfm --->
<cfsavecontent variable="d"><cfdump var="#arguments#"></cfsavecontent> 
<cfile action="append" file="#getDirectoryFromPath(getCurrentTemplatePath())#MyServiceLog.htm" output="<p>#now(#) operationName #d#" 

Scripts PHP

Utilisez le script suivant (Tester.php) pour vider l'emploi d'une 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 l'exécution 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 d'activer 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 réseau

Le Moniteur de réseau est accessible dans la perspective Débogage Flex de Flash Builder. Activez le moniteur avant de pouvoir l'utiliser pour analyser les données. Pour plus d'informations sur l'activation et l'utilisation du Moniteur de réseau, voir Surveillance des applications accédant aux services de données.

Exemple d'implémentation de services à partir de plusieurs sources

En regle générale, les applications accedent aux données de sources différentes, affichant le résultat de l'association de données dans une application. Cet exemple illustrer comment associer les données des trois tableaux suivants dans une base de données d'employés :

Départements

Chaque enregistrement contient les champs suivants : numéro et nom du département.

Dept_imp

Chaque enregistrement contient les champs suivants: emp_no, dept_no, from_date, to_date.

  • Employés

Chaque enregistrement contient les champs suivants: emp_no, birth_date, first_name, last_name, gender, hire_date.

L'exemple d'application dispose de deux composants DataGrid, un pour les départements et un pour les employés.

La liste Départements repertorie tous les départements. Lorsque vous sélectionnez un département, le composant DataGrid Employés repertorie tous les employés de ce département.

La sclection d'un employé dans le composant DataGrid Employés renseigne un formulaire vous permettant demettre à jour l'enregistrement de l'employé sélectionné.

Pour cet exemple, créez un service unique. Le service contient les opérations suivantes :

  • getAllDepartments()
  • getEmployeesByDept()
  • getEmployeeByID()
  • updateEmployee()

EmployeeService (PHP)

EmployeeService. php implémente un service contenant une seule fonction. GetEmployeesByID() accepte l'ID de département en tant qu'argument et renvoie tous les employés du département donné. La fonction renvoie également les dates auxquelles l'employé a rejoint et quitté le département. GetEmployeesByDept() exécute la requête SQL

suivanté :

SELECT employees.emp_no, employees.birth_date, employees.first_name, employees.last_name, employeesgender, employees.hire_date, deptemp.from_date, deptemp.to_date
FROM employees, dept emp
WHERE dept.emp.emp_no = employees.emp_no and deptemp.dept_no = departments.dept_no

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajusté. Pour plus d'informations sur la réduction de services sécurisés, voir « Déplolement des applications accédant aux services de données » à la page 43.

EmployeeService.cfc implémente un service contenant une seule fonction. GetEmployeesByID() accepte l'ID de département en tant qu'argument et renvoie tous les employés du département donné. La fonction renvoie également les dates auxquelles l'employé a rejoint et quitté le département. GetEmployeesByDept() exécute la requête 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, deptemp
WHERE dept.emp.emp_no = employees.emp_no and dept.emp.dept_no = departments.dept_no

Important: les exemples de services sont destinés uniquement à l'établissement d'un prototype. Utilisez l'exemple de service uniquement dans un environnement de développement fiable. Avant de déployer ce service, assurez-vous d'augmenter la protection et de restreindre l'accès de façon ajustate. Pour obtenir des informations sur la réduction de services ColdFusion sécurisés, voir la documentation ColdFusion About User Security.

Importation de services dans un projet de serveur

1 Dans Flash Builder, créez un projet Flex nommé Associations.

(PHP) Lors de la création du projet, spécifique PHP comme type de serveurs d'applications.

(PHP) ÀpRES avoir créé le projet, Flash Builder create un dossier de sortie dans le dossier de racine Web de votre configuration PHP. Le nom par défaut du projet PHP_Associations est PHP_Associations-debug.

(ColdFusion) Lors de la création du projet, spécifiez ColdFusion comme type de serveurs d'applications. Sélectionnez ensuite ColdFusion Flash Remoting.

2 (PHP) Dans PHP_Associations-debug, créez un dossier nommé services. Copiez EmployeeService.php dans le dossier services.
3 (ColdFusion) Créez un dossier nommé Associations dans la racine Web de votre configuration ColdFusion. Copiez EmployeeService.chc dans le dossier Associations.
4 Importez EmployeeService dans le projet.

Assurez-vous que PHP_Associations est le projet actif dans Flash Builder.

Selectionnez Données > Connexion à PHP. Pour spécifique la classe PHP, accédez au dossier services et selectionnez EmployeeService.php. Cliquez sur Terminer.

Pour plus d'informations, voir « Connexion à des services de données PHP » à la page 11.

5 Configurez le type de回头 des opérations dans EmployeeService.

DepartmentService

Dans le menu contextual de l'opération getAllDepartments, selectionnez Configurer le type de return.

Cliquez sur Suivant pour lancer la détction automatique du type de retour.

Séciffiez Département pour le type de回头 personnelisé. Cliquez sur Terminer.

  • EmployeeService

Dans le menu contextual de l'opération getEmployeesByDept(), Sélectionnez Configurer le type de retard.

Cliquez sur Suivant pour lancer la détction automatique du type de return.

Saisissez la valeur d007 pour le paramètre. Cliques sur Suivant.

Spectoriez Employe comme type de回头 personalisé. Cliquez sur Terminer.

Pour plus d'informations, voir « Configuration des types de données pour les opérations de service de données » à la page 27.

Chapitre 4: Accès aux données côtéserveur

Les composants d'accès aux données Adobe Flex® utilisent des appels de procédures distants pour interagir avec les environnementés de serveur tels que PHP, Adobe ColdFusion et Microsoft ASP.NET. Ces composants fournissent des données aux applications client créées avec la structure Adobe Flex et envoient des données aux sources de données de back-end. Pour une presentation des composants d'accès aux données, voir « Composants d'accès aux données » à la page 4.

Utilisation de composants HTTPService

Vous pouvez utiliser un composant HTTPService avec tout type de technologie côté serveur, y compris les pages PHP, les pages ColdFusion, les pages JavaServer (JSP), les servlets Java, Ruby on Rails et les pages Microsoft ASP. Il vous est également possible d'utiliser HTTPService pour acceder aux services Web basés sur REST.

Pour obtenir des informations de reference API sur le composant HTTPService, voir mx.rpc(http.mxml HTTPService.

Utilisation de données PHP et SQL

Les composants HTTPService peuvent être utilisés avec PHP et un système de gestion de base de données SQL pour afficher les résultats d'une interrogation de base de données dans une application. Vous pouvez également utiliser les composants pour insérer,mettre à jour et supprimer les données d'une base de données. Vous pouvez appeler une page PHP avec la méthode GET ou POST pour effectuer une interrogation de base de données, puis formater les données du résultat de l'interrogation dans une structure XML et renvoyer la structure XML à l'application dans le cadre de la réponse HTTP. Une fois le résultat renvoyé à l'application, vous pouvez l'afficher dans un ou plusieurs contrôles de l'interface utilisé.

Code MXML

Dans l'exemple suivant, l'application appelle une page PHP avec la méthode POST. La page PHP interrogé une table de base de données MySQL appelée users. Elle formate les résultats de l'interrogation sous XML et renvoie les données XML à l'application, dans laquelle elles sont liées à la propriété dataProvider d'un contrôle DataGrid et affichées dans ce contrôle DataGrid. L'application envoie également le nom d'utilisateur et l'adresselectronique des nouveaux utilisateurs à la page PHP, qui procède à une insertion dans la table de base de données des utiliserés.

<?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="UserID" dataField="userid"/> <mx:DataGridColumn headerText="UserID" dataField="userid"/> </mx-columns> </mx:DataGrid> <s:TextInput x="20" y="340" id="selectedemailaddress" text={'dgUserRequest.selectedItem.emailaddress'}/> </s:Application> 

La méthode send() du composant HTTPService effectue l'appel à la page PHP. Cet appel est effectué dans la méthode send_data() dans le bloc Script du fichier MXML.

La propriété résultatFormat du composant HTTPService étant définie sur object, les données sont renvoyées à l'application en tant que graphique d'objets ActionScript. Il s'agit de la valeur par défaut de la propriété résultatFormat. Une autre possibilité consiste à utiliser une propriété résultatFormat définie sur e4x pour renvoyer les données en tant qu'objet RSSList sur lequel vous pouvez executer ECMAScript pour les opérations XML (E4X). Si vous sélectionnez la valeur e4x pour la propriété résultatFormat, vous devrez apporter les quelques modifications suivantes au code MXML.

Remarque: si le format de résultat est 4x , n'incluez pas le nœud racine de la structure XML dans la notation par point lors de la liaison au contrôle DataGrid.

Les données XML renvoyées dans cet exemple ne contiennent aucune information d'espace de noms. Pour obtenir des informations sur l'utilisation de données XML ne contenant pas d'espaces de noms, voir « Traitément de résultats en tant que données XML avec le format de résultat E4X » à la page 127.

<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="_request.lastResult.user"} > 

Le format de résultat e4x permet en outre de lier la propriété lastResult à un objet XmlListCollection, puis de lier cet objet à la propriété DataGrid.dataProvider, comme l'illustrer le fragment de code suivant :


...

...
...

Script de base de données MySQL

Le code PHP de cette application utilise une table de base de données appelée users dans une base de données MySQL appelée 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 CHAREN=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3; 

Code PHP

Cette application appelle la page PHP suivant. Ce code PHP effectue des insertions dans la base de données SQL et l'interrogne, puis returne les résultats de l'interrogation à l'application dans une structure XML.

<?php
define("DATABASE_SERVER","servername");
define("DATABASE_USERNAME","username");
define("DATABASE_PASSWORD","password");
define("DATABASE_NAME","sample");
//connect to the database.
$mYSQL = mysql_connect (DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD);
mysql_select_db( DATABASE_NAME );
// Quote variable to make safe
function quotesmart($value)
{
// Stripslashes
if (get_magic_quotes_gpc())
{
cvalue = stripslashes(value);
}
// Quote if not integer
if (!is_numeric($value)) {
$cvalue = '';
mysql_realescape_string($value) ;
};
return $value;
}
if (Post["emailaddress"] ANDPOST["username"]
{
//add the user
$Query = printf("INSERT INTO users VALUES ('', %s, %s')",
quoteSMART(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 );
}
while (User = mysql_fetch_object(Result ))
{
Return . = "<user><id)." .User->username ."\/userid><name>";
$User->username ."\/userid><emailaddress>";
$User->emailaddress ."\/emailaddress+</user>";
}
$Return . = "<users>";
mysql_free_result( $Result );
print ($Return)
?> 

Utilisation de données ColdFusion et SQL

Les composants HTTPService peuvent être utilisés avec une page ColdFusion et un système de gestion de base de données SQL pour afficher les résultats d'une interrogation de base de données dans une application. Vous pouvez également utiliser les composants pour insérer,mettre à jour et supprimer les données d'une base de données. Vous pouvez appeler une page ColdFusion avec la méthode GET ou POST pour effectuer une interrogation de base de données, puis formater les données du résultat de l'interrogation dans une structure XML et renvoyer la structure XML à l'application dans le cadre de la réponse HTTP. Une fois le résultat renvoyé à l'application, vous pouze l'afficher dans un ou plusieurs contrôle de l'interface utiliseur.

Code MXML

Dans l'exemple suivant, l'application appelle une page ColdFusion avec la méthode POST. La page ColdFusion interroge une table de base de données MySQL appelée users. Elle formate les résultats de l'interrrogation sous XML et renvoie les données XML à l'application, dans laquelle elles sont liées à la propriété dataProvider d'un contrôle DataGrid et affichées dans ce contrôle DataGrid. L'application envoie aussi le nom d'utilisateur et l'adresse électronique des nouveaux utilisateurs à la page ColdFusion, qui procède à une insertion dans la table de base de données des utilisateurs.

<?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="userRequest.send())
        <fx:Declarations>
            <s:HTTPService id="userRequest" url="http://server:8500/flexapp/returncxml.cfm"
                usesProxy="false" method="POST">
                    <mx:request xmlns="">
                        <username>{username.text}</username>
                        <emailaddress>{emailaddress.text}</emailaddress>
                        </mx:request>
            </s:HTTPService>
            </fx:Declarations>
            <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="userRequest.send()"/> 

La méthode send() du composant HTTPService effectue l'appel à la page ColdFusion. Cet appel est effectué dans la méthode send_data() dans le bloc Script du filchier MXML.

La propriété résultatFormat du composant HTTPService étant définie sur object, les données sont renvoyées à l'application en tant que graphique d'objets ActionScript. Il s'agit de la valeur par défaut de la propriété résultatFormat. Une autre possibilité consiste à utiliser un format de résultat e4x pour renvoyer les données en tant qu'un objet XMLList sur lequel vous pouvez executer ECMAScript pour les opérations XML (E4X). Si vous sélectionnez la valeur e4x pour la propriété résultatFormat, vous devrez apporter les quelques modifications suivantes au code MXML.

Remarque: si le format de résultat est 4x , n'incluez pas le nœud racine de la structure XML dans la notation par point lors de la liaison au contrôle DataGrid.

Les données XML renvoyées dans cet exemple ne contiennent aucune information d'espace de noms. Pour obtenir des informations sur l'utilisation de données XML ne contenant pas d'espaces de noms, voir « Traitément de résultats en tant que données XML avec le format de résultatat E4X » à la page 127.

<s:HTTPService id="userRequest" url="http://myserver:8500/flexapp/returncxml.cfm" useProxy="false" method="POST" resultFormat="e4x"> <mx:DataGrid id="dgUserRequest" x="22" y="128" dataProvider="/{userRequest.lastResult.user}"/> 

Le format de résultat e4x permet de lier la propriété lastResult à un objet XmlListCollection, puis de lier cet objet à la propriété dataProvider de DataGrid, comme l'illustré le fragment de code suivant:


...

...
...

Script SQL

Le code ColdFusion de cette application utilise une table de base de données appelée users dans une base de données MySQL appelée sample. Le script MySQL suivant créé 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 CHAREN=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3; 

Code ColdFusion

L'application repertoriee dans la section Utilisation de données ColdFusion et SQL appelle l'application ColdFusion suivante, returncfxm1.cfm. Ce code ColdFusion efectue des insertions dans la base de données SQL et l'interroge, puis renvoie les résultats de l'interrogation a l'application. La page ColdFusion utilise la balise cfquery pour insérer des données dans la base de données et l'interroger. Elle fait appel a la balise cfxm1 pour formater les résultats de l'interrogation dans une structure XML.

- returncxml.cfm -


INSERT INTO users (username, emailaddress) VALUES ( , )

SELECT userid, username, emailaddress FROM users

#string(userid)# #username# #emailaddress#

#userXML#

Utilisation de pages JavaServer

Les composants Flex HTTPService peuvent être utilisés avec une page JSP et un système de gestion de base de données SQL pour afficher les résultats d'une interrogation de base de données dans une application. Vous pouvez également utiliser les composants pour insérer,mettre à jour et supprimer les données d'une base de données. Vous pouvez appeler une page JSP avec la méthode GET ou POST pour effectuer une interrogation de base de données, puis formater les données du résultat de l'interrogation dans une structure XML et renvoyer la structure XML à l'application dans le cadre de la réponse HTTP. Une fois le résultat renvoyé à l'application, vous pouvez l'afficher dans un ou plusieurs contrôles de l'interface utilisé.

Code MXML

Dans l'exemple suivant, l'application appelle une page JSP et extrait des données d'une base de données SQL. Elle formate les résultats de l'interrogation de la base de données sous XML et returne les données XML à l'application, dans laquelle elles sont liées à la propriété dataProvider d'un contrôle DataGrid et affichées dans ce contrôle DataGrid.

<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 méthode send() du composant HTTPService effectue l'appel à la page JSP. Cet appel est effectué dans l'évenement click de l'objet Button dans le fisquier MXML.

La propriété résultatFormat du composant HTTPService étant définie sur object, les données sont renvoyées à l'application en tant que graphique d'objets ActionScript. Il s'agit de la valeur par défaut de la propriété résultatFormat. Une autre possibilité consiste à utiliser un format de résultat e4x pour renvoyer les données en tant qu'objet XMLList sur lequel vous pouvez executer ECMAScript pour les opérations XML (E4X). Si vous Sélectionnez la valeur e4x pour la propriété résultatFormat, vous devrez apporter les quelques modifications suivantes au code MXML.

Remarque: si le format de résultat est e4x , n'incluez pas le nœud racine de la structure XML dans la notation par point lors de la liaison au contrôle DataGrid.

Les données XML renvoyées dans cet exemple ne contiennent aucune information d'espace de noms. Pour obtenir des informations sur l'utilisation de données XML ne contenant pas d'espaces de noms, voir « Traitément de résultats en tant que données XML avec le format de résultat E4X » à la page 127.

...
<s:HTTPService id="srv" url="catalog.jsp" resultFormat="e4x"/> 

Lorsque you utilisez le format de résultat e4x, vous pouze si vous le souhaitez lier la propriété lastResult à un objet XMLListCollection, puis lien cet objet à la propriété DataGrid.dataProvider :


...

...
...

Code JSP

L'exemple suivant présente la page JSP utilisé dans cette application. Cette page JSP n'appelle pas de base de données directement. Elle obtient ses données d'une classe Java appelée ProductService, qui à son tour utilise une classe Java appelée Product pour représentier des produits particuliers.

<@page import "flex_samples.product.ProductService, flex_samples.product.Product, java.util.List"%>

Appel de services HTTP dans ActionScript

L'exemple suivant présente un appel de service HTTP dans un bloc de script ActionScript. L'appeal de la méthode useHTTPService() déclare le service, définit la destination, configure des écouteurs d'évenement result et fault et conduit à l'appeal de la méthode send() du service.

<?xml version="1.0"?>
<!- fds\rpc\HttpServiceInAS.\mxml.Compiles -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" verticalGap="10">
<mx:Script>
    <!-- CDATA[ 
        import mx.controlss ALERT; 
        import mx.rpc(http咨询服务; 
        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); 
    }
</mx:Script>
</mx:Application> 

Utilisation de composants WebService

Les applications créées avec la structure Flex peuvent interagir avec des services Web basés sur SOAP qui définit essentiers leurs interfaces dans un document WSDL 1.1 (Web Services Description Language 1.1), disponible sous forme d'URL. WSDL est un format standard permettant de déscrire les messages qu'un service Web comprend, le format des réponses de ce service à ces messages, les protocôles que le service Web prend en charge et l'adresse à laquelle envoyer les messages. L'API du service Web Flex prend généralement en charge le protocôle SOAP (Simple Object Access Protocol) 1.1, XML Schema 1.0 (versions 1999, 2000 et 2001), WSDL 1.1 code RPC, littéral RPC et littéral document (paramètres de style brut et enveloppé). Les deux types de services Web les plus courants utilisent des liaisons SOAP codées (RPC) ou littéral document; les termes codees et littéral indiquent le type de mappage WSDL sur SOAP qu'un service utilise.

Flex prend en charge les demandes et les résultats de service Web formats en tant que messages SOAP. SOAP fournit la définition du format XML que vous pouvez utiliser pour échanger des informations structurées et typées entre un client de service Web (une application créé avec Flex, par exemple) et un service Web.

Adobe® Flash® Player fonctionne au sein d'un sandbox de sécurité qui limite les données auxquelles les applications créées avec Flex et les autres applications créées avec Flash peuvent acceder via HTTP. Les applications créées avec Flash peuvent acceder par HTTP uniquement aux ressources figurant dans le même domaine et par le même protocole les ayant traitées. Cela constitue un problème pour les services Web qui sont généralement atteints à partir d'emplacements distants. Le service Proxy, disponible dans LiveCycle Data Services et BlazeDS, intercipe les demandes aux services Web distants et les redirige, puis renvoie les réponses au client.

Si vous n'utilise pas LiveCycle Data Services ou BlazeDS, vous pouvez acceder aux services Web dans le même domaine que l'application ou utiliser un filchier crossdomain.xml (de régulation interdomaines) permettant l'accès à partir du domaine de l'application et devant être installé sur le serveur Web hébergeant le service RPC.

Pour obtenir des informations de reférence API sur le composant WebService, voir mx.rpc.soap.xml.WebService.

Exemple d'application WebService

L'exemple de code suivant concerne une application qui utilise un composant WebService pour appeler des opérations de service Web.

Code MXML

Dans l'exemple suivant, l'application appelle un service Web. Ce service interrogne une table de base de données SQL appelée users et renvoie des données à l'application, dans laquelle ces données sont liées à la propriété dataProvider d'un contrôle DataGrid où elles sont affichées. L'application envoie également le nom d'utilisateur et l'adresse électronique des nouveaux utilisateurs au service Web, qui procède à une insertion dans la table de base de données des utilisateurs. L'implémentation principale du service Web est un composant ColdFusion ; le même composant ColdFusion est accédé en tant qu'objet distant dans « Utilisation de composants RemoteObject » à la page 101.

<?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.controlss ALERT.show(event.fault.faultString)" result="remotingCFFHandler(event)"/> 
            <mx:operation name="insertRecord" result="insertCFFHandler()
            fault="mx.controlss ALERT.show(event.fault.faultString)" />
        </s:WebService>
    </fx:Declarations>
    <fx:Script>
        <!--[CDATA[ import mx.rpc.events.ResultEvent;
            private function remotingCFFHandler(e:ResultEvent):void
                { dgUserRequest.dataProvider = e,result;
            } 
            private function insertCFFHandler():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="UserID" dataField="USERID"/> <mx:DataGridColumn headerText="UserID" dataField="USERNAME"/> </mx-columns> </mx:DataGrid> <s:TextInput x="22" y="320" id="selectedemailaddress" text="{{dgUserRequestSelectedItem.emailaddress}}/> </s:Application> 

Document WSDL

L'exemple suivant presente le document WSDL qui définit l'API 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/XMLSchemaSchema">
!--WSDL created by ColdFusion version 8,0,0,171651---> <wsdl:types>
<schema targetNamespace="http://rpc.xml.coldfusion"
        xmlns="http://www.w3.org/2001/XMLSchemaSchema">
        <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"/>
    </sequence>
</complexType></sequence> 
element name="data" nillable="true" type="impl:ArrayOfArrayOf_xsd_anyType”/>   
</sequence>   
</complexType>   
</schema>   
<schema targetNamespace \(\coloneqq\) "http://flexapp" xmlns \(\equiv\) "http://www.w3.org/2001/XMLSchemaSchema"> import namespace \(\equiv\) "http://rpc.xml.coldfusion"/> import namespace \(\equiv\) "http://schemas.xmlsoap.orgsoap/encoding/" /> <complexType name \(\equiv\) "ArrayOf_xsd_string">   
<complexContent> <restriction base \(\equiv\) "soapenc:Array">   
<attribute ref \(\equiv\) "soapenc:ArrayType" wSDL: arrayType \(\equiv\) "xsd:string[]"/> </restriction>   
</complexContent> </complexType> <complexType name \(\equiv\) "ArrayOfArrayOf_xsd_anyType">   
<complexContent> <restriction base \(\equiv\) "soapenc:Array">   
<attribute ref \(\equiv\) "soapenc:ArrayType" wSDL: arrayType \(\equiv\) "xsd:nopeType[]"/> </restriction>   
</complexContent> </complexType>   
</schema> </wSDL:types>   
<wsdl:message name \(\equiv\) "CFCInvocationException">   
<wsdl:part name \(\equiv\) "fault" type \(\equiv\) "tns1:CFCInvocationException"/>   
</wsdl:message>   
<wsdl:message name \(\equiv\) "returnRecordsRequest">   
</wsdl:message>   
<wsdl:message name \(\equiv\) "insertRecordResponse">   
</wsdl:message>   
<wsdl:message name \(\equiv\) "returnRecordsResponse">   
<wsdl:part name \(\equiv\) "returnRecordsReturn" type \(\equiv\) "tns1:QueryBean"/>   
</wsdl:message>   
<wsdl:message name \(\equiv\) "insertRecordRequest">   
<wsdl:part name \(\equiv\) "username" type \(=\) "xsd:string"/>   
<wsdl:part name \(\equiv\) "emailaddress" type \(=\) "xsd:string"/>   
</wsdl:message>   
<wsdl:portType name \(\equiv\) "returncxml">   
<wsdl:operation name \(\equiv\) "insertRecord" parameterOrder \(\equiv\) "username emailaddress">   
<wsdl:input message \(\equiv\) "impl:insertRecordRequest" name \(\equiv\) "insertRecordRequest"/>   
<wsdl:output message \(\equiv\) "impl:insertRecordResponse" name \(\equiv\) "insertRecordResponse"/>   
<wsdl:fault message \(\equiv\) "impl:CFCInvocationException" name \(\equiv\) "CFCInvocationException"/>   
</wsdl:operation>   
<wsdl:operation name \(\equiv\) "returnRecords">   
<wsdl:input message \(\equiv\) "impl:returnRecordsRequest" name \(\equiv\) "returnRecordsRequest"/>   
<wsdl:output message \(\equiv\) "impl:returnRecordsResponse" name \(\equiv\) "returnRecordsResponse"/>   
<wsdl:fault message \(\equiv\) "impl:CFCInvocationException" name \(\equiv\) "CFCInvocationException"/>   
</wsdl:operation>   
</wsdl:portType>   
<wsdl:binding name \(\equiv\) "returncxml.cfcSoapBinding" type \(\equiv\) "impl:returncxml"/>   
<wsdl:soap:binding style \(=\) "rpc" transport \(=\) "http:// schemas.xmlsoap.org/soap/http"/>   
<wsdl:operation name \(\equiv\) "insertRecord">   
<wsdl:soap:operation soapAction \(= 11111111111111111111111111111111111111111111111111111111 
<wsdl:input name="insertRecordRequest">
<wsdl:soap:body encodingStyle="http://schemas.xmlsoap.orgsoap/encoding/"  
namespace="http://flexapp" use="encoded"/>
</wsdl:input>
<wsdl:output name="insertRecordResponse">
<wsdl:soap:body encodingStyle="http://schemas.xmlsoap.orgsoap/encoding/"  
namespace="http://flexapp" use="encoded"/>
</wsdl:output>
<wsdl:fault name="CFCInvocationException">
<wsdl:soap:fault encodingStyle="http://schemas.xmlsoap.orgsoap/encoding/"  
name="CFCInvocationException" namespace="http://flexapp" use="encoded"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="returnRecords">
<wsdl:soap:operation soapAction="_"/>  
<wsdl:input name="returnRecordsRequest">
<wsdl:soap:body encodingStyle="http://schemas.xmlsoap.orgsoap/encoding/"  
namespace="http://flexapp" use="encoded"/>
</wsdl:input>
<wsdl:output name="returnRecordsResponse">
<wsdl:soap:body encodingStyle="http://schemas.xmlsoap.orgsoap/encoding/"  
namespace="http://flexapp" use="encoded"/>
</wsdl:output>
<wsdl:fault name="CFCInvocationException">
<wsdl:soap:fault encodingStyle="http://schemas.xmlsoap.orgsoap/encoding/"  
name="CFCInvocationException" namespace="http://flexapp" use="encoded"/>
 </wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="returncxmlService">
<wsdl:port binding="impl:returncxml.cfcSoapBinding" name="returncxml.cfc">
<wsdl:soap:address location="http://localhost:8500/flexapp/returnusers.cfc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions> 

Appel de services Web dans ActionScript

L'exemple suivant présente un appel de service Web dans un bloc de script ActionScript. L'appeil de la méthode useWebService() déclare le service, définit la destination, récapère le document WSDL et conduit à l'appeil de la méthode echoArgs() du service.

Remarque : lorsque vous déclarez un composant WebService dans ActionScript, appelez la méthode

WebService.loadWSDL().

<?xml version="1.0"?>
<!- fds\rpc\WebServiceInAS.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx: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.choArgs.addEventListener("result", echoResultHandler);ws.addEventListener("fault", faultHandler);ws.loadWSDL();ws.choArgs(intArg, strArg);}public function echoResultHandler(event:ResultEvent):void{var retStr:String = event RESULT echoesStr;var retInt:int = event RESULT:.echoInt;/Do something.]public function faultHandler(event:FaultEvent):void{//deal with event.fault:faultString, etc}]]>
</mx:Script>
</mx:Application> 

Noms d'opérations réservés

Pour acceder aux opérations WebService, il suffit de les nommer d'après une variable de service. Des conflits de noms risquent toutefois de se produit si le nom d'une opération correspond à une méthode définie pour le service. Dans ActionScript, vous pouvez appliquer la méthode suivante à un composant WebService pour renvoyer l'opération du nom donné :

public function getOperation(name:String):Operation

Lecture de documents WSDL

Vou puez afficher un document WSDL dans un navigateur Web, un éditeur de texte simple, un éditeur XML ou un environnement de développement tel qu'Adobe Dreamweaver, qui intègre un utiliser pour l'affichage de documents WSDL dans un format en facilitant la lecture.

Les documents WSDL contiennent les balises décrites dans le tableau suivant.

BaliséDescription
Spécifie le protocole que les clients (les applications créées avec 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.
Spécifie la valeur d'une erreur renvoyée suite à un problème de traitement d'un message.
Spécifie le message qu'un client (une application créée avec Flex, par exemple) envoie à un service Web.
Définit les données transférées par une opération WebService.
Définit une combinaison des balises <input>, <output> et <fault>.
Spécifie le message envoyé par le service Web à un client de service Web (une application créé avec Flex, par exemple).
Spécifie un point de terminaison de service Web, définiissant l'association entre une liaison et une adresse de réseau.
Définit la ou les opérations fournies par un service Web.
Définit une collection de balises <port>. Chaque service se mapper à une balise <portType> et spécifique différentes manières d'acceder aux opérations dans cette balise <portType>.
Définit les types de données utilisés par les messages d'un service Web.

Opérations orientées RPC et opérations orientées document

Un fichier WSDL peut specifier des opérations orientées RPC ou des opérations orientées document (littéral de document). Flex prend en charge les deux styles d'opérations.

Lorsqu'elle appelle une opération orientée RPC, une application envoie un message SOAP spécifique une opération et ses paramètres. Lorsqu'elle appelle une opération orientée document, une application envoie un message SOAP contenant un document XML.

Dans un document WSDL, chaque balise comporte une propriété binding qui spécifie le nom d'une balise spécifique, comme l'illustrer l'exemple suivant :

<binding name="InstantMessageAlertSoap" type="s0:InstantMessageAlertSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http">
        style="document"/>
    </soap:binding transport="http://schemas.xmlsoap.org/soap/http">
</soap:binding transport="http://schemas.xmlsoap.org/soap/http">
    <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
        <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
            <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                    <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                        <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                            <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                    <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                          <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                            <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                                  <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                    <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                          <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                                <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                                  <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                    <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                          <xml soap xmlns="http://www.w3.org/soap/rfc456" type="xml soap">
                                                <xml soap synchronize="1"/> 
    </xml soap>
</xml soap> 

La propriété style de la balise associée déterminé le style d'opération. Dans cet exemple, le style est document.

Toute opération dans un service peut spécifier le même style ou replacer le style spécifique pour le port associé au service, comme l'illustrer l'exemple suivant :

<operation name="SendMSN"> <soap:operation soapAction="http://www Bindingpoint.com/ws/imalert/ SendMSN"style="document"/> 

Services Web avec état

Flex fait appel à des sessions de serveur Java pour conserver l'état des points de terminaison de service Web qui utilisent des cookies pour enregistrer des informations de session. Cette fonction fait office d'intémédiaire entre les applications et les services Web. Elle ajoute une identité de point de terminaison à tout élément que le point de terminaison transmet à l'application. Si le point de terminaison envoie des informations de session, l'application les recoit. Cette fonction ne nécessite aucune configuration ; elle n'est pas prise en charge pour les destinations qui font appel au canal RTMP lorsque le service proxy est utilisé.

Utilisation d'en-têtes SOAP

Un en-tête SOAP est une balise facultative dans une enveloppe SOAP qui contient généralement des informations spécifique aux applications (des informations d'authentication, par exemple).

Ajout d'en-têtes SOAP à des demandes de services Web

Certsains services Web requièrent la transmission d'un en- tête SOAP lors de l'appeil d'une opération.

Vous pouvez ajouter un en-tête SOAP à toutes les opérations de services Web ou à des opérations individuelles en appelant la méthode addHeader() ou addSimpleHeader() d'un objet WebService ou Operation dans une fonction d'écouteur d'évenement.

Avant d'utiliser la méthode addHeader(), vous doivent creer séparément les objets SOAPHeader et QName. La méthode addHeader() présente la signature suivante:

addHeader(header:mx.rpc.soap.SOAPHeader):void

Pour creer un objet SOAPHeader,utilizez le constructeur suivant:

SOAPHeader(qname:QName, content:Object)

Pour creer l'objet QName dans le premier parametre de la methode SOAPHeader(),utilisez le constructeur suivant :

QNameURI:String,localName:String)

Le paramètre content du constructeur SOAPHeader() est un ensemble de paires nom-valeur basées sur le format suivant:

{name1:value1,name2:value2}

La méthode addSimpleHeader() constitue un raccourci pour un en-tête SOAP nom-valeur unique. Lorsque vous utilisez la méthode addSimpleHeader(), vous creez les objets SOAPHeader et QName dans les parametes de la méthode. La méthode addSimpleHeader() presente la signature suivante:

addSimpleHeader(qnameLocal:String, qnameNamespace:String, headerName:String, headerValue:Object):void

La méthode addSimpleHeader() utilise les paramètres suivants:

  • gnameLocal est le nom local de l'en-tête QName.
  • qnameNamespace est l'espace de noms de l'en-tête QName.
  • headerName est le nom de l'en-tête.
  • headerValue est la valeur de l'en-tête. Il peut s'agir d'une chaine dans le cas d'une valeur simple, d'un objet auquel un codage XML de base sera appliqué ou de données XML si vous souhaitez spécifique les données XML de l'en-tête vous-même.

Dans l'exemple suivant, le code indique comment utiliser les méthodes addHeader() et addSimpleHeader() pourajouter un en-tête SOAP. Les méthodes sont appelées dans une fonction d'écouteur d'événement nommée headerset l'écouteur d'événement est assigné dans la propriété load d'une balise :

<?xml version="1.0"?>
<!-- fds\rpc\WebServiceAddHeader.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" height="600">
    <mx:WebService id="ws" wsd1="http://myserver:8500/flexapp/app1.cfc?wsdl">
        load="headers();"/>
    <mx: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");} ]
    ]>
</mx:Script>
</mx:Application> 

Suppression d'en-têtes SOAP

Utilisez la méthode clearHeaders() de l'objet WebService ou Operation pour supprimer les en-têtes SOAP ajoutés à l'objet, ainsi que l'illustré l'exemple suivant pour un objet WebService. Vousdezappelerla méthode clearHeaders() au niveau (WebService ou Operation) auquel l'en-tête a été ajouté.

<?xml version="1.0"?>
<!-- fds\rpc\WebServiceClearHeader.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" height="600">
    <!-- 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();"/>
    <mx: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();
        }
    } ]
</mx:Script>
<mx:HBox>
    <mx:Button label="Clear headers and run again" click="clear();"/> </mx:HBox>
</mx:Application> 

Réorientation d'un service Web vers une URL différente

Certain services Web nécessitent le passage à une URL de point de terminaison différente après avoir traité le WSDL et l'exécution d'un appel initial au service Web. Vous poulez par exemple utiliser un service Web nécessitant la transmission d'informations d'identification de sécurité. Le service Web appelé pour l'envoi des informations d'identification de connexion accepte les informations d'identification et returnne l'URL de point de terminaison réelle requise pour utiliser les opérations métier du service. Avant d'appeler les opérations métier, vous devez modifier la propriété endpointURI du composant WebService.

L'exemple suivant présente un écouteur d'évenement result qui stocke dans une variable l'URL de point de terminaison returnée par un service Web, puis transmet cette variable à une fonction afin de modifier l'URL de point de terminaison pour les demandes ultérieures :

public function onLoginResult(event:ResultEvent):void { 

Un service Web nécessitant la transmission d'informations d'identification de sécurité peut également renvoyer un identifient que vous devrez attacher à un en-tête SOAP pour toute demande ultérieure. Pour plus d'informations, voir « Utilisation d'en-têtes SOAP » à la page 89.

Sérialisation des données de service Web

Codage des données ActionScript

Le tableau suivant presente les mappings de codage des types ActionScript 3.0 en types complexes de schema XML.

Définition du schéma XMLTypes ActionScript 3.0 pris en chargeRemarques
Éléments de niveau supérieur
xsd:element nillable == trueObjectSi la valeur d'entrée est null, la sortie codée est définie avec l'attribut xsi:nil.
xsd:element fixed != nullObjectLa valeur d'entrée est ignorée et replacée par la valeur fixe.
xsd:element default != nullObjectSi la valeur d'entrée est null, elle est replacée par cette valeur par défaut.
Éléments locaux
xsd:element maxOccurs == 0ObjectLa valeur d'entrée est ignorée et omise de la sortie codée.
xsd:element maxOccurs == 1ObjectLa valeur d'entrée est traitée comme une entité unique. Si le type associé est un tableau codé SOAP, les tableaux et les implémentations mx.collectionation. IList sont transmis intacts pour êtretraités par le codeur SOAP comme des cas spéciaux pour ce type.
xsd:element maxOccurs > 1ObjectLa valeur d'entrée doit être iterable (un tableau ou une implémentation mx.collectionations. IList, par exemple), bien que les valeurs non itérables soient enveloppées avant traitement. Les éléments individuels sont codés en tant qu'entities distinctes conformément à la définition.
xsd:element minOccurs == 0ObjectSi la valeur d'entrée n'est pas définie ou est null, la sortie codée est omise.

Le tableau suivant presente les mappings de codage de types ActionScript 3.0 en types intégrés de schéma XML.

Type de schéma XMLTypes ActionScript 3.0 pris en chargeRemarques
xsd:anyTypeObjectBoolean -> xsd:boolean
xsd:anySimpleTypeArray -> xsd:base64Binary
Date -> xsd:dateTime
int -> xsd:int
Number -> xsd:double
String -> xsd:string
uint -> xsd:unsignedInt
xsd:base64Binaryflash.utils.ByteArraymx.util.Base64Encoder est utilisé (sans-retour à la ligne).
xsd:booleanBooleanToujours codé en tant que true ou false.
NumberNumber == 1 alors true, dans le cas contraire, false.
ObjectObject.toString() == « true » ou « 1», alors true; dans le cas contraire, false.
xsd:byteNumberChaine d'abord convertie en nombre.
xsd:unsignedByteString
xsd:dateDateLes méthodes d'accesseur Date.UTC sont utilisées.
NumberNombre utilisé pour définir Date.time.
StringChaine considérée préformatée et codée tellequelle.
xsd北京时间DateLes méthodes d'accesseur Date.UTC sont utilisées.
NumberNombre utilisé pour définir Date.time.
StringChaine considérée préformatée et codée tellequelle.
xsd:decimalNumberNumber.toString() est utilisé. Infinity, -Infinity et NaN ne sont pas valides pour ce type.
StringChaine d'abord convertie en nombre.
xsd:doubleNumberLimité à la plage de Number.
StringChaine d'abord convertie en nombre.
xsd:durationObjectObject.toString() est appelé.
xsd:floatNumberLimité à la plage de Number.
StringChaine d'abord convertie en nombre.
xsd:gDayDateDate.getUTCDate() est utilisé.
NumberNombre directement utilisé pour le jour.
StringChaine analyse en tant que nombre du jour.
xsd:gMonthDateDate.getUTCMonth() est utilisé.
NumberNombre directement utilisé pour le mois.
StringChaine analyse en tant que nombre du mois.
xsd:gMonthDayDateDate.getUTCMonth() et Date.getUTCDate() sont utilisés.
StringChaine analyse pour les portions de mois et de jour.
xsd:gYearDateDate.getUTCFullYear() est utilisé.
NumberNombre directement utilisé pour l'année.
StringChaîne analysée en tant que nombre de l'année.
xsd:gYearMonthDateDate.getUTCFullYear() et Date.getUTCMonth() sont utilisés.
StringChaîne analysée pour les portions d'année et de mois.
xsd:hexBinaryflash.utilsByteArraymx.utils HexEncoder est utilisé.
xsd:integer et dérivés : xsd:-negativeInteger xsd:nonNegativeInteger xsd:positiveInteger xsd:nonPositiveIntegerNumberLimité à la plage de Number.
StringChaîne d'abord convertie en nombre.
xsd:int xsd:unsignedIntNumberChaîne d'abord convertie en nombre.
String
xsd:long xsd:unsignedLongNumberChaîne d'abord convertie en nombre.
String
xsd:short xsd:unsignedShortNumberChaîne d'abord convertie en nombre.
String
xsd:string et dérivés : xsd:ID xsd:IDREF xsd:IDREFS xsd:ENTITY xsd:ENTITIES xsd:language xsd:Name xsd:NCName xsd:NMTOKEN xsd:NMTOKENS xsd:normalizedString xsd:tokenObjectObject.toString() est invoqué.
xsd:timeDate Number StringLes méthodes d'accesseur Date.UTC sont utilisées. Nombre utilisé pour définir Date.time. Chaine considérée préformatée et codée tellequelle.
xsi:nilnullSi la définition d'élement de schéma XML correspondante compte minOccurs > 0, une valeur null est codée à l'aide de xsi:nil ; dans le cas contraire, l'élement est entièrement omis.

Le tableau suivant présente le mappage de types ActionScript 3.0 en types codés SOAP.

Type SOAPENCTypes ActionScript 3.0 pris en chargeRemarques
soapenc:ArrayArray mxcollections.IListLes tableaux codés SOAP sont traités comme des cas spéciaux et ne sont pris en charge qu'avac les services Web de style codés RPC.
soapenc:base64flash.utilsByteArrayCodé de la même manière que xsd:base64Binary.
soapenc:*ObjectTout autre type codé SOAP est traité comme s'il figurait dans l'espace de noms XSD en fonction de la propriété localName de l'objet QName du type.

Décodage du schéma XML et de SOAP vers ActionScript 3.0

Le tableau suivant presente les mappings de decodage de types intégrés de schéma XML en types ActionScript 3.0.

Type de schéma XMLTypes ActionScript 3.0 décodésRemarques
xsd:anyTypeStringSi le contenu est vide -> xsd:string.
xsd:anySimpleTypeBooleanSi 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.
NumberDans le cas contraire, le contenu est un nombre valide et donc -> xsd:double.
xsd:base64Binaryflash.utils.ByteArraymx.utils.Base64Decoder est utilisé.
xsd:booleanBooleanSi le contenu est « true » ou « 1 », alors true ; dans le cas contraire, false.
xsd:dateDateS'il n'existe aucune information de fuseau hora, l'houre locale est utilisé.
xsd北京时间DateS'il n'existe aucune information de fuseau hora, l'houre locale est utilisé.
xsd:decimalNumberLe contenu est créé via Number (content) et est donc limité à la plage de Number.
xsd:doubleNumberLe contenu est créé via Number (content) et est donc limité à la plage de Number.
xsd:durationStringLe contenu est renvoyé avec réduction des espaces.
xsd:floatNumberLe contenu est converti via Number (content) et est donc limité à la plage de Number.
xsd:gDayuintLe contenu est converti via uint (content).
xsd:gMonthuintLe contenu est converti via uint (content).
xsd:gMonthDayStringLe contenu est renvoyé avec réduction des espaces.
xsd:gYearuintLe contenu est converti via uint (content).
xsd:gYearMonthStringLe contenu est renvoyé avec réduction des espaces.
xsd:hexBinaryflash.utils.ByteArraymx.utils HEXDecoder est utilisé.
xsd:integer et dérivés : xsd:byte xsd:int xsd:long xsd:negativeInteger xsd:nonNegativeInteger xsd:nonPositiveInteger xsd:positiveInteger xsd:short xsd:unsignedByte xsd:unsignedInt xsd:unsignedLong xsd:unsignedShortNumberLe contenu est décodé via parseInt ().
xsd:string et dérivés : xsd:ID xsd:IDREF xsd:IDREFS xsd:ENTITY xsd:ENTITIES xsd:language xsd:Name xsd:NCName xsd:NMTOKEN xsd:NMTOKENS xsd:normalizedString xsd:tokenStringLe contenu brut est simplement renvoyé en tant que chaine.
xsd:timeDateS'il n'existe aucune information de fuseau hora, l'houre locale est utilisé.
xsi:nilnull

Le tableau suivant presente les mappings de décodage de types codés SOAP en types ActionScript 3.0.

Type SOAPENCType ActionScript décodéRemarques
soapenc:ArrayArray mx.collectioningsArrayCollectionLes tableaux codés SOAP sont traités comme des cas spéciaux. Si makeObjectsBindable présente la valeur true, le résultat est enveloppè dans une classe ArrayCollection ; dans le cas contraire, un tableau simple est renvoyé.
soapenc base64flash.utils.ByteArrayDécodé de la même manière que xsd:base64Binary.
soapenc:*ObjectTout autre type codé SOAP est traité comme s'il figurait dans l'espace de noms XSD en fonction de la propriété localName de l'objet QName du type.

Le tableau suivant presente les mappings de décodage de types de données personalisés en types de données ActionScript 3.0.

Type personneliséType ActionScript 3.0 décodéRemarques
Apache Maphttp://xml.apache.org/XML-soap:MapObjectLa représentation SOAP dejava.util.Map. Keys doit être représentable sous forme de chaînes.
Apache Rowsethttp://xml.apache.org/XML-soap:RowsetTableau d'objects
ColdFusion QueryBeanhttp://rpc.xml.coldfusion:QueryBeanTableau d'objectsmxcollectionsArrayCollection d'objectsSi makeObjectsBindableprésenté la valeur true, le tableau résultat est enveloppé dans une classeArrayCollection.

Prise en charge de I'élément de schéma XML

Les structures ou attributs de structures de schéma XML suivants ne sont que partiellement implémentés dans Flex 4 :

<choice> <all> <union 

Les structures ou attributs de structures de schéma XML suivants sont ignorés et ne sont pas pris en charge dans Flex 4 :

<element  
substitutionGroup="..."  
unique="..."  
key="..."  
keyref="..."  
field="..."  
selector="..." /> 
simpleType>   
<restriction> <minExclusive> <minInclusive> <maxExclusive> <maxInclusive> <totalDigits> <fractionDigits> <length> <minLength> <maxLength> <enumeration> <whiteSpace> <pattern> </restriction>   
</simpleType> 
<complexType final="..." block="..." mixed="..." abstract="..." />

<annotation> 

Personnalisation du mappage de type de service Web

Lorsqu'il utilise des données d'une invocation de service Web, Flex create généralement des objets ActionScript anonyms non typés et imite la structure XML dans le corps du message SOAP. Si vous voulez que Flex créé une instance d'une classe spécifique, vous pouvez utiliser un objet mx.rpm/xmlSchemaTypeRegistry et enregistrer un objet QName avec une classe ActionScript correspondante.

You dispossez par exemple de la définition de classe suivante dans un fichier nommé User.as :

Vou voulez alors invoquer une operation getUser sur un service Web renvoyant les données XML suivantes :

<tns:getUserResponse xmlns:tns="http://example.uri">
    <tns:firstName>Ivan</tns:firstName>
    <tns:lastName>Petrov</tns:lastName>
</tns:getUserResponse> 

A l'invocation de l'opération.getUser, pour être certain d'obtenir une instance de la classe User, et non un objet générique, faites figurer le code ActionScript suivant dans une méthode de l'application :

SchemaTypeRegistry.getInstance().registerClass(new QName("http://example.uri", "getUserResponse"), User); 

SchemaTypeRegistry.getInstance() est une méthode statique qui renvoie l'instance par défaut du registre de type. Dans la plupart des cas, c'est tout ce dont vous avez besoin. Cette manière derialcder enregistratre toutefois un objet QName donne avec la meme classe ActionScript a travers toutes les operations de service Web de l'application. Pour enregistrer differentes classes pour differentes operations, faites figurer le code suivant dans une methode de l'application :

var qn:QName = new QName("http://the.same", "qname");  
var typeReg1:SchemaTypeRegistry = new SchemaTypeRegistry();  
var typeReg2:SchemaTypeRegistry = new SchemaTypeRegistry();  
typeReg1.registerClass(qn, someClass);  
myWS也有很多Operationdecoder.typeRegistry = typeReg1; 
typeReg2.registerClass(qn, anotherClass);  
myWS.anotherOperationdecoder.typeRegistry = typeReg2; 

Utilisation de la sérieisation de service Web personnelisée

Deux méthodes permettent de prendre le contrôle intégral de la manière dont les objets ActionScript sont sérieisés dans XML et dont les messages de réponse XML sont désrialisés. La méthode recommandaee est l'utilisation directe d'E4X.

Si vous transmettez une instance de XML comme seul paramètre à une opération de service Web, elle est transmise intacte en tant qu'enfant du nœud dans la demande sérialisée. Utilisez cette stratégie pour contrôle intégralement le message SOAP. De même, lorsque vous désérialisez une réponse de service Web, vous pouvez définir la propriété résultat Format de l'opération sur e4x. Cela renvoie un message de réponse contenant l'objet XmlList avec les enfants du nœud . Vous pouvez ensuite implémenter la logique personalisée requise pour créé les objets ActionScript appropriés.

Plus fastidieuse, la seconde méthode consiste à fournir vos propres implémentations de mx.rpc.soap.ISOAPDecoder et mx.rpc.soap.ISOAPEncoder. Si vous avez par exemple ecrit une classe nommée MyDecoder implémentant ISOAPDecoder, le code suivant pourra figurer dans une méthode de l'application :

myWS"SomeOperationdecoder = new MyDecoder(); 

Lorsque vous appelez someOperation, Flex appelle la méthode decodeResponse() de la classe MyDecoder. Il incombe ensuite à l'implémentation personnalisée de Traits le message SOAP intégral et de produit les objets ActionScript attendus.

Utilisation de composants RemoteObject

Vou puez utiliser un composant Flex RemoteObject pour appeler des méthodes sur un composant ColdFusion ou une classe Java.

Vous pouvez également utiliser des composants RemoteObject contenant des objets PHP et .NET avec des logiciel tiers, tels que les projets « open source » AMFPHP et SabreAMF, ainsi que Midnight Coders WebORB. Pour plus d'informations, 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 receivevoir des données, tandis que les composants WebService et HTTPService font appel au protocole HTTP. AMF est considérablement plus rapide que HTTP. Le codage et la configuration côté serveur sont toutefois généralement plus complexes.

Flash Builder pour PHP est un outil de développement créé en partenariat avec Zend Technologies qui inclue une copie intégrée de Zend Studio. Pour plus d'informations, voir le site Web d'Adobe.

De même que les composants HTTPService et WebService, les composants RemoteObject peuvent être utilisés pour afficher le résultat d'une requête de base de données dans une application. Vous pouvez également utiliser les composants pour insérer,mettre à jour et supprimer les données d'une base de données. Une fois le résultat de la requête renvoyé à l'application, vous pouze l'afficher dans un ou plusieurs contrôles de l'interface utilisé.

Pour obtenir des informations de referencia API sur le composant RemoteObject, voir mxrpc.remoting.mxml.RemoteObject.

Exemple d'application RemoteObject

Code MXML

Dans l'exemple suivant, l'application utilise un composant RemoteObject pour appeler un composant ColdFusion. Le composant ColdFusion interroge une table de base de données MySQL appelée users. Il renvoie le résultat de l'interrogation à l'application, dans laquelle ce résultat est lié à la propriété dataProvider d'un contrôle DataGrid et affché dans ce contrôle DataGrid. L'application envoie également le nom d'utilisateur et l'adresse électronique des nouveaux utilisateurs au composant ColdFusion, qui les ajoute à la table de la base de données des utilisateurs.

<?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="userRequest"
                destination="ColdFusion"
                source="flexapp.returnusers">
                <mx:method name="returnRecords" result="returnHandler(event)" fault="mx.controlssAlert.show(event.fault.faultString)" />
                <mx:method name="insertRecord" result="insertHandler"/>
                <mx:RemoteObject>
                    </fx:Declarations>
            </fx:Script>
            <!-- CDATA [import mx.rpc.events.ResultEvent; 
000 002 997 1000<|box_end|><|ref_start|>code<|ref_end|><|rotate_up|> 

Dans cette application, la propriété destination du composant RemoteObject est définié sur Coldfusion et la propriété source est définié sur le nom complet du composant ColdFusion.

En revanche, lorsque vous utilisez LiveCycle Data Services ou BlazeDS, vous spécifie un nom de classe complet dans la propriété source d'une destination de service distant dans un fisier de configuration (par défaut, remoting-config.xml). Indique le nom de la destination dans la propriété destination du composant RemoteObject. La classe de destination doit également comporter un constructeur no-args. Avec ColdFusion, vous pouvez proceder de cette maniere pour configurer une destination au lieu d'appliquer la propriété source au composant RemoteObject.

Composant ColdFusion

L'application appelle le composant ColdFusion suivant. Ce code ColdFusion effectue des insertions et des interrogations de base de données SQL, puis renvoie les résultats de l'interrogation à l'application. La page ColdFusion utilise la balise cfquery pour insérer des données dans la base de données et pour l'interroger. Elle fait appel à la balise cfreturn pour formater les résultats de l'interrogation en tant qu'objet d'interrogation ColdFusion.

<cfcomponent name="returnusers">
    <cffunction name="returnRecords" access="remote" returnType="query">
        <cfquery name="alluserinfo" datasource="flexcf">
            SELECTuserid, 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="#argumentsUsername#" xmlns="CF_SQL_VARCHAR"
                        maxlength="255>", 
                        <cfqueryparam value="#arguments.emailaddress#" xmlns="CF_SQL_VARCHAR"
                        maxlength="255"/>
            </cfquery>
            <cfreturn>
                </cffunction>
            </cfcomponent>
        </cffunction>
    </cffunction>
</cffunction>
</cfqueryname="returnRecords" returntype="query"> 

Appel de composants RemoteObject dans ActionScript

Dans l'exemple ActionScript suivant, l'objet de la méthode useRemoteObject() déclaré le service, définit la destination, configure des écouteurs d'évenement résultat et fault et procède à l'objet de la méthode getList() du service.

<?xml version="1.0"?>
<!-- fds\rpc\ROInAS.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <!-- CDATA>
            import mx.controlss ALERT;
            import mxrpc.remoting.RemoteObject;
            import mxrpc.events.ResultEvent;
            import mxrpc.events.FaultEvent;
            [Bindable]
            public var empList:Object;
            public var employeeRO:RemoteObject;
        }
        public function useRemoteObject(intArg:int, strArg:String):void {
            employeeRO = new RemoteObject();
            employeeROdestination = "SalaryManager";
            employeeRO myList.addEventListener("result", getListResultHandler);
            employeeRO.addEventListener("fault", faultHandler);
            employeeRO myList(deptComboBox.selectItem.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');
        }
    } ]
?> </mx:Script>
    <mx:ComboBox id="deptComboBox" /> </mx:Application> 

Accès à des objets Java dans le chemin source

Le composant RemoteObject vous permet d'acceder à des objets Java sans état et avec état figurant dans le chemin source des applications Web LiveCycle Data Services, BlazeDS ou ColdFusion. Vous pouvez placer des fischiers de classes autonomes dans le réseau WEB-INF/classes et des classes contenues dans des fischiers JAR (Java Archive) dans le réseau WEB-INF/lib de l'application Web pour les ajouter au chemin source. Vous pouvez spécifique le nom de classe complet dans la propriété source d'une destination de service distant dans le fjichier services-config.xml de LiveCycle Data Services, BlazeDS ou ColdFusion ou dans un fjichier que le nom de classe complet inclut par référence (remoting-config.xml, par exemple). La classe doit également compter un constructeur no-args. Pour ColdFusion, vous pouvez si vous le souhaitez définir la propriété destination du composant RemoteObject sur Coldfusion et la propriété source sur le nom complet d'un composant ColdFusion ou d'une classe Java.

Lorsque you configurez une destination de service distant pour acceder à des objets sans état (étendue de la demande), Flex create un objet différé pour chaque appel de méthode au lieu d'appeler les méthodes sur le même objet. Vous pouvez définir l'étendue d'un objet sur l'étendue de la demande (valeur par défaut), de l'application ou de la session. Les objets dans l'etendue de l'application sont accessibles à l'application Web qui contient l'objet. Les objets dans l'étendue de la session sont accessibles à toute la session client.

Lorsque vous configurer une destination d'objet distant pour acceder à des objets avec état, Flex create l'objet une seule fois sur le serveur et maintain l'état entre les appeals de méthode. Si le stockage de l'objet dans l'endetue de l'application ou de la session provoque des problèmes de mémoire, utilisez l'endetue de la demande.

Accès à des objets EJB et autres objets dans JNDI

Vous pouvez acceder à des objets EJB (Enterprise JavaBean) et autres objets stockés dans JNDI (Java Naming and Directory Interface) en appelant des méthodes sur une destination constituent une classe de façon de service qui recherche un objet dans JNDI et appelle sa méthode.

Vous pouvez utiliser des objets avec ou sans état pour appeler les méthodes d'objets Enterprise JavaBean et d'autres objets utilisant JNDI. Pour un objet EJB, vous pouze appeler une classe de façon de service qui renvoie l'objet EJB de JNDI et appelle une méthode sur l'objet EJB.

Dans la classe Java, vous pouvez utiliser le schéma de codage Java standard, dans lequel vous créez un contexte initial et effectuez une recherche JNDI. Pour un objet EJB, utilisez également le schéma de codage standard dans lequel la classe contient des méthodes qui appellent la méthode create() de l'objet racine EJB et les méthodes métier de l'objet EJB résultat.

L'exemple suivant utilise une méthode appelée getHelloData() sur une destination de classe de façon :

<mx:RemoteObject id="Hello" destination="roDest">
    <mx:method name="getHelloData"/>
</mx:RemoteObject> 

Dans le côté Java, la méthode getHelloData() peut encapsuler tous les éléments nécessaires pour appeler une méthode métier sur un objet EJB. Dans l'exemple ci-après, la méthode Java effectue les actions suivantes :

  • create un nouveau contexte initial pour appeler l'objet EJB;
  • effectue une recherche JNDI qui obtient un objet racine EJB;
  • appelle la méthode create() de l'objet racine EJB;
  • appelle la méthode sayHello() de l'objet EJB.

public void getHelloData() { try{ InitialContext ctx = new InitialContext(); Object obj = ctx.lookup("/Hello"); HelloWorld ejbHome (HelloHome) PortableRemoteObject.narrow(obj, HelloWorld.class); HelloWorld ejbObject = ejbHome.create(); String message = ejbObject.sayHello(); } catch (Exception e); 1

Noms de méthodes réservés

La bibliothèque d'accès distant Flex utilise les noms de méthodes ci-dessous ; n'utilise pas ces noms de méthodes pour vos propres méthodes :

addHeader()  
addProperty()  
deleteHeader()  
hasOwnProperty()  
isPropertyEnumerable()  
isPrototypeOf()  
registerClass()  
toLocaleString()  
string()  
unwatch()  
valueOf()  
watch() 

De plus, ne commencez pas les noms de méthodes par le caractère de soulignement ( ).

Pour acceder aux méthodes (opérations) RemoteObject, il suffit de les nommer d'après la variable de service. Des conflicts de noms risquent toute fois de se produit si le nom d'une opération correspond à une méthode définie pour le service. Dans ActionScript, vous pouvez appliquer la méthode suivante à un composant RemoteObject pour renvoyer l'opération du nom donné :

public function getOperation(name:String):Operation

Sérialisation entre ActionScript et Java

LiveCycle Data Services et BlazeDS sérieisent les données entre les types de données ActionScript (AMF 3), Java et ColdFusion dans les deux directions. Pour plus d'informations sur les types de données ColdFusion, voir la documentation ColdFusion.

Conversion des données d'ActionScript en Java

Le type des données envoyées d'une application à un objet Java par des paramètres de méthodes est automatiquement converti d'ActionScript en Java. Lorsque LiveCycle Data Services ou Blaze DS recherche une méthode appropriée sur l'objet Java, il utilise d'autres conversions, moins systématiques, pour trouver une correspondance.

Les types de données de base du client (les valeurs Boolean et String, par exemple) correspondent en général exactement à une API distante. Flex tente toute fois d'effectuer certaines conversions simples lorsqu'il recherche une méthode appropriée sur un objet Java.

Un tableau ActionScript peut indexer des entrées de deux manières. Un tableau strict est un tableau dans lequel tous les index sont des nombres. Un tableau associatif est un tableau dans lequel au moins un index est basé sur une chaine. Il est important de savoir quel type de tableau vous envoyez au serveur, car ce type change le type de données des paramétres utilisés pour invoquer une méthode sur un objet Java. Un tableau dense est un tableau dans lequel tous les index numériques sont consécutifs, sans écart, commeçant à 0 (zéro). Un tableau très dense est un tableau dans lequel il existe des écarts entre les index numériques ; le tableau est traité comme un objet et les index numériques deviennent des propriétés désrialisées dans un objet java.util.Map pour éviter l'envoi de nombreuses entrées nulles.

Le tableau suivant répertorie les conversions ActionScript (AMF 3) vers Java prises en charge pour les types de données simples.

Type ActionScript (AMF 3)Déérialisation vers JavaLiaison de type Java prise en charge
Array (dense)java.util.Listjava.utilCollection, Object[] (tableau natif) Si le type est une interface, il est mappé sur les implémentations d'interface suivantes: • List devient ArrayList. • SortedSet devient TreeSet. • Set devient HashSet. • Collection devient ArrayList. Une nouvelle instance d'une implémentation Collection personnalisée est liée à ce type.
Array (sparse)java.util.Mapjava.util.Map
Boolean Chaine "true" ou "false"java.lang.BooleanBoolean, boolean, String
flash.utils.ByteArraybyte []
flash.utils.lExternalizablejava.io Externalizable
Datejava.util.Date (formatté pour UTC (Coordinated Universal Time)java.util.Date, java.util.Calendar, java.sql.Timestamp, java.sql.Time, java.sql.Date
int/uintjava.lang.Integerjava.lang.Double, java.lang.Long, java.lang.Float, java.lang.Integer, java.lang.Short, java.lang.Byte, java.math.BasicDecimal, java.math.BasicInteger, String, types primitifs de double, long, float, int, short, byte
nullnullprimitives
Numberjava.lang.Doublejava.lang.Double, java.lang.Long, java.lang.Float, java.lang.Integer, java.lang.Short, java.lang.Byte, java.math.BasicDecimal, java.math.BasicInteger, String, 0 (zéro) Si null est envoyé, types primitifs de double, long, float, int, short, byte.
Object (generic)java.util.MapSi une interface Map est spécifique, créé un objet java.util.HashMap pour java.util.Map et un nouvel objet java.util.TreeMap pour java.util.SortedMap.
Stringjava.lang.Stringjava.lang.String, java.lang.Boolean, java.lang.Number, java.math.BasicInteger, java.math.BasicDecimal, char[], tout type de nombre primitif
typed Objecttyped Object Lorsque vous utilisez une balise de métadonnées [RemoteClass] qui spécifie un nom de classe distante. Le type Bean doit composer un constructeur no-args public.typed Object
Type ActionScript (AMF 3)Désérialisation vers JavaLiaison de type Java prise en charge
non défièn (undefined)nullnull pour Object, valeurs par défaut pour les primitives
XMLorg.w3c.dom.Documentorg.w3c.dom.Document
XMLDocument (type XML existant)org.w3c.dom.Documentorg.w3c.dom.Document Voues pouvez activer la prise en charge des donnéesées XML existantes pour le type XMLDocument sur tout canal défièn dans le fjichier services-config.xml. Ce paramètre n'intervient que dans l'envoi de donnéesés du serveur au client; il détermine la manière dont les instances org.w3c.dom.Document sont envoyées à ActionScript. Pour plus d'informations, voir Configuration de la sérieisation AMF sur un canal.

Les valeurs primitives ne peuvent pas etre definiies sur null dans Java. Lors de la transmission de valeurs Boolean et Number du client vers un objet Java, Flex interprete les valeurs null comme valeurs par defaut 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 defaut.

LiveCycle Data Services et BlazeDStraitent les objets java.lang.Throwing comme tout autre objet typé. Ces objets sont traités avec des règles recherchant des champs publics et des propriétés bean. Des objets typés sont renvoyés au client. Ces règles sont identiques aux règles bean ordinaires, à ceci pris qu'elles recherchant des getters pour les propriétés en lecture seule. La quantité d'informations obtenues d'une exception Java est ainsi plus importante. Afin de spécifique un comportement existant pour les objets Throwing, définitisse la propriété legacy-throwable d'un canal sur true. Pour plus d'informations, voir Configuration de la sérieisation AMF sur un canal.

Vou puez transmettre des tableaux stricts en tant que parametes à des methodes s'attendant à une implémentation des API java.util.Collection ou de tableau Java natif.

Une collection Java peut containir n'importe quel nombre de types d'objects, alors qu'un tableau Java nécessite que les entrées soient du même type (java.lang.Object[ ] et int[, par exemple).

LiveCycle Data Services and BlazeDS convertissent au si les tableaux stricts ActionScript en implémentations appropriées pour les interfaces API Collection courantes. Par exemple, si un tableau strict ActionScript est envoyé à la méthode d'objet Java public void addProducts(java.util.Set products), LiveCycle Data Services et BlazeDS le convertissant en une instance java.util.HasSet avant de le transmettre en tant que paramètre, car HashSet est une IMPLEMENTation appropriée pour l'interface java.util.Set. De même, LiveCycle Data Services et BlazeDS transmettent une instance de java.util.TreeSet aux paramétres typés avec l'interface java.util.Sortset.

LiveCycle Data Services et BlazeDS transmettent une instance de java.utilalyzedArrayList aux paramétres typés avec l'interface java.util.List et toute autre interface qui étend java.utilCollection. Ces types sont ensuite renvoyés au client en tant qu'instances mxcollectionsArrayCollection. Pour renvoyer au client les tableaux ActionScript normaux, vous doivent définir l'objet legacy-collection sur true dans la section serialization des propriétés d'une définition de canal. Pour plus d'informations, voir Configuration de la sérieisation AMF sur un canal.

Mappage explicit d'objects ActionScript et Java

Pour les objets Java que LiveCycle Data Services et BlazeDS netrait pas implicitement, les valeurs trouvées dans les propriétés bean publiques avec les méthodes get/set et les variables publiques sont envoyées au client en tant que propriétés sur un objet. Les propriétés privées, les constantes, les propriétés statiques et les propriétés en lecture seule entre autres ne sont pas sérieisées. Pour les objets ActionScript, les propriétés publiques définies avec les accesseurs get/set et les variables publiques sont envoyées au serveur.

LiveCycle Data Services et BlazeDS utilise la classe Java standard java.beans.Introspector afin d'obtenir des descripteurs de propriétés pour une classe JavaBean. Il fait en outre appel à la réflexion pour collecter des champs publics sur une classe et a recours de préférence à des propriétés bean只不过 qu'à des champs. Les noms des propriétés Java et ActionScript doivent correspondre. Le code Flash Player natif déterminé la manière dont les classes ActionScript sont introspectées sur le client.

Dans la classe ActionScript, utilisez la balise de métadonnées [RemoteClassAlias=""] pour creer un objet ActionScript se mappant directement sur l'objet Java. La classe ActionScript vers laquelle les données sont converties doit être utilisée ou référencée dans le fjichier MXML afin d'être liée dans le fjichier SWF et disponible lors de l'exécution. Pour ce faire, une manière efficace consiste à projeter l'objet de résultat, comme l'illustrer l'exemple suivant :

var result: MyClass = MyClass(event.result); 

La classe elle-même doit utiliser des références fortement typées de sorte que ses dépendances soient aussi liées.

Les exemples suivants seront le code source d'une classe ActionScript utilisant la balise de métadonnées [RemoteClassAlias=""]]:

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;
} 

Vou puez utilise la balise de métadonnées [RemoteClass] sans alias si vous n'effectuez pas de mappage à un objet Java du serveur, mais que vous renvoyez le type d'objet depuis le serveur. L'objet ActionScript est sérieisé vers un objet Map spécifique lorsqu'il est envoyé au serveur. L'objet renvoyé du serveur aux clients est toute fois le type ActionScript d'origine.

Pour empêcher l'envoi d'une propriété au serveur à partir d'une classe ActionScript, utilisez la balise de métadonnées [Transient] située au-dessus de la déclaration de cette propriété dans la classe ActionScript.

Conversion des données de Java en ActionScript

Un objet renvoyé par une méthode Java est converti de Java en ActionScript. LiveCycle Data Services et BlazeDS traitent également les objets figurant dans des objets. LiveCycle Data Services traite implicitement les types de données Java répertoriés dans le tableau suivant.

Type JavaType ActionScript (AMF 3)
java.lang.StringString
java.lang.Boolean, booleanBoolean
java.lang.Integer, intint Si la valeur est < 0xF000000 | value > 0xFFFFFF, la valeur est élevé à Number en raison des conditions de codage AMF.
java.lang.Short, shortint Si i est < 0xF000000 | i > 0xFFFFFF, la valeur est élevé à Number.
java.lang.Byte, byte[]int Si i est < 0xF000000 | i > 0xFFFFFF, la valeur est élevé à Number.
java.lang.Byte[]flash.util.ByteArray
java.lang.Double, doubleNumber
java.lang.Long, longNumber
java.lang Float, floatNumber
java.lang.Character, charString
java.lang.Character[], char[]String
java. math.BigIntegerString
java.math.BigDecimalString
java.util.CalendarDate Les dates sont envoyées dans le fuseau horaire UTC (Coordinated Universal Time). Les clients et les serveurs doivent régler l'heure en fonction des fuseaux horaires.
java.util.DateDate Les dates sont envoyées dans le fuseau horaire UTC (Coordinated Universal Time). Les clients et les serveurs doivent régler l'heure en fonction des fuseaux horaires.
java.utilCollection (java.util.List, par exemple)mxcollections.collectionCollection
java.lang.Object[]Array
java.util.MapObjet (non type). Par exemple, un objet java.util.Map[] est converti en tableau (d'objets).
java.util.DictionaryObjet (non type)
org.w3c.DocumentObject XML
nullnull
java.lang.Object (autre type que les types précédemment répertoriés)Objet type Les objets sont sérieisés à l'aide de règles d'introspection JavaBean et incluent également des champes publics. Les champes statiques, transioires ou non publics ainsi que les propriétés bean non publiques ou statiques sont exclus.

Configuration de la sérieisation AMF sur un canal

Voupez prenre en charge la serialisation du type AMF existant utilise dans les versions precedentes de Flex et configurer d'autres propriétés de serialisation dans les definiptions de canaux du fichier services-config.xml.

Le tableau suivant décrit les propriétés que vous pouvez définir dans l'objet d'une définition de canal.

PropriétéDescription
La valeur par défaut est true. Détermine si le point de terminaison doit générer une erreur lorsqu'unobjet entrant du client compte des propriétés non prévues ne pouvant pas été définies sur l'objet du serveur.
La valeur par défaut est false. La valeur true active la journalisation des erreurs relatives aux propriétés non prévues.
La valeur par défaut est false. La valeur true active le renvoi des instances de java.utilCollection en tant que tableaux ActionScript. La valeur false active le renvoi des instances de java.utilCollection en tant qu'instances mxcollectionsArrayCollection.
La valeur par défaut est false. La valeur true active la sérieisation des instances java.utilMap en tant que tableau ECMA ou tableau associatif, et non en tant qu'objet anonyme.
La valeur par défaut est false. La valeur true active la sérieisation des instances org.w3c.docm.Document en tant qu'instances flash.xml.JPGDocument et non en tant qu'instances XML (compatibles E4X) intrinsèques.
La valeur par défaut est false. La valeur true active la sérieisation des instances java.langThrowableable en tant qu'objets d'informations de statut AMF (à la place de la sérieisation bean normale, incluant les propriétés en lecture seule).
(type-marshaller>classname</type-marshaller>Spécífie une implémentation de flex messaging.io.TypeMarshaller qui traduit un objet en instance de la classe désirée. Utilisé à l'invocation d'une méthode Java ou au replissage d'une instance Java, lorsque le type de l'objet d'entrée de la désérialisation (un objet anonyme ActionScript par exemple est toujours désérialisé en tant qu'objet java.util.HashMap) ne correspond pas à l'API de destination (java.util.SortedMap, par exemple). Le type peut donc être converti en type souhaité.
<restore-references>false</restore-references>La valeur par défaut est false. Commutateur avancé permettant à l'outil de désérialisation de conserver la trace des objets de références lorsqu'une traduction de type doit avoir lieu; par exemple, lorsqu'un objet anonyme est envoyé pour une propriété de type java.util.SortedMap, l'objet est d'abord désérialisé en un objet java.util.Map en tant qu'objet normal, puis traduit en une implémentation appropriée de SortededMap (java.util.TreeMap, par exemple). Si d'autres objets pointaient vers le même objet anonyme d'un graphique d'objets, ce paramètre restaque ces bénéfices au lieu de créé des implémentations SortededMap. Notez que l'attribution de la valeur true à cette propriété peut conduire à un ralentissement considérable des performances en présence de larges volumes de données.
<instantiate-types>true</instantiate-types>La valeur par défaut est true. Défini sur false, ce commutateur avancé empêche l'outil de désérialisation de créé des instances d'objects fortemment typés, retient les informations de type et désérialise les propriétés brutes dans une implémentation Map, en particulier flex messaging.io.ASObject. Les classes figurant dans les packagesflex.* sont toujours instanciées.

Utilisation de la sérieisation personalisée

Si les mécanismes standard de sérieisation et de désrialisation de données entre ActionScript sur le client et Java sur le serveur ne répondent pas à vos besoin, vous pouvez écrire votre propre schéma de sérieisation. Vous implèmentez l'interface flash.utils.IExternalizable ActionScript sur le client et l'interface java.io.Externalizable Java correspondante sur le serveur.

La sérieisation est souvent utilisée pour éviter de transmettre l'ensemble des propriétés de la représentation côte client ou côte serveur d'un objet à travers le niveau réseau. Lorsque vous implémentez la sérieisation personalisée, vous pouvez coder vos classes afin que les propriétés spécifiques uniquement client ou uniquement serveur ne soient pas transmises via le réseau. Lorsque vous utilisez le schéma de sérieisation standard, toutes les propriétés publiques font l'aller-retour entre le client et le serveur.

Côté client, l'identité d'une classe qui implèmente l'interface flash.utils.IExternalizable est écrite dans le flux de sérieisation. La classe sérieise et reconstruit l'état de ses instances. La classe implèmente les méthodes writeExternal() et readExternal() de l'interface IExternalizable pour contrôle le contenu et le format du flux de sérieisation, mais pas le nom ou le type de classe, pour un object et ses supertypes. Ces méthodes replacent le comportement de sérieisation AMF natif. Elles doivent être symétriques à leur homologue distant pour enregistrer l'état de la classe.

Côté serveur, une classe Java qui implèmente l'interface java.io. Externalizable executée des fonctionnalités analogues à une classe ActionScript implémentant l'interface flash.utils.IExternalizable.

Remarque: n'utilise pas des types qui implémentent l'interface IExternalizable avec la classe HTTPChannel si une sérieisation par referencia précise est requise. Cette opération conduit en effet à la perte des références entre les objets récurrents, qui apparaissent alors clonesés au niveau du point de terminaison.

L'exemple suivant présente le code source complet de la version (ActionScript) client d'une classe Product se mappant sur une classe Product Java sur le serveur. La classe Product client implémente l'interface IExternalizable et la classe Product serveur l'interface Externalizable.

// Product.as
package samples外出ernalizable{
import flash.utils.IExternalizable;
import flash.utils.IDDataInput;
import flash.utils.IDDataOutput;
[RemoteClass alias "samples外出ernalizable.Product"]
public class Product implements IExternalizable { public function Product(name:String = null){ this.name name; } public var id:int; public var name:String; public var properties:Object; public var 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 sérieisation. Elle utilise la sérieisation standard, compatible avec l'interface java.io.Externalizable, et la sérieisation AMF 3. L'exemple suivant présente la méthode writeExternal() de la classe Product client, qui utilise les deux types de sérieisation :

public function writeExternal(output: IDataOutput):void { output.writeObject(name); output.writeObject.properties); output.writeFloat(price); } 

Ainsi que l'illustré l'exemple suivant, la méthode writeExternal() de la classe Product serveur est presque identique à la version client de cette méthode :

public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(name); out.writeObject.properties); out.writeObject(price); } 

Dans la méthode writeExternal() de la classe Product client, la méthode

flash.utils.IDataOutput.writeFloat() est un exemple de méthode de sérieisation standard qui répond aux spécifications des méthodes java.io.DataInput.readFloat() Java pour utiliser des types primitifs. Cette méthode envoie la propriété price, de type Float, à la classe Product serveur.

L'exemple de sérieisation AMF 3 dans la méthode writeExternal() de la classe Product client est l'appel à la méthode flash.utils. DataOutput.writeObject(), qui se mappe à l'appel de la méthode

java.io.ObjectInput.readObject() dans la méthode readExternal() de la classe Product serveur. La méthode flash.utils.IDataOutput.writeObject() envoie à la classe Product serveur la propriété properties, qui constitue un objet, et la propriété name, qui constitue une chaine. Cette opération est possible car le point de terminaison AMFChannel comporte une implémentation de l'interface java.io.ObjectInput qui s'attend à ce que les données envoyées par la méthode writeObject() soient au format AMF 3.

Ensuite, lorsque la méthode readObject() est appelée dans la méthode readExternal() de la classe Product serveur, elle utilise la désérialisation AMF 3; c'est la raison pour laquelle la version ActionScript de la valeur propriéties est supposée être de type Map et la valeur name de type String.

L'exemple suivant présente la source complète de la classe Product serveur :

// Product.java package samples externalizable; 
import java.io.Externalizable;  
import java.io.IOException;  
import java.io.ObjectInput;  
import java.io.ObjectOutput;  
import java.util.Map; 

L'exemple suivant presente la méthode readExternal() de la classe Product serveur :

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)); }

La méthode writeExternal() de la classe Product client n'envoie pas la propriété id au serveur pendant la sérieisation car elle n'est d'aucune utilisé à la version serveur de l'objet Product. De même, la méthode writeExternal() de la classe Product serveur n'envoie pas la propriété inventoryId au client car il s'agit d'une propriété spécifique au serveur.

Notez que pendant la serialisation, les noms des propriétés d'une classe Product ne sont envoyés ni dans un sens, ni dans l'autre. L'état de la classe étant fixe et gérable, les propriétés sont envoyées dans un ordre bien définis sans leur nom. La méthode readExternal() les lit dans l'ordre approprié.

Transmission de paramètres explicites et liaison de paramètres

L'applé des composants HTTPService, WebService et RemoteObject peut se faire de deux manières différentes : par la transmission de paramètres explicités et par la liaison de paramètres. La transmission de paramètres explicites consiste à fournir des informations à un service sous la forme de paramètres pour une fonction ActionScript. Cette manière d'applé un service ressemble fortement à l'applé de méthodes sous Java. Les validateurs de données Flex ne peuvent pas été automatiquement utilisés avec la transmission de paramètres explicites.

La liaison de paramètres vous permet de copier des données de contrôles de l'interface utilisé ou de modèles pour demander des paramètres. Elle n'est disponible que pour les composants d'accès aux données que vous déclarez dans MXML. Vous pouvez appliquer des validateurs aux valeurs des paramètres avant de soumettre des demandes aux services. Pour plus d'informations sur la liaison de données et les modèles de données, voir Data binding et Storing data. Pour plus d'informations sur la validation de données, voir Validating Data.

La liaison de paramètres consiste à déclarer des balises de paramètres de la méthode RemoteObject imbriquées dans une balise sous une balise , des balises de paramètres HTTPService imbriquées dans une balise ou des balises de paramètres d'opération WebService imbriquées dans une balise sous une balise . La méthode send() permet d'envoyer la demande.

Transmission de paramètres explicites avec les composants RemoteObject et WebService

La transmission de paramètres explicites utilisée avec les composants RemoteObject est similaire à celle utilisée avec les composants WebService. L'exemple suivant illustré le code MXML utilisé pour déclarer un composant RemoteObject et appeler un service en utilisant la transmission de paramètres explicites dans l'écouteur d'événement click d'un contrôle Button. Un contrôleComboBox fournit les données au service. Des écouteurs d'événement simpletraitent les événements result et fault de niveau service.

<?xml version="1.0"?>
<!-- fds\rpc\RPCParamPassing.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
verticalGap="10">
<mx:Script>
    <!-- CDATA[ import mx.controlssAlert; [Bindable] public var empList:Object; ]
]">
</mx:Script>
<mx:RemoteObject
    id="employeeRO"
    destination="SalaryManager"
    result="empList=event.result"
    fault="Alert.show(event.fault.faultString, 'Error')"; />
<mx:ComboBox id="dept" width="150">
    <mx:dataProvider>
        <mx:ArrayCollection>
            <mx:source>
                <mx:Object label="Engineering" data="ENG"/>
                <mx:Object label="Product Management" data="PM"/>
                <mx:Object label="Marketing" data="MKT"/>
            </mx:source>
            </mx:ArrayCollection>
            </mx:dataProvider>
        </mx:ComboBox>
    <mx:Button label="Get Employee List" click="employeeRO myList(deptselectedItem.data)"; />
</mx:Application> 

Transmission de paramètres explicites avec les composants HTTPService

La transmission de paramètres explicites avec les composants HTTPService diffère de la transmission de paramètres explicites avec les composants RemoteObject et WebService. L'essay d'un service se fait toujours avec la méthode send() d'un composant HTTPService. L'approche n'est donc pas la même qu'avac les composants RemoteObject et WebService, sur lesquels vous appelez des méthodes qui sont des versions côté client des méthodes ou opérations du service RPC.

La transmission de paramètres explicites vous permet de spécifier un object contenant des paires nom-valeur comme paramètre de la méthode send(). Le paramètre de la méthode send() doit être un type de base simple ; vous ne pouvez pas utiliser d'objets imbriqués complexes car il n'existe aucune méthode générique permettant de les convertir en paires nom-valeur.

si vous ne spécifie pas de paramètre de la méthode send(), le composant HTTPService utilise les paramètres d'interrogation spécifique dans la balise .

Les exemples suivants illustrant deux manières d'appeler un service HTTP en utilisant la méthode send() avec un paramètre. Le second exemple indique également comment appeler la méthode cancel() pour annuler un appel de service HTTP.

<?xml version="1.0"?>
<!-- fds\Rpc\RPCSend.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <!--CDATA[ public function callService():void {
            // Cancel all previous pending calls.
            myService.cancel());
            var params:Object = new Object();
            params.params1 = 'val1';
            myService.send.params);
        } ]
    ]
</mx:Script>
    <mx:HTTPService
        id="myService"
        destination="Dest"
        useProxy="true"/>
    <!--HTTP service call with a send() method that takes a variable as its parameter. The value of the variable is an Object. -->
        <mx:Button click="myService.send({param1:'val1'})"; />
    <!--HTTP service call with an object as a send() method parameter that provides query parameters. -->
        <mx:Button click="callService();"/>
</mx:Application> 

Liaison de paramètres avec les composants RemoteObject

Lorsque you utilise la liaison de paramétres avec des composants RemoteObject, vous déclare toujours des méthodes dans la balise d'un objet RemoteObject.

Une balise peut conténir une balise contenant des balises infant pour les paramètres de la méthode. La propriété name d'une balise doit correspondre au nom d'une méthode du service. L'ordre des balises d'argument doit correspondre à celui des paramètres de méthode du service. Vous pouveznommer les balises d'argument de manière telle à ce que leurs noms correspondent le plus possible aux noms réels des paramètres de méthode correspondants, mais cela n'est pas nécessaire.

Remarque: si les balises d'argument dans une balise portent le même nom, les appeals de service échouent si la méthode distante n'attend pas un tableau comme unique source d'entrée. Aucun averissement à ce sujet n'est affché lorsque l'application est compliee.

Voupez lier des données aux parametes de methode d'un composant RemoteObject. Vou referencez les noms de balise des parametes en vue de la liaison et de la validation de données.

L'exemple suivant illustrer une méthode相对较ient deux paramètres liés à la propriété text des contrôleires TextInput. Un validateur手机号Validator est assigné à arg1, qui est le nom de la première balise d'argument.

<?xml version="1.0"?>
<!-- fds\rpc\RParamBind1.mxml.-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <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:TextInput id="text1"/>
    <mx:TextInput id="text2"/>
    <mx:PhoneNumberValidator source="{{ro.setDataarguments}" property="arg1"/> </mx:Application> 

Flex envoie les valeurs des balises d'argument à la méthode dans l'ordre spécifique par les balises MXML.

L'exemple suivant utilise la liaison de paramètres dans la balise d'un composant RemoteObject pour lier les données d'un élémentComboBox sélectionné à l'opération employeeRO.getList lorsque l'utilisateur clique sur un contrôle Button. La liaison de paramètres correspond à un appel de service par l'utilisation de la méthode send() sans paramètres.

<?xml version="1.0"?>
<!-- fds\rpc\RParamBind2.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" verticalGap="10">
    <mx:Script>
        <!-- CDATA[ import mx.controlssAlert; import mx.utilsArrayUtil; ]
    ]">
        </mx:Script>
    <mx:RemoteObject
        id="employeeRO"
        destination="roDest"
        showBusyCursor="true"
        fault="Alert.show(event.fault.faultString,'Error')"; />
    <mx:method name="getList">
        <mx:arguments>
            <deptId>{deptSelectedItem.data}</deptId>
        </mx:arguments>
    </mx:method>
</mx:RemoteObject>
<mx:ArrayCollection id="employeeAC"
source="/{ArrayUtil.toArray(employeeRO myList.lastResult)}"/>
<mx:HBox>
    <mx:Label text="Select a department:</mx:ComboBox id="dept" width="150">
        <mx:dataProvider>
    </mx:dataProvider>
</mx:RemoteObject
<mx:RemoteCursor>
    <mx:RemoteCursor>
        <mx:RemoteCursor>
        <mx:RemoteCursor>
            <mx:RemoteCursor>
                <mx:RemoteCursor>
                    <mx:RemoteCursor>
                        <mx:RemoteCursor>
                            <mx:RemoteCursor>
                                <mx:RemoteCursor>
                                    <mx:RemoteCursor>
                                          <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                                  <mx:RemoteCursor>
                                        <mx:RemoteCursor>
                                          <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                                  <mx:RemoteCursor>
                                        <mx:RemoteCursor>
                                             <mx:RemoteCursor>
                                        <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                        <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <mx:RemoteCursor>
                                            <nx:dataProvider>
<mx:ArrayCollection> <mx:source> <mx:Object label="Engineering" data="ENG"/> <mx:Object label="Product Management" data="PM"/> <mx:Object label="Marketing" data="MKT"/> </mx:source> </mx:ArrayCollection> </mx:dataProvider> </mx:ComboBox> <mx:Button label="Get Employee List" click="employeeRO.list().send()"/> </mx:HBox> <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> </mx:Application> 

Si you ignore si le résultat d'un appel de service contient un tableau ou un objet individuel, vous pouvez utiliser la méthode toArray() de la classe mx.util arrayUtil pour convertir le résultat en un tableau, comme l'indique cet exemple. Si vous transmettez la méthode toArray() à un objet individuel, il renvoie un tableau avec cet objet comme une éléments de tableau. Si vous transmettez un tableau à la méthode, elle renvoie le même tableau. Pour plus d'informations sur l'utilisation d'objects ArrayCollection, voir Data providers and collections.

Liaison de paramètres avec les composants HTTPService

Lorsqu'un service HTTP accepte des paramètres d'interrogation, vous pouvez les déclarer comme balises infant d'une balise . Les noms des balises doivent correspondre aux noms des paramètres d'interrogation auxquels s'attend le service.

L'exemple suivant illustrer la liaison de paramêtres dans la balise d'un composant HTTPService pour lier les données d'un élémentComboBox selectionné à la demande employeesrv lorsque l'utilisateur clique sur un contrôle Button. La liaison de paramêtres correspond à un appel de service par l'utilisation de la méthode send() sans paramêtres. Cet exemple présente une propriétéurl sur le composant HTTPService. La manière dont vous appelez un service est toutfois la même, que vous vous connectiez au service directement ou passiez par une destination.

<?xml version="1.0"?>
<!-- fds\rpc-HTppServiceParamBind.mxml. Compiles -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" verticalGap="20">
    <mx:Script>
        <!-- [CDATA[ import mx.utilsArrayUtil; ]
    ]">
        </mx:Script>
    </mx:HTTpservice
        id="employeeSrv"
        url="employees.jsp">
            <mx:request>
                <deptId>{deptSelectedItem.data}</deptId>
            </mx:request>
        </mx:HTTpservice>
    <mx:ArrayCollection
        id="employeeAC"
        source=
            "{ArrayUtil.toArray employeeSrv.lastResultemployees.employee)}"/>
    <mx:HBox>
        <mx:Label text="Select a department"/>
        <mx:ComboBox id="dept" width="150">
            <mx:dataProvider>
                <mx:ArrayCollection>
                    <mx:source>
                        <mx:Object label="Engineering" data="ENG"/>
                        <mx:Object label="Product Management" data="PM"/>
                        <mx:Object label="Marketing" data="MKT"/>
                    </mx:source>
                </mx:ArrayCollection>
            </mx:dataProvider>
        </mx:ComboBox>
        <mx:Button label="Get Employee List" click="employeeSrv.send();"/>
    </mx:HBox>
    <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>
</mx:Application> 

Pour vérifier si le résultat d'un appel de service contient un tableau ou un objet individuel, vous pouvez utiliser la méthode toArray() de la classe mx.utilArrayUtil afin de convertir le résultat en tableau, comme l'illustrer l'exemple précédent. Si vous transmettez la méthode toArray() à un objet individuel, il renvoie un tableau avec cet objet comme une éléments de tableau. Si vous transmettez un tableau à la méthode, elle renvoie le même tableau. Pour plus d'informations sur l'utilisation d'objets ArrayCollection, voir Data providers and collections.

Liaison de paramètres avec les composants WebService

Lorsque vous utilise la liaison de paramètres avec un composant WebService, vous déclarez toujours les opérations dans les balises du composant WebService. Une balise peut containir une balise compteant les nœuds XML auxquels s'attend l'opération. La propriété name d'une balise doit correspondre à l'un des noms de l'opération WebService.

Voupez lier des données aux parametes des operations WebService. Vou reforencez les noms de balise des parametes en vue de la liaison et de la validation de données.

L'exemple suivant illustrer comment la liaison de paramètres est utilisé dans la balise d'un composant WebService pourlier les données d'un élémentComboBox selectionné à l'opération employeeWS/List lorsquel l'utilisateur clique sur un contrôle Button. La balise correspond directement au paramètre deptId de l'opération myListList. La liaison de paramètres correspond à un appel de service par l'utilisation de la méthode send() sans paramètre. Cet exemple présente une propriété destination sur le composant WebService. La manière dont vous appelez un service est toute fois la même, que vous vous connectiez au service directement ou passiez par une destination.

<?xml version="1.0"?>
<!- fds\rpc\WebServiceParamBind.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" verticalGap="10">
    <mx:Script>
        <!-- CDATA[ import mx.utilArrayUtil; import mx.controlssAlert; ]
    } />
</mx:Script>
<mx:WebService
    id="employeeWS"
    destination="wsDest"
    showBusyCursor="true"
    fault="Alert.show(event.fault.faultString)">
        <mx:operation name="getList">
            <mx:request>
                <deptId>{deptSelectedItem.data}</deptId>
            </mx:request>
        </mx:operation>
</mx:WebService>
<mx:ArrayCollection
    id="employeeAC"
    source="/{EmployeeWS.getLastResult}" />
<mx:HBox>
    <mx:Label text="Select a department:" />
    <mx:ComboBox id="dept" width="150">
        <mx:dataProvider>
    </mx:dataProvider>
</mx:WebService> 

}

Vous pouvez aussi spécifique manuellement un corps de demande SOAP entier dans XML avec toutes les informations d'espace de noms correctement définies dans une balise . Pour ce faire, attribuez la valeur xml à l'attribut format de la balise , comme l'illustrer l'exemple suivant :

<?xml version="1.0"?>
<!- fds\rpc\WebServiceSOAPRequest.xml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" verticalGap="10">
    <mx:WebService id="ws" wsd1="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:xi= "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>
</mx:Application> 

Traitement des résultats des services

Après que le composant RPC a appelé un service, les données renvoyées par le service sont placées dans un objet lastResult. Par défaut, la valeur de la propriété résultat Format des composants HTTPService et des opérations du composant WebService est object et les données renvoyées sont représentées par une arborescence simple d'objets ActionScript. Flex interpréte les données XML renvoyées par un service Web ou HTTP pour représentier de manière appropriée les types de base, tels que String, Number, Boolean et Date. Pour utiliser des objets fortement typés, replisssez ces objets en utilisant l'arborescence d'objects créé par Flex.

Les composants WebService et HTTPService reivoient chacun des objets et des tableaux anonymes constituant des types complexes. Si make Objects Bindable a la valeur (par défaut) true, les objets sont enveloppés dans des instances mx.utils.ObjectProxy et les tableaux dans des instances mxcollectionsArrayCollection.

Remarque : ColdFusion n'est pas sensible à la casse et applique en interne la mise en majuscule à toutes ses données.

Gardez à l'esprit cette caractéristique lorsque vous utilisez un service Web ColdFusion.

Traitement des événements result et fault

Lorsqu'un appel de service est terminé, la méthode RemoteObject, l'opération WebService ou le composant HTTPService distribue un événement result ou un événement fault. Un événement result indique que le résultat est disponible. Un événement fault indique qu'une erreur s'est produit. L'événement result fait office de déclencheur de la mise à jour des propriétés liées à lastResult. Vous pouvez traiter les événements fault et result explicitement en ajoutant des écouteurs d'événement aux méthodes RemoteObject ou aux opérations WebService. Pour un composant HTTPService, vous pouvez spécifique les écouteurs d'événement result et fault sur le composant lui-même. Le composant HTTPService ne dispose en effet pas de plusieurs méthodes ou opérations.

Lorsque vous ne spécifie pas d'écouteurs pour les événements result ou fault sur une méthode RemoteObject ou une opération WebService, les événements sont transmis au niveau du composant. Vous pouvez spécifique des écouteurs pour les événements result et fault à niveau de composant.

Dans l'exemple MXML suivant, les événements result et fault d'une opération WebService spécifique les écouteurs d'évenement; l'évenement fault du composant WebService spécifique également un écouteur d'évenement:

<?xml version="1.0"?>
<!-- fds\Rpc\RPCResultFaultXML.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <!-- CDATA>
            import mx.rpc.soap.SOAPFault;
            import mx.rpc.events.ResultEvent;
            import mx.rpc.events.FaultEvent;
            import mx.controlssAlert;
            public function showErrorDialog(event:FaultEvent):void {
                // Handle operation fault.
                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.
        }
    }
</mx:Script>
<! [CDATA]
    import mx.rpc.soap.SOAPFault;
    import mx.rpc.events.ResultEvent;
    import mx.rpc.events.FaultEvent;
    import mx.controlssAlert;
    public function showErrorDialog(event:FaultEvent):void {
        // Handle operation fault.
        Alert.show(event.fault.faultString, "Error");
    }
</mx:Script>
<! [CDATA]
    import mx.rpc.soap.SOAPFault;
    import mx.rpc.events.ResultEvent;
    import mx.controlssAlert;
    public function showErrorDialog(event:FaultEvent):void {
        // Handle operation fault.
        Alert.show(event.fault.faultString, "Error");
    }
</mx:Script>
<! [CDATA]
    import mx.rpc.soap.SOAPFault;
    import mx.rpc.events.ResultEvent;
    import mx.controlssAlert;
    public function showErrorDialog(event:FaultEvent):void {
        // Handle operation faults
        Alert.show(event.fault.faultString, "Error");
    }
</mx:Script>
<! [CDATA]
    import mx.rpc.soap.SOAPFault;
    import mx.rpc.events.ResultEvent;
    import mx.controlssAlert;
    public function showErrorDialog(event:FaultEvent):void {
        // Handle operation faults
        Alert.show(event.fault.faultString, "Error");
    }
</mx:Script>
<! [CDATA]
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5 
} Alert.show(event fault.faultString, "Error"); } public function log(event:ResultEvent):void { // Handle result. } ]]> </mx:Script> <mx:WebService id="WeatherService" wSDL="http://myserver:8500/flexapp/app1.cfc?wSDL" fault="defaultFault(event)" > <mx:operation name="GetWeather" fault="showErrorDialog(event)" result="log(event)" > <mx:request> <ZipCode>{myZip.text}</ZipCode> </mx:request> </mx:operation> </mx:WebService> <mx:TextInput id="myZip"/> </mx:Application> 

Dans l'exemple ActionScript suivant, un écouteur d' événement result est ajouté à une opération WebService. Un écouteur d' événement fault est ajouté au composant WebService :

<?xml version="1.0"?>
<!- fds\rpc\RPCResultFaultAS.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx: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();
        wsdestination = "wsDest";
        wsEchoArgs.addEventListener("result", echoResultHandler);
        ws.addEventListener("fault", faultHandler);
        ws.loadWSDL();
        ws.echoArgs(intArg, strArg);
    }
</mx: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();
    wsdestination = "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 echoed; var retInt:int = event,result echoed; //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. //... } } ]]>

Voupez ealement utilise 1evenement mx.rpc.events.InvokeEvent pour indiquer lorsqu'une requete de composant d'acces aux données a ete invoquee. Cela est utile si les opérations sont placees en file d'attente et invoquees ulterieurement.

Traitement de résultats en tant que données XML avec le format de résultat E4X

Vous pouvez définir la propriété resultFormat des composants HTTPService et des opérations WebService sur la valeur e4x pour creer une propriété lastResult de type XML. Vous pouvez acceder à la propriété lastResult en utilisant ECMAScript pour les expressions XML (E4X). Vous n'incluez pas le noeud racine de la structure XML dans la notation par point lorsque vous utilisez un objet XML E4X dans une expression de liaison. Cela differe de la syntaxe d'une propriété lastResult définié sur object pour lequel vous devez inclure le noeud racine de la structure XML dans la notation par point. Par exemple, lorsque la propriété lastResult est définié sur e4x , vous utilisez {srv.lastResult.product}; lorsque la propriété lastResult est définié sur object, vous utilisez {srv.lastResult/products.product}.

L'utilisation du format de résultat e4x est à privilégier pour travailler directement dans XML. Vous pouze toute fois également définir la propriété résultat Format sur xml pour creer un objet lastResult de type flash.xml.XMLNode, qui est l'objet existant pour utiliser XML. De plus, vous pouze définir la propriété résultat Format des composants HTTPService sur flashvars ou text pour creer des résultats en tant qu'objets ActionScript contenant des paires nom-valeur ou en tant que texte brut, respectivement.

Remarque : pour appliquer la syntaxe E4X aux résultats de service, vousdez édifnir la propriété résultat Format du composant HTTPService ou WebService sur e4x. La valeur par défaut est object.

Lorsque vous définisse la propriété résultat Format d'un composant HTTPService ou d'une opération WebService sur e4x , vous devrez eventuellement Traitser les Informations d'espace de noms contenues dans le code XML renvoyé. Pour un composant WebService, les informations d'espace de noms sont contenues dans le corps de l'enveloppe SOAP renvoyée par le service Web. L'exemple suivant présente une partie d'un corps SOAP contenant des informations d'espace de noms. Ces données ont ete renvoyees par un service Web qui obtient des cotes de titres. Les informations d'espace 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>&lt;/big&gt;;&lt;/b&gt;35.90&lt;/b&gt;;&lt;/big&gt;,&lt;/Price>   
</soap:Body> 

Comme le corps soap: Body contient des informations d'espace de noms, si vous définisse la propriété résultat Format de l'opération WebService sur e4x , créez un objet d'espace de noms pour l'espace de noms http://ws.invesbot.com/.

L'exemple suivant présente une application effectuant cette opération :

<?xml version="1.0"?>
<!- fds\rpc\WebServiceE4XResult1.xml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*/
pageTitle="Test">
<mx:Script>
    <!-- CDATA[ import mx.controlssAlert; private namespace invesbot = "http://ws.invesbot.com/"; use namespace invesbot; ]
]">
</mx:Script>
<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>
<mx:HBox>
    <mx:Button label="Get Quote" click="WS.GetQuote.send()"/>
    <mx:Text
        text=("WS.GetQuote.lastResult.GetQuoteResult.StockQuote.Price"/>
    </mx:HBox>
</mx:Application> 

Si vous le souhaitez, vous peuvent creer une variable pour un espace de noms et y acceder dans une liaison au résultat de service, comme l'illustrtre l'exemple suivant :

<?xml version="1.0"?>
<!- fds\rpc\WebServiceE4XResult2.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*/
pageTitle="Test">
<mx:Script>
    <!-- CDATA[ import mx.controlssAlert; public var invesbot:Namespace = new Namespace("http://ws.invesbot.com/")); ]
</mx:Script>
<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>
<mx:HBox>
    <mx:Button label="Get Quote" click="WS.GetQuote.send()"/>
    <mx:Text
        text=("WS.GetQuote.lastResult.invesbot::GetQuoteResult.StockQuote.Price"/>
    </mx:HBox>
</mx:Application> 

Utilisez la syntaxe E4X pour acceder aux éléments et aux attributs des données XML renvoyées dans un objet lastResult. La syntaxe varie en fonction de la présence ou non d'un ou de plusieurs espaces de noms déclarés dans les données XML.

Aucun espace de noms

L'exemple suivant indique comment obtenir une valeur d'objet ou d'attribut lorsqu'aucun espace de noms n'est spécifique sur l'objet ou l'attribut :

var attributes:XMLList = XML(event,result).Description.value;

Le code précédent renvoie xxx pour le document XML suivant :

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" Description> <value>xxx</value> </Description> </RDF> 

Tout espace de noms

L'exemple suivant indique comment obtenir une valeur d'objet ou d'attribut lorsqu'un espace de noms qualconque est spécifique sur l'objet ou l'attribut :

var attributes:XMLList = XML(event.result).*:Description.*::value; 

Le code précédent renvoie xxx pour l'un des documents XML suivants :

Premier document XML :

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" <rdf:Description> <rdf:value>xxx</rdf:value> </rdf:Description> </rdf:RDF> 

Deuxieme document XML :

<rdf:RDF xmlns:rfd="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cm="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <cm:Description>
        <rdf:value>xxx</rdf:value>
    </cm:Description>
</rdf:RDF> 

Espace de nombres spécifique

L'exemple suivant indique comment obtenir une valeur d'objet ou d'attribut lorsqu'lespace de noms RDF déclaré est spécifique sur l'objet ou l'attribut :

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; 

Le code précédent renvoie xxx pour le document XML suivant :

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" <rdf:Description> <rdf:value>xxx</rdf:value> </rdf:Description> </rdf:RDF> 

L'exemple suivant présente une autre manière d'obtenir une valeur d'élement ou d attribut lorsqu'el'espace de noms rdf déclaré est spécifique sur un élément 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; 

Le code précédent revoie également xxx pour le document XML suivant :

<rdf:RDF xmlns:rfd="http://www.w3.org/1999/02/22-rdf-syntax-ns#" <rdf:Description> <rdf:value>xxx</rdf:value> </rdf:Description> </rdf:RDF> 

Traitement de résultats de service Web contenant des objets DataSet ou DataTable .NET

Les services Web écrites avec la structure Microsoft .NET peuvent renvoyer au client des objets DataSet ou DataTable .NET spéciaux. Un service Web .NET fournit un document WSDL basique sans informations sur le type de données qu'il manipule. Lorsque le service Web renvoie un objet DataSet ou DataTable, les informations sur le type de données sont incorporeées dans un élément de schéma XML dans le message SOAP, qui indique comment le reste du message doit être traité. Pourtraiter au moins les résultats de ce type de service Web,définissez la propriété résultat Format d'une opération WebService Flex sur object. Vous pouvez également définir la propriété résultatFormat de l'opération WebService sur e4x. Les formats XML et e4x ne sont toutefois pas adaptations à la structure inhabituelle de la réponse et la liaison des données (par exemple à un contrôle DataGrid) nécessite l'implémentation de solutions de contournancement.

La définition de la propriété résultat Format d'une opération WebService Flex sur object entraine la conversion automatique des DataTable ou DataSet renvoyés par un service Web .NET en objets propertié une propriété Tables, qui contient le mappye d'un ou de plusieurs objets DataTable. Chaque objet DataTable du mappye Tables contient deux propriétés : Columns et Rows. La propriété Rows contient les données. L'objet event,result obtient les propriétés suivantes correspondant aux propriétés DataSet et DataTable dans .NET. Les tableaux d'objets DataSet ou DataTable comportent les mêmes structures que celles décrites ici, mais sont imbriqués dans un tableau de niveau supérieur sur l'objet de résultat.

PropriétéDescription
result.TablesMappage des noms de tableaux à des objets contenant des données de tableaux.
result.Tables["someTable"].ColumnsTableau des noms des colonnes suivant l'ordre spécifique dans le schéma DataSet ou DataTable pour le tableau.
result.Tables["someTable"].RowsTableau d'objets représentant les données de chaque ligne du tableau, par exemple {columnName1:value,columnName2:value,columnName3:value}.

L'application MXML suivant rensigne un contrôle DataGrid avec les données DataTable renvoyees par un service Web .NET.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns="*" xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:WebService
        id="nwCL"
        wsdl="http://localhost/data/CustomerList.asmx?wsdl"
        result="onResult(event)"
        fault="onFault(event)" />
    <mx:Button label="Get Single DataTable" click="nwCL.getSingleDataTable(){
        <mx:Button label="Get MultiTable DataSet" click="nwCL.getMultiTableDataSet(){
            <mx:Panel id="dataPanel" width="100%" height="100%" title="Data Tables"/>
        } 
    <mx:Script>
        <!-- CDATA>
            import mx.controlss ALERT;
            import mx.controlss.DataGrid;
            import mxrpc.events.FaultEvent;
            import mxrpc.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.removeAllChildren();
            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: 

varnamedTable:Object = event(result.Tables.Customers; //displayable(namedTable); }
}
private function displayTable(tb1: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 tb1_ROWS; 1 private function onFault(event:FaultEvent):void { Alert.show(event fault.toString()); } ]]]>

L'exemple suivant illustrer la classe .NET C#. Cette classe est l'implémentation back-end du service Web appelée par l'application et utilise la base de données modèle Microsoft SQL Server Northwind :

:
<@ WebService Language = "C#" Class "CustomerList" %>
using System.Web;
using System.Web.Services;
using System.Web.Services.Proocols;
using System.Web.Services.Description;
using System.Data;
using System.Data.SqlClient;
using System;
public class CustomerList : WebService { [WebMethod] publicDataTable getSingleDataTable() { string cnStr = ["Your_Database_Connection_String"]; string query = "SELECT TOP 10 * FROM Customers"; SqlConnection cn = new SqlConnection(cnStr); cn.Open(); SqlConnection adpt = new SqlDataAdapter(new SqlCommand(query, cn));DataTable dt = newDataTable("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(); SqlConnection adpt = new SqlConnection(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; }

Sommaire Cliquez un titre pour y accéder
Assistant notice
Powered by Anthropic
En attente de votre message
Informations produit

Marque : ADOBE

Modèle : FLEX 4.6

Catégorie : Développement d'applications web