ActionScript 3
Gegevens verzenden en ontvangen van servers
Zoeken…
Een verzoek indienen bij Flash
De klassen URLRequest
en URLLoader
werken samen om verzoeken van Flash aan externe bronnen in te dienen. De URLRequest
definieert informatie over de aanvraag, bijvoorbeeld de aanvraaginstantie en het type aanvraagmethode, en de URLLoader
verwijst hiernaar om de daadwerkelijke aanvraag uit te voeren en een manier te bieden om een melding te ontvangen wanneer een antwoord van de bron wordt ontvangen.
Voorbeeld:
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.
}
Variabelen toevoegen aan uw verzoek
Met de klasse URLVariables
kunt u gegevens definiëren die samen met een URLRequest
moeten worden verzonden.
Voorbeeld:
var variables:URLVariables = new URLVariables();
variables.prop = "hello";
variables.anotherProp = 10;
var request:URLRequest = new URLRequest('http://someservice.com');
request.data = variables;
U kunt de aanvraag verzenden via een URLLoader
of de aanvraag-URL openen met de variabelen in de querystring met behulp van navigateToURL
.
De HTTP-methode wijzigen (GET, POST, PUT, enz.)
De klasse URLRequestMethod
bevat constanten voor de verschillende verzoektypen die u kunt maken. Deze constanten moeten worden toegewezen aan de method
eigenschap van URLRequest
:
var request:URLRequest = new URLRequest('http://someservice.com');
request.method = URLRequestMethod.POST;
Merk op dat alleen
GET
enPOST
beschikbaar zijn buiten de AIR-runtime.
Mijn reactiegegevens zijn altijd nul, wat betekent "asynchroon"?
Wanneer Flash een verzoek indient voor gegevens van een externe bron, is die bewerking asynchroon . De meest elementaire verklaring van wat dit betekent is dat de gegevens "op de achtergrond" worden geladen en de gebeurtenishandler activeren die u aan Event.COMPLETE
toewijst wanneer deze worden ontvangen. Dit kan op elk moment tijdens de levensduur van uw toepassing gebeuren.
Uw gegevens ZULLEN NIET direct beschikbaar zijn nadat u load()
op uw URLLoader
. U moet een gebeurtenislistener voor Event.COMPLETE
en communiceren met de reactie daar.
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.
Je kunt dit niet omzeilen met kleine trucs zoals setTimeout
of iets dergelijks:
setTimeout(function() {
trace(loader.data); // Will be null if the data hasn't finished loading
// after 1000ms (which you can't guarantee).
}, 1000);
Cross-domein verzoeken
Flash laadt geen gegevens van een ander domein dan het domein waarop uw toepassing wordt uitgevoerd, tenzij dat domein een XML-crossdomain-beleid heeft in de root van het domein (bijvoorbeeld http://somedomain.com/crossdomain.xml
) of ergens dat u kan targeten met Security.loadPolicyFile()
. In het bestand crossdomain.xml kunt u domeinen opgeven die uw server om gegevens van een Flash-toepassing kunnen vragen.
Voorbeeld van het meest toegestane crossdomain.xml:
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
Merk op dat dit voorbeeld niet moet worden gebruikt in productieomgevingen , gebruik een beperktere instantie.
Een restrictiever specifiek crossdomain.xml ziet er bijvoorbeeld als volgt uit:
<?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>
Middelen: