ActionScript 3
Skicka och ta emot data från servrar
Sök…
Gör en förfrågan från Flash
URLRequest
och URLLoader
klasserna arbetar tillsammans för att göra förfrågningar från Flash till externa resurser. URLRequest
definierar information om begäran, t.ex. förfrågningsorganet och typ av förfrågningsmetod, och URLLoader
refererar till detta för att utföra den faktiska begäran och ger ett sätt att bli meddelad när ett svar tas emot från resursen.
Exempel:
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.
}
Lägga till variabler till din begäran
I klassen URLVariables
kan du definiera data som ska skickas tillsammans med en URLRequest
.
Exempel:
var variables:URLVariables = new URLVariables();
variables.prop = "hello";
variables.anotherProp = 10;
var request:URLRequest = new URLRequest('http://someservice.com');
request.data = variables;
Du kan antingen skicka förfrågan via en URLLoader
eller öppna förfrågningsadressen med variablerna bifogade i frågesträngen med navigateToURL
.
Ändra HTTP-metoden (GET, POST, PUT, etc)
URLRequestMethod
klassen innehåller konstanter för de olika förfrågningstyper du kan skapa. Dessa konstanter är tilldelas URLRequest
s method
egenskap:
var request:URLRequest = new URLRequest('http://someservice.com');
request.method = URLRequestMethod.POST;
Observera att endast
GET
ochPOST
är tillgängliga utanför AIR-körtiden.
Min svardata är alltid noll, vad betyder "asynkron"?
När Flash gör en begäran om data från en extern källa, är den operationen asynkron . Den mest grundläggande förklaringen av vad detta betyder är att data laddas "i bakgrunden" och utlöser händelseshanteraren du tilldelar Event.COMPLETE
när den Event.COMPLETE
emot. Detta kan hända när som helst under din ansökan.
Dina data kommer INTE att finnas tillgängliga omedelbart efter att du har URLLoader
load()
på din URLLoader
. Du måste bifoga en händelse lyssnare för Event.COMPLETE
och interagera med svaret där.
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.
Du kan inte komma runt detta med några små trick som att använda setTimeout
eller liknande:
setTimeout(function() {
trace(loader.data); // Will be null if the data hasn't finished loading
// after 1000ms (which you can't guarantee).
}, 1000);
Cross-domain-förfrågningar
Flash laddar inte data från en annan domän än den som din applikation kör om inte den domänen har en XML-korsdomänspolicy antingen i roten till domänen (t.ex. http://somedomain.com/crossdomain.xml
) eller någonstans som du kan rikta in sig med Security.loadPolicyFile()
. Filen crossdomain.xml är där du kan ange domäner som kan be din server om data från ett Flash-program.
Exempel på det mest tillåtna korsdomänet.xml:
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
Observera att detta exempel inte ska användas i produktionsmiljöer , använd en mer restriktiv instans.
Ett mer restriktivt specifikt crossdomain.xml ser ut så här till exempel:
<?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>
Resurser: