ActionScript 3
Envoi et réception de données à partir de serveurs
Recherche…
Faire une demande à partir de Flash
Les classes URLRequest
et URLLoader
fonctionnent ensemble pour faire des demandes à partir de Flash vers des ressources externes. Le URLRequest
définit des informations sur la demande , par exemple le corps de la demande et le type de méthode de demande, et les URLLoader
références ceci pour effectuer la demande réelle et fournir un moyen de notification quand une réponse est reçue à partir de la ressource.
Exemple:
var request:URLRequest = new URLRequest('http://stackoverflow.com');
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, responseReceived);
loader.load(request);
function responseReceived(event:Event):void {
trace(event.target.data); // or loader.data if you have reference to it in
// this scope.
}
Ajout de variables à votre demande
La classe URLVariables
vous permet de définir des données à envoyer avec une URLRequest
.
Exemple:
var variables:URLVariables = new URLVariables();
variables.prop = "hello";
variables.anotherProp = 10;
var request:URLRequest = new URLRequest('http://someservice.com');
request.data = variables;
Vous pouvez envoyer la demande via un URLLoader
ou ouvrir l'URL de la demande avec les variables associées à la chaîne de requête à l'aide de navigateToURL
.
Modifier la méthode HTTP (GET, POST, PUT, etc.)
La classe URLRequestMethod
contient des constantes pour les différents types de requêtes que vous pouvez créer. Ces constantes doivent être allouées à la propriété de method
URLRequest
:
var request:URLRequest = new URLRequest('http://someservice.com');
request.method = URLRequestMethod.POST;
Notez que seuls
GET
etPOST
sont disponibles en dehors du moteur d'exécution AIR.
Mes données de réponse sont toujours nulles, que signifie "asynchrone"?
Lorsque Flash effectue une demande de données depuis une source externe, cette opération est asynchrone . L'explication la plus simple de ce que cela signifie, c'est que les données sont chargées "en arrière-plan" et déclenche le gestionnaire d'événements que vous Event.COMPLETE
à Event.COMPLETE
lorsqu'il est reçu. Cela peut arriver à n'importe quel moment de la vie de votre application.
Vos données ne seront PAS disponibles immédiatement après avoir appelé load()
sur votre URLLoader
. Vous devez joindre un écouteur d'événement pour Event.COMPLETE
et interagir avec la réponse.
var request:URLRequest = new URLRequest('http://someservice.com');
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, responseReceived);
loader.load(request);
trace(loader.data); // Will be null.
function responseReceived(event:Event):void {
trace(loader.data); // Will be populated with the server response.
}
trace(loader.data); // Will still be null.
Vous ne pouvez pas contourner cela avec de petites astuces comme l'utilisation de setTimeout
ou similaire:
setTimeout(function() {
trace(loader.data); // Will be null if the data hasn't finished loading
// after 1000ms (which you can't guarantee).
}, 1000);
Requêtes interdomaines
Flash ne chargera pas de données d'un domaine autre que celui sur lequel votre application s'exécute, à moins que ce domaine ne dispose d'une stratégie de crossdomain XML dans la racine du domaine (par exemple, http://somedomain.com/crossdomain.xml
) ou dans un emplacement que vous peut cibler avec Security.loadPolicyFile()
. Le fichier crossdomain.xml est l'endroit où vous pouvez spécifier des domaines capables de demander à votre serveur des données provenant d'une application Flash.
Exemple du crossdomain.xml le plus permissif :
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
Notez que cet exemple ne doit pas être utilisé dans des environnements de production , utilisez une instance plus restrictive.
Un crossdomain.xml spécifique plus restrictif ressemblera à ceci par exemple:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only" />
<allow-access-from domain="*.domain.com" to-ports="80,843,8011" />
<allow-access-from domain="123.123.123.123" to-ports="80,843,8011" />
</cross-domain-policy>
Ressources: