Faire du remoting en AS3
Par Cédric Tabin le lundi 17.03.2008, 21:00 - ActionScript - Lien permanent
Le remoting consiste à transmettre des objets complexes d'un langage vers un autre via le protocole AMF.
Adobe nous fournissait déjà les outils pour le faire en AS2, et c'est pareil en AS3. De plus, grâce à la dernière version d'amfphp (1.9 beta2), le mécanisme est très facile ! Voici donc un petit tutoriel pour faire du remoting avec AS3 et PHP !
Coté serveur
La structure des fichiers d'amfphp est composée des dossiers suivants :
- core : tout ce qui est du moteur.
- browser : pour accéder aux services en ligne.
- services : la où les services sont stockés (un dossier 'vo' doit être créé pour les classes).
Pour commencer, voici la structure de la classe Person (avec le chemin amfphp/services/vo/Person.php) :
<? class Person { public $name; public $adress; public $id; } ?>
Il suffit ensuite de créer un service Sample pouvant envoyer et reçevoir des objets Person (amfphp/services/Sample.php) :
<? include_once("vo/Person.php"); class Sample { public function modifyPerson($pValeur) { $pValeur->name .= " [Modified by service]"; return $pValeur; } } ?>
Pour terminer, il ne reste plus qu'à envoyer tout ce que contient le dossier amfphp en ligne. Une fois fait, le service Sample.modifyPerson est disponible pour le client flash.
Coté client
Pour commencer, il faut créer une classe mapping qui corresponde à la classe Person en php :
package { public class Person { public var name:String; public var adress:String; public var id:int; } }
Maintenant, afin que flash puisse envoyer/reçevoir correctement des instances de la classe Person, un mapping d'alias doit être créé :
[actionscript] registerClassAlias("Person", Person) ;
Il ne reste plus qu'à se connecter avec le serveur php. Cela se fait grâce à la classe flash.net.NetConnection :
var ncs:NetConnection = new NetConnection(); ncs.connect("http://www.astorm.ch/test/remoting/gateway.php");
Et il est ensuite très simple de faire appel au service Sample.modifyPerson :
registerClassAlias("Person", Person) ; var p:Person = new Person(); p.name = "Test"; p.adress = "TestAdress"; p.id = 52; function onResult(param:Person):void { trace("Received : "+param); } var ncs:NetConnection = new NetConnection(); ncs.connect("http://www.astorm.ch/test/remoting/gateway.php"); ncs.call( "Sample.modifyPerson", new Responder(onResult), p);
Ce qui affiche au final un "Object Person" avec les bonnes propriétés récupérées depuis PHP !
Commentaires
Merci beaucoup pour ces infos très claires qui me permettent de comprendre le concept du "class mapping".
M'enfin tu as un hébergement dédié toi?
Il faut que tu me donnes plus de détails :=)
Sinon très clair, merci.
Salut,
Non Ahmet, j'ai pas un serveur dédié (c'est un peu au-dessus de mes moyens :D), mais pour faire du remoting, tu n'en as pas besoin amfphp c'es tpas un dll pour apache, ce sont juste des classes php !
@++
Bonjour, bonjour cedric
Juste pour info concernant amfphp 1.9 il ne faut pas preciser l'objectEncoding ?
ncs.objectEncoding=ObjectEncoding.AMF0;
ou bien amfphp 1.9 accept l'amf3 ?
Salut Gauthier,
Visiblement, cela marche out of the box, sans préciser l'encoding En checkant un peu la doc, tu remarques que cela dépend en fait du serveur... amfphp supporte les deux encodages, donc aucun souci, mais si tu te connectes à du FMS2 par exemple, tu devras spécifier l'encodage ObjectEncoding.AMF0
@++
Salut Cédric,
est-ce que tu as lu l'article d'EKA sur les difficultés du class-mapping en as3?
http://www.ekameleon.net/blog/index...
qu'en penses tu?
Salut yox
Oui je l'ai lu et c'est vrai qu'il faut être conscient du problème de la désérialisation... Maintenant,ça dépend toujours de ce que tu veux faire et tu adapteras ton implémentation en conséquence (par exemple une méthode d'initialisation).
Je fais une présentation sur ça demain soir à l'AUGG, si tu viens, on peut en discuter un peu
@++
j'aimerai encore une fois vraiiiimennnt venir (surtout que j'adore amfphp, scomme ça) mais j'ai toujours le même souci... sam au boulot jusqu'à 22h30... j'essaie encore une fois de trouver d'la baby-sitteuse
tout d'bon
Je dois être à la masse parce que j'ai enregistrer
4 fichiers au total. les 2 premiers étant "Person.php" et "Sample.php".
Dans flash j'ai fait un point "as" nommé "Person.as" et dans un fla j'ai mis le reste du code et je l'ai appelé "registerClassAlias". Mais j'ai une erreur lors de la compilation.
Pourrias tu m'indiquer les noms des fichiers et leur extension.
Merci
C'est quoi ton erreur de compilation ?
sous flash voici l'erreur, je n'avais pas adapté toutes les lignes de ton code d'où mon erreur de compilation du départ. Je signale juste pour les débutant comme moi qu'il faut écrire sa classe (là où il y a le mot package) dans un fichier '.as' qui se trouvera dans le même répertoire que le '.fla' qui l'exécutera.
Cela fait donc j'ai une erreur :
"Error #2044: NetStatusEvent non pris en charge : level=error, code=NetConnection.Call.BadVersion
at authentication_fla::MainTimeline/frame1()"
Dans le navigateur sous localhost, j'ai deux types de messages selon le fichier. Soit "invalid AMF message" mais là encore en cherchant j'ai vu que les balises ouvrantes de ton code n'était pas "admise" dans ma version de php. Et vu que de suite je ne me souviens pas de l'endroit du php.ini où il faut faire la correction pour que ce soit permissif, j'ai complété.
Donc au final il n'y a que sous flash ou j'ai pas tout capter (même si je ne vois pas comment tu configure l'accès sous php, mais bon tant que ça marche)
Maintenant que j'ai revu la syntaxe et vérifié la validité des chemins, il ne trouve rien de mieux à me dire que ça :
"Fault : [object Object]
faultDetail : C:\wamp\www\amfphp\core\shared\app\BasicActions.php on line 53
faultString : The file {astorm/Sample1.php} exists and was included correctly but a class by that name could not be found in that file. Perhaps the class is misnamed.
correlationId :
faultCode : AMFPHP_CLASS_NOT_FOUND"
Sachant évidemment qu'il n'y a pas de fichier Basicactions mais bien un fichier Actions dans AMFphp.
Je vais me coucher peut-être la lumière viendra-t-elle demain pour l'instant j'ai pas d'idée mais merci de m'avoir répondu si vite
Bonjour,
j'ai regardé ce petit tuto bien sympathique et ma question est la suivante, au retour je tente de parser l'objet param par une boucle for et je n'obtiens aucun résultat alors que si j'adresse directement une requete sur param.name, param.adress... ca fonctionne.
// Boucle For
for each(var item in param)
{
trace(item);
}
Une idée ?
Merci
Tu as bien mis le registerClassAlias ???
Is it any better than Cooliris http://wiwapia.com/en/Cooliris? That works with Google image search pages and other supporting sites, as well as Flickr.