Język ActionScript 3.0 udostępnia mechanizmy przeznaczone do wysyłania danych ze źródeł zewnętrznych. Te źródła mogą udostępniać treści statyczne, np. pliki tekstowe, lub dynamiczne, wygenerowane przez skrypt sieci Web. Dane mogą mieć różne formaty, a język ActionScript udostępnia funkcje przeznaczone do dekodowania i uzyskiwania dostępu do danych. W ramach procesu pobierania danych można wysyłać dane na serwer zewnętrzny.
Korzystanie z klasy URLRequest
Wiele interfejsów API służących do ładowania danych zewnętrznych wykorzystuje klasę URLRequest w celu zdefiniowania właściwości wymaganego żądania sieci.
Właściwości klasy URLRequest
Następujące właściwości obiektu URLRequest można ustawić w dowolnym zabezpieczonym obszarze izolowanym.
Właściwość
|
Opis
|
contentType
|
Typ zawartości MIME dowolnych danych wysyłanych za pomocą żądania URL. Jeśli nie zostanie ustawiona żadna wartość właściwości contentType, wówczas wartości są wysyłane jako
application/x-www-form-urlencoded
.
|
data
|
Obiekt zawierający dane, które będą przesyłane razem z żądaniem URL.
|
digest
|
Ciąg znaków jednoznacznie określający oznaczony składnik platformy Adobe, który ma być przechowywany w (lub pobierany z) pamięci podręcznej programu Adobe® Flash® Player.
|
method
|
Metoda żądania HTTP, np. GET lub POST. (Zawartość działająca w domenie zabezpieczeń aplikacji AIR może określać ciągi znaków inne niż
"GET"
lub
"POST"
jako właściwość
method
. Dozwolona jest dowolna komenda HTTP, a metoda
"GET"
jest metodą domyślną. Patrz
Zabezpieczenia w środowisku AIR
).
|
requestHeaders
|
Tablica nagłówków żądania HTTP, które mają być dołączone do żądania HTTP. Uprawnienia do niektórych nagłówków są ograniczone w treściach środowisk Flash Player i AIR działających poza zabezpieczonym obszarem izolowanym aplikacji.
|
url
|
Określa żądany adres URL.
|
W środowisku AIR można ustawić dodatkowe właściwości klasy URLRequest, które będą dostępne tylko dla treści środowisk AIR działających w zabezpieczonym obszarze izolowanym aplikacji. Treść w obszarze izolowanym aplikacji może także definiować adresy URL przy użyciu nowych schematów URL (oprócz schematów standardowych, takich jak
file
i
http
).
Właściwość
|
Opis
|
followRedirects
|
Określa, czy śledzone są przekierowania (
true
— wartość domyślna) czy nie (
false
). Ta możliwość występuje tylko w obszarze izolowanym aplikacji AIR.
|
manageCookies
|
Określa, czy stos protokołu HTTP zarządza plikami cookie (
true
— wartość domyślna) lub nie (
false
) w danym żądaniu. Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR.
|
authenticate
|
Określa, czy dla danego żądania będą obsługiwane żądania uwierzytelniania (
true
). Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR. Domyślnie żądania są uwierzytelniane — to może powodować wyświetlanie okna dialogowego uwierzytelniania, jeśli serwer wymaga referencji. Można również ustawić nazwę użytkownika i hasło za pomocą klasy URLRequestDefaults. Zobacz
Ustawianie wartości domyślnych dla obiektu URLRequest (tylko środowisko AIR)
.
|
cacheResponse
|
Określa, czy dane odpowiedzi powinny być zapisane w pamięci podręcznej dla tego żądania. Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR. Domyślnie odpowiedź jest zapisywana w pamięci podręcznej (
true
).
|
useCache
|
Określa, czy wymagane jest sprawdzenie lokalnej pamięci podręcznej zanim klasa URLRequest pobierze dane. Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR. Ustawienie domyślne (
true
) określa używanie lokalnej wersji danych z pamięci podręcznej, jeśli są tam dostępne.
|
userAgent
|
Określ ciąg znaków użytkownik-agent, który powinien być używany w żądaniu HTTP.
|
Uwaga:
Klasa HTMLLoader zawiera powiązane właściwości przeznaczone dla ustawień dotyczących treści ładowanej przez obiekt HTMLLoader. Szczegółowe informacje zawiera sekcja
Informacje o klasie HTMLLoader
.
Ustawianie wartości domyślnych dla obiektu URLRequest (tylko środowisko AIR)
Klasa URLRequestDefaults umożliwia zdefiniowanie domyślnych ustawień aplikacji dla obiektów URLRequest. Na przykład: poniższy kod ustawia domyślne wartości dla właściwości
manageCookies
i
useCache
. Wszystkie nowe obiekty URLRequest będą korzystać z określonych wartości dla tych właściwości zamiast normalnych ustawień domyślnych:
URLRequestDefaults.manageCookies = false;
URLRequestDefaults.useCache = false;
Uwaga:
Klasa URLRequestDefaults jest zdefiniowana dla treści działających tylko w środowisku Adobe AIR. Nie jest obsługiwana w programie Flash Player.
Klasa URLRequestDefaults zawiera metodę
setLoginCredentialsForHost()
, która umożliwia określenie domyślnej nazwy użytkownika oraz hasła, które będą używane dla określonego hosta. Host, zdefiniowany w parametrze hostname metody, może być domeną, np.
"www.example.com"
, lub domeną i numerem portu, np.
"www.example.com:80"
. Nazwy
"example.com"
,
"www.example.com"
oraz
"sales.example.com"
stanowią unikalne nazwy różnych hostów.
Te referencje są używane tylko wówczas, gdy serwer tego wymaga. Jeżeli użytkownik został już uwierzytelniony (na przykład poprzez skorzystanie z okna dialogowego uwierzytelniania), wówczas wywołanie metody
setLoginCredentialsForHost()
nie zmieni uwierzytelnionego użytkownika.
Za pomocą poniższego kodu ustawiana jest domyślna nazwa użytkownika i hasło dla żądań wysyłanych do www.example.com:
URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X");
Ustawienia URLRequestDefaults dotyczą wyłącznie domeny bieżącej aplikacji, z jednym wyjątkiem. Poświadczenia przekazane do metody
setLoginCredentialsForHost()
są wykorzystywane dla żądań wykonywanych w domenie dowolnej aplikacji w obrębie aplikacji środowiska AIR.
Więcej informacji zawiera opis klasy URLRequestDefaults w
Skorowidzu języka ActionScript 3.0 dla platformy Adobe Flash
.
Schematy URI
Standardowe schematy URI takie jak te przedstawione poniżej, mogą być wykorzystywane w żądaniach wykonywanych z dowolnego zabezpieczonego obszaru izolowanego:
http: i https:
Tych schematów należy użyć dla standardowych adresów URL sieci WWW (w taki sam sposób, jak są one wykorzystywane w przeglądarce WWW).
file:
Schematu
file:
należy użyć w celu określenia adresu URL pliku położonego w lokalnym systemie plików. Na przykład:
file:///c:/AIR Test/test.txt
W środowisku AIR w przypadku definiowania adresów URL dla zawartości działającej w obszarze izolowanym aplikacji można również używać następujących schematów:
app:
app:
służy do określania ścieżki względem katalogu głównego zainstalowanej aplikacji. Przykład: poniższa ścieżka wskazuje na podkatalog resources katalogu zainstalowanej aplikacji:
app:/resources
Gdy aplikacja środowiska AIR jest uruchamiana za pomocą programu AIR Debug Launcher (ADL), katalogiem aplikacji jest katalog zawierający plik deskryptora dla aplikacji.
Adres URL (i właściwość
url
) obiektu File utworzonego przy użyciu właściwości
File.applicationDirectory
korzysta ze schematu URI
app
w następujący sposób:
var dir:File = File.applicationDirectory;
dir = dir.resolvePath("assets");
trace(dir.url); // app:/assets
app-storage:
app-storage:
służy do określania ścieżki względem katalogu przechowywania danych aplikacji. Dla każdej zainstalowanej aplikacji (i użytkownika) środowisko AIR definiuje unikalny katalog przechowywania danych aplikacji, który jest miejscem użytecznym do zapisu danych charakterystycznych dla danej aplikacji. Na przykład poniższa ścieżka wskazuje na plik prefs.xml w podkatalogu settings katalogu magazynu aplikacji.
app-storage:/settings/prefs.xml
Adres URL (i właściwość
url
) dla obiektu File utworzonego w katalogu
File.applicationStorageDirectory
korzysta ze schematu URI
app-storage
, co przedstawiono poniżej:
var prefsFile:File = File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("prefs.xml");
trace(dir.prefsFile); // app-storage:/prefs.xml
mailto:
Schematu mailto można używać w obiektach URLRequest przekazywanych do funkcji
navigateToURL()
. Zobacz
Otwieranie adresu URL w innej aplikacji
.
Istnieje możliwość użycia obiektu URLRequest, który będzie korzystał z dowolnego ze schematów URI w celu zdefiniowania żądania URL dla pewnej liczby innych obiektów, takich jak FileStream lub Sound. Możliwe jest także użycie tych schematów w treści HTML działającej w środowisku AIR; na przykład: te schematy mogą być używane w atrybucie
src
znacznika
img
.
Jednak możliwe jest używanie tych schematów URI właściwych dla środowiska AIR (
app:
i
app-storage:
) tylko w treści w bezpiecznym obszarze izolowanym aplikacji. Więcej informacji zawiera sekcja
Zabezpieczenia w środowisku AIR
.
Ustawianie zmiennych URL
Chociaż możliwe jest dodawanie zmiennych bezpośrednio do ciągów URL, łatwiejszym sposobem jest użycie klasy URLVariables w celu zdefiniowania dowolnych zmiennych wymaganych dla żądania.
Istnieją trzy sposoby dodawania parametrów do obiektu URLVariables:
-
W konstruktorze URLVariables
-
Za pomocą metody
URLVariables.decode()
-
Jako dynamicznych właściwości samego obiektu URLVariables
W poniższym przykładzie przedstawiono wszystkie trzy metody oraz sposób przypisania zmiennych do obiektu URLRequest:
var urlVar:URLVariables = new URLVariables( "one=1&two=2" );
urlVar.decode("amp=" + encodeURIComponent( "&" ) );
urlVar.three = 3;
urlVar.amp2 = "&&";
trace(urlVar.toString()); //amp=%26&2=%26%26&one=1&two=2&three=3
var urlRequest:URLRequest = new URLRequest( "http://www.example.com/test.cfm" );
urlRequest.data = urlVar;
Podczas definiowania zmiennych w konstruktorze URLRequest lub w metodzie
URLVariables.decode()
należy upewnić się, że znaki o specjalnym znaczeniu w ciągu URI zostały zakodowane jako adresy URL. Na przykład, w przypadku użycia znaku ampersand (&) w nazwie lub wartości parametru należy go zakodować, zmieniając z
&
na
%26
, ponieważ znak ampersandu pełni rolę separatora w parametrach. W tym celu można wykorzystać funkcję najwyższego poziomu
encodeURIComponent()
.
Korzystanie z klasy URLLoader
Klasa URLLoader umożliwia wysyłanie żądania na serwer i uzyskiwanie dostępu do zwracanych informacji. Klasę URLLoader można również wykorzystać w celu uzyskania dostępu do plików z lokalnego systemu plików w sytuacjach, gdy dozwolony jest dostęp do plików lokalnych (np. obszar izolowany lokalny z systemem plików Flash Player oraz obszar izolowany aplikacji AIR). Klasa URLLoader pozwala pobierać dane spod adresu URL; można je pobierać w postaci tekstu, danych binarnych i zakodowanych zmiennych. Klasa URLLoader wywołuje takie zdarzenia, jak
complete
,
httpStatus
,
ioError
,
open
,
progress
i
securityError
.
Model obsługi zdarzeń ActionScript 3.0 znacznie różni się od modelu ActionScript 2.0, w którym były wykorzystywane moduły obsługi zdarzeń
LoadVars.onData
,
LoadVars.onHTTPStatus
i
LoadVars.onLoad
. Więcej informacji na temat obsługiwania zdarzeń w ActionScript 3.0 zawiera sekcja
Obsługa zdarzeń
Pobrane dane nie są dostępne do czasu zakończenia pobierania. Postęp pobierania (liczbę bajtów pobranych i całkowitą liczbę bajtów) można monitorować, wykrywając wywołanie zdarzenia
progress
. Jeśli jednak plik zostanie załadowany bardzo szybko, zdarzenie
progress
może nie zostać wywołane ani razu. Po pomyślnym pobraniu pliku następuje wywołanie zdarzenia
complete
. Poprzez ustawienie właściwości
dataFormat
klasy URLLoader można otrzymywać dane jako obiekty tekstowe, surowe dane binarne lub obiekt URLVariables.
Metoda
URLLoader.load()
(i opcjonalnie konstruktor klasy URLLoader) przyjmuje pojedynczy parametr
request
, który jest obiektem URLRequest. Obiekt URLRequest zawiera wszystkie informacje dla pojedynczego żądania HTTP, takie jak docelowy adres URL, metoda żądania (
GET
lub
POST
), dodatkowe informacje nagłówka, a także typ MIME.
Na przykład: aby wysłać pakiet XML do skryptu po stronie serwera, można użyć poniższego kodu:
var secondsUTC:Number = new Date().time;
var dataXML:XML =
<clock>
<time>{secondsUTC}</time>
</clock>;
var request:URLRequest = new URLRequest("http://www.yourdomain.com/time.cfm");
request.contentType = "text/xml";
request.data = dataXML.toXMLString();
request.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader();
loader.load(request);
Poprzedni urywek tworzy dokument XML o nazwie
dataXML
, który zawiera pakiet XML przeznaczony do wysłania na serwer. W przykładzie ustawiono właściwość
contentType
klasy URLRequest na wartość
„text/xml"
i przypisano dokument XML do właściwości
data
klasy URLRequest. Na końcu przykładu utworzono obiekt URLLoader i wysłano żądanie do zdalnego skryptu poprzez zastosowanie metody
load()
.
Korzystanie z klasy URLStream
Klasa URLStream zapewnia dostęp do pobieranych danych w miarę ich ładowania. Klasa URLStream umożliwia również zamknięcie strumienia przed zakończeniem ładowania. Pobrane dane są dostępne jako surowe dane binarne.
Podczas odczytu danych z obiektu URLStream należy użyć właściwości
bytesAvailable
w celu określenia, czy dostępna jest wystarczająca ilość danych przed ich odczytaniem. W przypadku podjęcia próby odczytu większej ilości danych niż dostępna wywoływany jest wyjątek EOFError.
Zdarzenie httpResponseStatus (środowisko AIR).
W środowisku Adobe AIR klasa URLStream poza zdarzeniem
httpStatus
wywołuje jeszcze zdarzenie
httpResponseStatus
. Zdarzenie
httpResponseStatus
jest dostarczane przed wszystkimi danymi odpowiedzi. Zdarzenie
httpResponseStatus
(reprezentowane przez klasę HTTPStatusEvent) zawiera właściwość
responseURL
. Jest to adres URL, z którego została zwrócona odpowiedź. Zawiera ono też właściwość
responseHeaders
, która jest tablicą obiektów URLRequestHeader reprezentujących nagłówki odpowiedzi zwrócone w odpowiedzi.
Wysyłanie danych z dokumentów zewnętrznych
W aplikacjach dynamicznych stosuje się często technikę ładowania danych z plików zewnętrznych lub skryptów serwerowych. Umożliwia to budowanie dynamicznych aplikacji bez konieczności edycji lub ponownego kompilowania aplikacji. Przykład: w przypadku tworzenia aplikacji „wskazówka dnia” można napisać skrypt serwerowy, który będzie losowo pobierał wskazówkę z bazy danych i zapisywał ją w pliku tekstowym raz dziennie. Następnie aplikacja może wysłać treść statycznego pliku tekstowego zamiast generowania zapytania do bazy danych za każdym razem.
Poniższy urywek tworzy obiekt URLRequest i URLLoader, który ładuje treść zewnętrznego pliku tekstowego params.txt:
var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);
Jeśli nie zostanie zdefiniowana metoda żądania, wówczas domyślnie program Flash Player lub Adobe AIR wysyła treść za pomocą metody HTTP
GET
. Aby wysłać żądanie za pomocą metody
POST
, należy ustawić właściwość
request.method
na
POST
, korzystając ze stałej statycznej
URLRequestMethod.POST
, co ilustruje poniższy przykład:
var request:URLRequest = new URLRequest("sendfeedback.cfm");
request.method = URLRequestMethod.POST;
Zewnętrzny dokument — params.txt — ładowany w czasie wykonywania, zawiera następujące dane:
monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
Plik zawiera dwa parametry:
monthNames
i
dayNames
. Każdy parametr zawiera rozdzielaną przecinkami listę, której elementy są analizowane jako ciągi znaków. Listę można rozdzielić na tablicę, korzystając z metody
String.split()
.
Nazwy zmiennych w plikach zewnętrznych nie powinny zawierać słów zarezerwowanych ani konstrukcji językowych, ponieważ może to spowodować utrudnienie odczytywania i debugowania kodu.
Po załadowaniu danych następuje wywołanie zdarzenia
complete
, a treść zewnętrznego dokumentu staje się dostępna do użytku we właściwości
data
URLLoader, jak w poniższym kodzie:
function completeHandler(event)
{
var loader2 = event.target;
air.trace(loader2.data);
}
Jeśli zdalny dokument zawiera pary nazwa-wartość, można analizować dane za pomocą klasy URLVariables, przekazując zawartość wysłanego pliku, jak poniżej:
private function completeHandler(event:Event):void
{
var loader2:URLLoader = URLLoader(event.target);
var variables:URLVariables = new URLVariables(loader2.data);
trace(variables.dayNames);
}
Każda para nazwa-wartość z zewnętrznego pliku jest tworzona jako właściwość w obiekcie URLVariables. Każda właściwość w obiekcie zmiennych z poprzedniego kodu jest traktowana jako ciąg znaków. Jeśli wartością pary nazwa-wartość jest lista elementów, ciąg znaków można zamienić na tablicę poprzez wywołanie metody
String.split()
w następujący sposób:
var dayNameArray:Array = variables.dayNames.split(",");
W przypadku wysyłania danych liczbowych z zewnętrznych plików tekstowych wymagana jest konwersja wartości na wartości liczbowe za pomocą funkcji najwyższego poziomu, takiej jak
int()
,
uint()
lub
Number()
.
Zamiast wysyłania treści pliku zdalnego w postaci ciągu znaków i tworzenia nowego obiektu URLVariables można ustawić właściwość
URLLoader.dataFormat
na jedną z właściwości statycznych dostępnych w klasie URLLoaderDataFormat. Trzy możliwe wartości właściwości
URLLoader.dataFormat
są następujące:
-
URLLoaderDataFormat.BINARY
— właściwość
URLLoader.data
będzie zawierała dane binarne zapisane w obiekcie ByteArray.
-
URLLoaderDataFormat.TEXT
— właściwość
URLLoader.data
będzie zawierała tekst w obiekcie String.
-
URLLoaderDataFormat.VARIABLES
— właściwość
URLLoader.data
będzie zawierała zmienne (zakodowane w adresie URL) zapisane w obiekcie URLVariables.
Poniższy kod przedstawia sposób, w jaki ustawienie
URLLoaderDataFormat.VARIABLES
dla właściwości
URLLoader.dataFormat
umożliwia automatyczne analizowanie wysłanych danych na obiekt URLVariables:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
public class URLLoaderDataFormatExample extends Sprite
{
public function URLLoaderDataFormatExample()
{
var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt");
var variables:URLLoader = new URLLoader();
variables.dataFormat = URLLoaderDataFormat.VARIABLES;
variables.addEventListener(Event.COMPLETE, completeHandler);
try
{
variables.load(request);
}
catch (error:Error)
{
trace("Unable to load URL: " + error);
}
}
private function completeHandler(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
trace(loader.data.dayNames);
}
}
}
Uwaga:
Domyślną wartością
URLLoader.dataFormat
jest
URLLoaderDataFormat.TEXT
.
W poniższym przykładzie przedstawiono ładowanie danych XML z zewnętrznego pliku w ten sam sposób, jak wysyłanie URLVariables. W celu pobrania zdalnego dokumentu XML można utworzyć instancję URLRequest oraz instancję URLLoader. Po pobraniu całego pliku następuje wywołanie zdarzenia
Event.COMPLETE
, a treść zewnętrznego pliku zostaje przekonwertowane na instancję XML, którą można przeanalizować za pomocą metod i właściwości XML.
package
{
import flash.display.Sprite;
import flash.errors.*;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
public class ExternalDocs extends Sprite
{
public function ExternalDocs()
{
var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml");
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, completeHandler);
try
{
loader.load(request);
}
catch (error:ArgumentError)
{
trace("An ArgumentError has occurred.");
}
catch (error:SecurityError)
{
trace("A SecurityError has occurred.");
}
}
private function completeHandler(event:Event):void
{
var dataXML:XML = XML(event.target.data);
trace(dataXML.toXMLString());
}
}
}
Komunikacja ze skryptami zewnętrznymi
Oprócz wysyłania zewnętrznych plików danych klasa URLVariables może również służyć do wysyłania zmiennych do skryptów serwerowych oraz przetwarzania odpowiedzi serwera. Jest to użyteczne szczególnie w przypadku programowania gry, gdy wymagane jest przesyłanie punktacji użytkownika na serwer w celu obliczenia, czy punktacja powinna zostać dodana do listy rekordów, a także w przypadku wysyłania danych logowania użytkownika na serwer w celu sprawdzenia poprawności. Skrypt serwerowy może przetworzyć nazwę i hasło użytkownika, sprawdzić jego poprawność w bazie danych, a następnie zwrócić potwierdzenie dotyczące tego, czy dane wprowadzone przez użytkownika są poprawne.
Poniższy urywek tworzy obiekt URLVariables o nazwie
variables,
, który tworzy nową zmienną o nazwie
name
. Następnie zostaje utworzony obiekt URLRequest, który określa adres URL skryptu serwerowego, do którego wysyłane są zmienne. Następnie użytkownik ustawia właściwość
method
obiektu URLRequest w celu wysłania zmiennych w postaci żądania HTTP
POST
. Aby dodać obiekt URLVariables do żądania URL, należy ustawić dla właściwości
data
obiektu URLRequest obiekt URLVariables utworzony wcześniej. Na koniec następuje utworzenie instancji URLLoader oraz wywołanie metody
URLLoader.load()
, która inicjuje żądanie.
var variables:URLVariables = new URLVariables("name=Franklin");
var request:URLRequest = new URLRequest();
request.url = "http://www.[yourdomain].com/greeting.cfm";
request.method = URLRequestMethod.POST;
request.data = variables;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, completeHandler);
try
{
loader.load(request);
}
catch (error:Error)
{
trace("Unable to load URL");
}
function completeHandler(event:Event):void
{
trace(event.target.data.welcomeMessage);
}
Poniższy kod zawiera treść dokumentu Adobe ColdFusion® greeting.cfm, który został wykorzystany w poprzednim przykładzie:
<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0>
<cfset Form.Name = "Stranger" />
</cfif>
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)#
</cfoutput>
|
|
|