ActionScript 3
Invio e ricezione di dati dai server
Ricerca…
Fare una richiesta da Flash
Le classi URLRequest
e URLLoader
per rendere richieste da Flash a risorse esterne. URLRequest
definisce le informazioni sulla richiesta, ad esempio il corpo della richiesta e il tipo di metodo di richiesta, e l' URLLoader
riferimento a questa per eseguire la richiesta effettiva e fornire un mezzo per ricevere una notifica quando viene ricevuta una risposta dalla risorsa.
Esempio:
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.
}
Aggiunta di variabili alla tua richiesta
La classe URLVariables
consente di definire i dati da inviare insieme a un URLRequest
.
Esempio:
var variables:URLVariables = new URLVariables();
variables.prop = "hello";
variables.anotherProp = 10;
var request:URLRequest = new URLRequest('http://someservice.com');
request.data = variables;
È possibile inviare la richiesta tramite URLLoader
o aprire l'URL della richiesta con le variabili allegate nella query querys utilizzando navigateToURL
.
Modifica del metodo HTTP (GET, POST, PUT, ecc.)
La classe URLRequestMethod
contiene costanti per i vari tipi di richieste che è possibile creare. Queste costanti devono essere allocate alla proprietà del method
URLRequest
:
var request:URLRequest = new URLRequest('http://someservice.com');
request.method = URLRequestMethod.POST;
Si noti che solo
GET
ePOST
sono disponibili al di fuori del runtime AIR.
I miei dati di risposta sono sempre nulli, cosa significa "asincrono"?
Quando Flash inoltra una richiesta di dati da un'origine esterna, quell'operazione è asincrona . La spiegazione più semplice di ciò che significa è che i dati vengono caricati "in background" e attivano il gestore eventi che si assegna a Event.COMPLETE
quando viene ricevuto. Questo può accadere in qualsiasi momento della vita della tua applicazione.
I tuoi dati NON saranno disponibili immediatamente dopo aver chiamato load()
sul tuo URLLoader
. È necessario collegare un listener di eventi per Event.COMPLETE
e interagire con la risposta c'è.
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.
Non puoi aggirare questo con qualche piccolo trucco come usare setTimeout
o simili:
setTimeout(function() {
trace(loader.data); // Will be null if the data hasn't finished loading
// after 1000ms (which you can't guarantee).
}, 1000);
Richieste interdominio
Flash non caricherà i dati da un dominio diverso da quello su cui è in esecuzione l'applicazione, a meno che tale dominio non abbia una politica di dominio XML nella radice del dominio (ad esempio http://somedomain.com/crossdomain.xml
) o da qualche parte può targetizzare con Security.loadPolicyFile()
. Il file crossdomain.xml è dove puoi specificare domini che sono in grado di chiedere dati al tuo server da un'applicazione Flash.
Esempio del crossdomain.xml più permissivo :
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
Nota che questo esempio non deve essere usato negli ambienti di produzione , usa un'istanza più restrittiva.
Ad esempio, un crossdomain.xml specifico più restrittivo sarà simile a questo:
<?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>
risorse: