Flash Remoting est une passerelle permettant d’échanger des données avec un serveur de manière ultra simplifiée tout en conservant les types de données.
Flash Remoting utilise un format binaire nommé ActionScript Message Format (AMF) permettant un gain de performances remarquable lors des échanges entre le serveur et Flash, le format AMF étant un format natif compressé du lecteur. Le développeur Flash appelle des méthodes distantes définies sur un service distant qui est en fait une classe PHP définie sur le serveur.
La puissance de Flash Remoting consiste dans la conversion automatique des données entre le serveur et le player Flash, autrement dit, plus aucune sérialisation des données, Remoting s’occupe de tout, vous passez un tableau à votre méthode distante, Remoting va convertir le tableau ActionScript en un tableau compatible PHP, une Date ne sera pas convertie automatiquement mais interprétée et passée en timestamp, mais il sera tout de même possible de renvoyer de PHP un objet Date à Flash en spécifiant le type retourné dans les attributs de la méthode dans le service distant.
Pourquoi pas XML ?
Le format XML permet de structurer vos données mais nécessite un travail au niveau du schéma de représentation des données. Les données n'étant pas compatible entre une application serveur et le player Flash, vous ne pourrez pas renvoyer un tableau PHP à Flash de manière transparente et inversement, il vous faudra à chaque fois sérialiser puis desérialiser le tableau, d'où l'intérêt du XML.
Flash Remoting permet de gérer la conversion des différents types d'objets automatiquement entre l'application serveur et le player Flash, tout cela au format AMF, ce qui permet une intérpretation des données beaucoup plus performante qu'un parse de chaîne de caractère (XML) qui necessiterait une sérialisation de la chaine vers un objet XML, un gain notable aussi bien au niveau performance que niveau bande passante utilisée. De plus Flash Remoting a la capacité de retourner à Flash des ressources mySQL sans aucun traitement à effectuer ;)
Pour utiliser Remoting et PHP nous utiliserons Amfphp, car les classes Remoting que vous ajoutez en installant les composants permettant la manipulation des données, les classes nécessaires à la connexion mais n’intègre pas les classes gérant la conversion des types entre Flash et le serveur pour cela vous pouvez utilisez Amfphp pour PHP, Fluorine pour .NET, OpenAMF pour Java, ou encore Flap pour Perl et Python. Voici un tableau détaillant les types correspondants entre ActionScript et PHP par exemple :
Voici un schéma expliquant le fonctionnement de Flash Remoting :
Amfphp installé sur votre serveur gère la conversion des données entre Flash et la classe PHP, AMPHP est gratuit et open-source, relativement léger il s’installe en quelques minutes sur votre serveur mutualisé ou dédié. Il est aussi possible d’appeler des WebServices avec AMFPHP, dans notre tutoriel nous utiliserons un service simple que nous créerons.
Le but de ce tutoriel est d’aborder Flash Remoting au terme de cette vidéo sous serez capable de vous connectez à une service distant et d’appeler une méthode sur ce service, nous n’aborderons pas les thèmes comme le débogage, ou encore l’optimisation de performances ou encore le design objet, mais simplement comment débuter avec Flash Remoting. Trois tutoriaux seront très bientôt disponible traitant du débogage avec Remoting, puis du Service Browser permettant un développement des services distants extrêmement simplifié, et enfin une explication avancée des différents attributs disponibles pour la propriété methodTable.
Attention : Pour bénéficier de l'encodage automatique des caractères spéciaux Français, veillez à bien décommenter la ligne suivante dans votre passerelle (gateway.php) comme ci dessous :
Erratum : Dans la partie 3, une petite etourderie m'a fait importer la classe PendingCall du paquetage mx.services.PendingCall lors de l'appel de méthode distante. Cette classe correspond en fait aux PendingCall utilisés lors d'appels de méthodes de WebServices, la classe correcte est mx.remoting.PendingCall ;)
Dans l'absolu ce n'est pas grave cela fonctionne aussi, mais mieux vaut utiliser mx.remoting.PendingCall qui correspond au vrai type de données ( vérifiez avec instanceof ).