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
GET
iPOST
są 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: