Flash Builder 4 Débutant ? Découvrez Flex 4 et Adobe® Flash® Builder 4
25
juin
08

Flex HTTPService – HTTPService en ActionScript, Remote Proxy

Bien que la façon la plus simple et la plus rapide d'utiliser l'objet HTTPService est de le créer en MXML, cette technique est préférable pour les applications non-entreprise dans lesquels les scénarios de communication sont assez simples. Cependant, pour des applications ayant des exigences plus importantes, il est préférable d'utiliser les remote proxies. Puisque les composants HTTPService proposent de grands avantage d'un point de vue conversion de données (comme la sérialisation de data), c'est une bonne idée d'utiliser un objet HTTPService à l'intérieur d'un remote proxy. Cependant, il est généralement nécessaire de travailler ensuite avec le composant HTTPService entièrement en ActionScript, y compris la construction de l'objet et la récupération des réponses.

Si vous travaillez avec des objets HTTPService entièrement en ActionScript, vous devrez importer la classe mx.rpc.http.HTTPService. Vous pouvez ensuite en construire une nouvelle instance en utilisant l'instruction "new":

var httpService:HTTPService = new HTTPService();

Vous pouvez ensuite fixer la propriété "url":

httpService.url = "data.txt";

Tout comme vous écouteriez les événements d'un objet, vous avez besoin d'ajouter des listeners aux objets HTTPService en utilisant addEventListener(). Les objets HTTPService lancent des événements de type ResultEvent quand une réponse est retournée, et ils lancent des événements de type FaultEvent quand une erreur est retournée par le serveur. Les classes ResultEvent et FaultEvent sont dans le package mx.rpc.events.package:

httpRequest.addEventListener(ResultEvent.RESULT, resultHandler);

L'exemple suivant utilise l'approche recommandée des remote proxy en conjonction avec HTTPService. Cet exemple accomplit la même chose que le tutorial Flex HTTPService - Envoyer des paramètres avec la propriété request qui est lui fait en MXML. Cependant cet exemple utilise plusieurs classes pour le faire.

La première classe est une simple classe modèle de donnée appelée ApplicationDataModel.as:

package{
	import mx.collections.ListCollectionView;

	public class ApplicationDataModel{

		private static var _instance:ApplicationDataModel;

		private var _countryNames:ListCollectionView;
		private var _statesNames:ListCollectionView;

		[Bindable]
		public function set countryNames(value:ListCollectionView):void{
			_countryNames = value;
		}

		public function get countryNames():ListCollectionView{
			return _countryNames;
		}

		[Bindable]
		public function set statesNames(value:ListCollectionView):void{
			_statesNames = value;
		}

		public function get statesNames():ListCollectionView{
			return _statesNames;
		}	

		public function ApplicationDataModel(){}

		public static function getInstance():ApplicationDataModel{
			if(_instance == null){
				_instance = new ApplicationDataModel();
			}
			return _instance;
		}
	}
}

Dans l'extrait de code suivant, on définit StatesService, qui est le remote proxy qui charge la donnée XML en utilisant HTTPService. Cette classe définit deux méthodes de service: getCountries() et getStates(). Quand les résultats sont retournés par l'appel au service, ils sont assignés au modèle de donnée:

 package{

	import mx.rpc.http.HTTPService;
	import mx.rpc.events.ResultEvent;
	import mx.collections.ListCollectionView;
	import ApplicationDataModel;
	import mx.collections.XMLListCollection;

	public class StatesService{

		private var _service:HTTPService;

		public function StatesService(){
			_service = new HTTPService();
			_service.resultFormat= "e4x";
		}

		public function getCountries():void{
			_service.addEventListener(ResultEvent.RESULT, countriesResultHandler);
			_service.url = "http://www.rightactionscript.com/states/xml/countries.xml";
			_service.send();
		}

		public function getStates(country:String):void{
			_service.addEventListener(ResultEvent.RESULT, statesResultHandler);
			_service.url = "http://www.rightactionscript.com/states/xml/states.php?country="+country;
			_service.send();
		}

		public function countriesResultHandler(event:ResultEvent):void{
			_service.removeEventListener(ResultEvent.RESULT, countriesResultHandler);
			ApplicationDataModel.getInstance().countryNames = new XMLListCollection(_service.lastResult.children() as XMLList);
		}

		public function statesResultHandler(event:ResultEvent):void{
			_service.removeEventListener(ResultEvent.RESULT, statesResultHandler);
			ApplicationDataModel.getInstance().statesNames = new XMLListCollection(_service.lastResult.children() as XMLList);
		}

	}
}

Et enfin, l'application MXML qui utilise ces deux classes:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	verticalAlign="middle" horizontalAlign="center"
	creationComplete="creationCompleteHandler(event)" viewSourceURL="srcview/index.html">
	<mx:Script>
		<![CDATA[
			import mx.rpc.http.HTTPService;
			import mx.rpc.events.ResultEvent;

			private var _statesService:StatesService;

			private function creationCompleteHandler(event:Event):void{
				_statesService = new StatesService();
				_statesService.getCountries();
			}
		]]>
	</mx:Script>

	<mx:Panel title="Services HTTPServices"
		paddingBottom="30" paddingLeft="30" paddingRight="30" paddingTop="30">
		<mx:Label text="Choisir le pays"/>
		<mx:ComboBox id="countryMenu" dataProvider="{ApplicationDataModel.getInstance().countryNames}"
			 change="_statesService.getStates(countryMenu.selectedLabel)"/>
		<mx:Label text="Choisir l'état"/>
		<mx:ComboBox dataProvider="{ApplicationDataModel.getInstance().statesNames}"/>
	</mx:Panel>
</mx:Application>

Dans cet exemple, une instance de StatesService est créée, et getCountries() est appelée immédiatement. La première ComboBox est data-bindée sur la propriété "countryNames" du data model. Quand l'utilisateur sélectionne une valeur dans la première ComboBox, elle appelle getStates(), en lui passant en paramètre le pays sélectionné. La seconde ComboBox est data-bindée à la propriété "statesNames" du data model.

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 9



Autres Tutoriaux Flex liés:

5 Réponses à “Flex HTTPService – HTTPService en ActionScript, Remote Proxy”


  1. 1 Gouma août 15th, 2009 at 15:26

    Bonjour

    voici mon souci
    je veux qu' en cliquant sur ne image de la TileList le contenu de selectItem se transmette via un HTTPService à une page php qui va chercher la grande image.

    voici le code:

    MXML:
    1. <mx:Script>
    2. <![CDATA[
    3.  
    4. //chargement des images au demarrage
    5. private function creationCompleteHandler(event:Event):void {
    6.             TileListModelService.send();
    7.            
    8.             }
    9.         ]]>
    10. </mx:Script>
    11.  
    12. <!-- service à executer lorsqu'on clique sur une images de la TileListe -->
    13. <mx:HTTPService id="photoService" url="http://127.0.0.1/facestyler/services/hairStyleModel.php"
    14.          resultFormat="e4x"/>
    15.  
    16. <!-- service de chargement d'images au demarrage -->
    17.  <mx:HTTPService id="TileListModelService" url="modelList.xml" resultFormat="e4x"/>
    18.  
    19.        
    20.  <mx:TileList id="AppSelection" width="134" height="442" color="0x000000" columnWidth="116" maxColumns="1"  backgroundColor="#ffffff" borderColor="#999999"  y="30" x="10"
    21.             dataProvider="{TileListModelService.lastResult.photo}" itemRenderer="modelRenderer"  change="output.text =AppSelection.selectedItem.id"  />

    Ci-dessous le code du composant modelRenderer.mxml pour itemRenderer

    MXML:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%"
    3.      horizontalAlign="center" verticalAlign="middle">
    4.    
    5.     <mx:Image id="img" source="{data.@url}" horizontalCenter="0" verticalCenter="0" width="100" height="100"/>
    6. </mx:HBox>

    l''affichage de la grande image ici.

    MXML:
    1. <mx:Image id="main_hairStyle" x="44.5" y="0" source="{}" scaleContent="false" height="370" width="394.5"/>

  2. 2 fnicollet août 17th, 2009 at 13:00

    Bonjour,
    pour interroger votre 2e service, vous aurez besoin d'indiquer à ce service, quelle image a été cliquée et il va vous renvoyer l'URL de l'image en grande taille correspondante (je pense que c'est ce que vous tentez de faire). Pour cela, il va falloir envoyer un paramètre à votre service. Voici un exemple:
    http://www.flex-tutorial.fr/2008/06/25/flex-httpservice-envoyer-des-parametres-avec-la-propriete-request/
    Dans votre cas, vous aurez surement quelque chose du type photoService.send({myID:AppSelection.selectedItem.id});
    Il vous suffit ensuite de traiter le résultat ou bien d'utiliser le "lastResult" comme vous l'avez déjà fait pour l'autre service.

    Fabien

  3. 3 Gouma août 17th, 2009 at 14:36

    merci pour le coup de main
    ca marche impeccable

  4. 4 Fred85 déc 6th, 2009 at 15:37

    Bonjour.
    J'utilise un HTTPService pour interroger un serveur.
    Je transmets ma requête et lorsque je réceptionne la réponse, je n'arrive pas en mode debug à voir/savoir ou se trouve l'identifiant de session normalement contenu dans le header qui se trouve être nul... (enfin si je me perd pas.)
    Quand je regarde l'objet ResultEvent, l'objet Header est null.
    Voici le code source :

    Actionscript:
    1. private function handleActionEvent(evt: Event): void {
    2.    
    3.     httpAction.removeEventListener(FaultEvent.FAULT, handleActionEvent);
    4.     httpAction.removeEventListener(ResultEvent.RESULT, handleActionEvent);
    5.    
    6.     if(evt is ResultEvent) {
    7.         fieldResponse.text = (evt as ResultEvent).result.toString();
    8.         var test : String = new String(httpAction.lastResult as String);
    9.     } else if(evt is FaultEvent) {
    10.         fieldResponse.errorString = (evt as FaultEvent).fault.faultDetail;
    11.     }
    12.    
    13.     showTitleLoading(false);
    14. }

    Auriez vous une idée ?
    Je vous remercie d'avance.

    Fred85

  1. 1 Flex URLLoader - URLLoader en ActionScript, Remote Proxy - Adobe Flex Tutorial - Tutoriaux Flex Builder, MXML, ActionScript, AS3 Pingback on juin 25th, 2008 at 17:59

Laisser un commentaire

Si vous souhaitez poster du code ActionScript, mettez le entre des balises comme ceci [as]code[/as]. Pour du code MXML, mettez le dans des balises [mxml]code[/mxml]. Merci




Bientôt sur flex-tutorial.fr …

  • - Tutoriaux BlazeDS
  • - Composants Flex

tutorial flex tutorial flex

flex Adobe Air AFCS Data Filter Lib ToasterLib librairies AS3 Flex livres AS3 Flex

 

juin 2008
L Ma Me J V S D
« mai   juil »
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Catégories