ActionScript 3
Wysyłanie i odbieranie danych z serwerów
Szukaj…
Składanie wniosku z Flasha
Klasy URLRequest i URLLoader współpracują ze sobą, aby wysyłać żądania z Flasha do zasobów zewnętrznych. URLRequest definiuje informacje o żądaniu, np. Treść żądania i typ metody żądania, a URLLoader odwołuje się do tego, aby wykonać rzeczywiste żądanie i zapewnić sposób powiadamiania, gdy odpowiedź zostanie otrzymana z zasobu.
Przykład:
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.
}
Dodawanie zmiennych do twojego żądania
Klasa URLVariables pozwala definiować dane, które mają być wysyłane wraz z URLRequest .
Przykład:
var variables:URLVariables = new URLVariables();
variables.prop = "hello";
variables.anotherProp = 10;
var request:URLRequest = new URLRequest('http://someservice.com');
request.data = variables;
Możesz albo wysłać żądanie przez URLLoader albo otworzyć URL żądania ze zmiennymi dołączonymi do kwerendy za pomocą navigateToURL .
Zmiana metody HTTP (GET, POST, PUT itp.)
Klasa URLRequestMethod zawiera stałe dla różnych typów żądań, które możesz wykonać. Te stałe należy przypisać do właściwości method URLRequest :
var request:URLRequest = new URLRequest('http://someservice.com');
request.method = URLRequestMethod.POST;
Należy pamiętać, że tylko
GETiPOSTsą dostępne poza środowiskiem wykonawczym AIR.
Moje dane odpowiedzi są zawsze zerowe, co oznacza „asynchroniczny”?
Gdy Flash wysyła żądanie danych z zewnętrznego źródła, operacja jest asynchroniczna . Najbardziej podstawowym wyjaśnieniem tego, co to oznacza, jest to, że dane Event.COMPLETE „w tle” i uruchamiają procedurę obsługi zdarzeń przypisaną do Event.COMPLETE po ich otrzymaniu. Może się to zdarzyć w dowolnym momencie życia aplikacji.
Twoje dane NIE BĘDĄ dostępne natychmiast po wywołaniu load() w URLLoader . Musisz dołączyć detektor zdarzeń dla Event.COMPLETE i interakcji z tam odpowiedzi.
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.
Nie można tego obejść za pomocą małych sztuczek, takich jak użycie setTimeout lub podobnego:
setTimeout(function() {
trace(loader.data); // Will be null if the data hasn't finished loading
// after 1000ms (which you can't guarantee).
}, 1000);
Żądania między domenami
Flash nie będzie ładował danych z domeny innej niż ta, na której działa twoja aplikacja, chyba że domena ma zasady crossdomain XML w katalogu głównym domeny (np. http://somedomain.com/crossdomain.xml ) lub w innym miejscu można celować za pomocą Security.loadPolicyFile() . Plik crossdomain.xml umożliwia określenie domen, które mogą prosić serwer o dane z aplikacji Flash.
Przykład najbardziej liberalnej crossdomain.xml:
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
Uwaga: tego przykładu nie należy używać w środowiskach produkcyjnych , należy użyć bardziej restrykcyjnej instancji.
Bardziej restrykcyjny plik crossdomain.xml będzie wyglądał następująco:
<?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>
Zasoby: