Caricamento di dati esterni

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

ActionScript 3.0 include dei meccanismi per caricare dati da origini esterne. Queste origini possono fornire contenuti statici come i file di testo o contenuti dinamici generati dagli script Web. I dati possono essere formattati in vari modi e ActionScript fornisce le funzionalità per decodificare e accedere ai dati. Inoltre, è possibile inviare dati al server esterno come parte del processo di recupero dei dati.

Uso della classe URLRequest

Numerose API che caricano dati esterni utilizzano la classe URLRequest per definire le proprietà di richiesta di rete necessarie.

Proprietà URLRequest

Potete impostare le proprietà seguenti di un oggetto URLRequest in qualsiasi sandbox di sicurezza:

Proprietà

Descrizione

contentType

Il tipo di contenuto MIME di qualsiasi dato inviato con la richiesta URL. Se non è impostata nessuna proprietà contentType, i valori vengono inviati come application/x-www-form-urlencoded .

data

Un oggetto che contiene i dati da trasmettere con la richiesta URL.

digest

Una stringa che identifica in modo univoco il componente piattaforma Adobe firmato da memorizzare nella (o recuperare dalla) cache di Adobe® Flash® Player.

method

Il metodo della richiesta HTTP, ad esempio GET o POST. Il contenuto eseguito nel dominio di sicurezza dell'applicazione AIR può specificare stringhe diverse da "GET" o "POST" come la proprietà method . Qualsiasi verbo HTTP è consentito e "GET" è il metodo predefinito. Vedete Sicurezza in AIR .

requestHeaders

L'array di intestazioni di richiesta HTTP da aggiungere alla richiesta HTTP. Notate che l'autorizzazione per impostare alcune intestazioni è limitata in Flash Player nonché nel contenuto AIR in esecuzione all'esterno della sandbox di sicurezza dell'applicazione.

url

Specifica l'URL da richiedere.

In AIR, potete impostare proprietà aggiuntive della classe URLRequest, che sono disponibili solo per il contenuto AIR in esecuzione nella sandbox di sicurezza dell'applicazione. Il contenuto nella sandbox dell'applicazione può anche definire URL utilizzando nuovi schemi URL (oltre agli schemi standard come file e http ).

Proprietà

Descrizione

followRedirects

Specifica se seguire ( true , valore predefinito) o meno ( false ) i reindirizzamenti. Questa proprietà è supportata solo nella sandbox dell'applicazione AIR.

manageCookies

Specifica se lo stack del protocollo HTTP deve gestire i cookie ( true , valore predefinito) o no ( false ) per questa richiesta. L'impostazione di questa proprietà è supportata solo nella sandbox dell'applicazione AIR.

authenticate

Specifica se le richieste di autenticazione devono essere gestite ( true ) per questa richiesta. L'impostazione di questa proprietà è supportata solo nella sandbox dell'applicazione AIR. Per impostazione predefinita le richieste sono autenticate. Questo potrebbe determinare la visualizzazione di una finestra di dialogo di autenticazione se il server richiede delle credenziali di accesso. Potete anche impostare il nome utente e la password utilizzando la classe URLRequestDefaults; vedete Impostazione dei valori predefiniti URLRequest (solo AIR) .

cacheResponse

Specifica se i dati di risposta corretti devono essere memorizzati nella cache per questa richiesta. L'impostazione di questa proprietà è supportata solo nella sandbox dell'applicazione AIR. L'impostazione predefinita è di memorizzare la risposta nella cache ( true ).

useCache

Specifica se la cache locale deve essere consultata prima che URLRequest recuperi i dati. L'impostazione di questa proprietà è supportata solo nella sandbox dell'applicazione AIR. L'impostazione predefinita ( true ) è di utilizzare la versione memorizzata nella cache locale, se disponibile.

userAgent

Specifica la stringa agente utente da utilizzare nella richiesta HTTP.

Nota: la classe HTMLLoader dispone di proprietà correlate per impostazioni attinenti al contenuto caricato da un oggetto HTMLLoader. Per ulteriori informazioni, consultate Informazioni sulla classe HTMLLoader .

Impostazione dei valori predefiniti URLRequest (solo AIR)

La classe URLRequestDefaults consente di definire impostazioni predefinite specifiche dell'applicazione per gli oggetti URLRequest. Il codice seguente, ad esempio, imposta i valori predefiniti per le proprietà manageCookies e useCache. Tutti i nuovi oggetti URLRequest utilizzeranno i valori specificati per queste proprietà anziché i normali valori predefiniti:

URLRequestDefaults.manageCookies = false; 
URLRequestDefaults.useCache = false;
Nota: la classe URLRequestDefaults è definita solo per il contenuto eseguito in Adobe AIR e non è supportata in Flash Player.

La classe URLRequestDefaults include un metodo setLoginCredentialsForHost() che consente di specificare un nome utente e una password predefiniti da utilizzare per un host specifico. L'host, definito nel parametro hostname del metodo, può essere un dominio, ad esempio "www.example.com" , o un dominio e un numero di porta, ad esempio "www.example.com:80" . Notate che "example.com" , "www.example.com" e "sales.example.com" sono considerati tutti host univoci.

Queste credenziali sono utilizzate solo se richieste dal server. Se l'utente ha già eseguito l'autenticazione (ad esempio, utilizzando la finestra di dialogo di autenticazione), la chiamata al metodo setLoginCredentialsForHost() non modifica l'utente autenticato.

Il codice seguente imposta il nome utente e la password predefiniti da utilizzare per le richieste inviate a www.example.com:

URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X"); 

Le impostazioni URLRequestDefaults sono valide solo per il dominio applicazione corrente, con un'unica eccezione. Le credenziali passate al metodo setLoginCredentialsForHost() sono utilizzate per le richieste effettuate in qualsiasi dominio applicazione all'interno dell'applicazione AIR.

Per ulteriori informazioni, vedete la classe URLRequestDefaults nella Guida di riferimento di Adobe ActionScript 3.0 per la piattaforma Adobe Flash .

Schemi URI

Gli schemi URI standard, ad esempio il seguente, possono essere utilizzati nelle richieste effettuate da qualsiasi sandbox di sicurezza:

http: e https:

Utilizzate questi URL Internet standard (nello stesso modo in cui vengono utilizzati in un browser Web).

file:

Utilizzate file: per specificare l'URL di un file che si trova nel file system locale. Ad esempio:

file:///c:/AIR Test/test.txt 

In AIR, potete anche utilizzare gli schemi seguenti durante la definizione di un URL per il contenuto in esecuzione nella sandbox di sicurezza dell'applicazione:

app:

Utilizzate app: per specificare un percorso relativo alla directory principale dell'applicazione installata. Ad esempio, il percorso seguente punta a una sottodirectory delle risorse della directory dell'applicazione installata:

app:/resources 

Quando un'applicazione AIR viene avviata utilizzando l'ADL (AIR Debug Launcher), la directory dell'applicazione è quella contenente il file descrittore dell'applicazione.

L'URL (e la proprietà url ) per un oggetto File creato con File.applicationDirectory utilizza lo schema URI app-storage , come nell'esempio seguente:

var dir:File = File.applicationDirectory; 
dir = dir.resolvePath("assets"); 
trace(dir.url); // app:/assets 

app-storage:

Utilizzate app-storage: per specificare un percorso relativo alla directory di memorizzazione dei dati dell'applicazione installata. Per ogni applicazione (e utente) installata, AIR crea una directory di memorizzazione univoca dell'applicazione, che costituisce una comoda ubicazione in cui memorizzare i dati specifici di un'applicazione. Ad esempio, il percorso seguente punta a un file prefs.xml in una sottodirectory delle impostazioni della directory di memorizzazione dell'applicazione:

app-storage:/settings/prefs.xml 

L'URL (e la proprietà url ) per un oggetto File creato con File.applicationStorageDirectory utilizza lo schema URI app-storage , come nell'esempio seguente:

var prefsFile:File = File.applicationStorageDirectory; 
prefsFile = prefsFile.resolvePath("prefs.xml"); 
trace(dir.prefsFile); // app-storage:/prefs.xml 

mailto:

Potete usare lo schema mailto negli oggetti URLRequest passati alla funzione navigateToURL() . Vedete Apertura di un URL in un'altra applicazione .

Potete usare un oggetto URLRequest che utilizza uno di questi schemi URI per definire la richiesta URL per un certo numero di oggetti, ad esempio un oggetto FileStream o Sound. Potete anche usare questi schemi nel contenuto HTML in esecuzione in AIR; ad esempio, nell'attributo src di un tag img .

Tuttavia, potete usare gli schemi URI specifici di AIR ( app: e app-storage: ) solo nel contenuto della sandbox di sicurezza dell'applicazione. Per ulteriori informazioni, consultate Sicurezza in AIR .

Impostazione di variabili URL

Sebbene possiate aggiungere variabili alla stringa URL direttamente, potrebbe essere più semplice utilizzare la classe URLVariables per definire le eventuali variabili necessarie per una richiesta.

Sono disponibili tre modi per aggiungere parametri a un oggetto URLVariables:

  • All'interno della funzione di costruzione URLVariables

  • Con il metodo URLVariables.decode()

  • Come proprietà dinamiche dell'oggetto URLVariables stesso

Nell'esempio seguente vengono illustrati tutti e tre i metodi e anche come assegnare variabili a un oggetto URLRequest:

var urlVar:URLVariables = new URLVariables( "one=1&two=2" ); 
urlVar.decode("amp=" + encodeURIComponent( "&" ) ); 
urlVar.three = 3; 
urlVar.amp2 = "&&"; 
trace(urlVar.toString()); //amp=%26&amp2=%26%26&one=1&two=2&three=3 
 
var urlRequest:URLRequest = new URLRequest( "http://www.example.com/test.cfm" ); 
urlRequest.data = urlVar;

Quando definite variabili all'interno del costruttore URLVariables o all'interno del metodo URLVariables.decode() , accertatevi di formattare con codifica URL i caratteri che hanno un significato speciale in una stringa URI. Ad esempio, quando utilizzate una e commerciale (&) in un nome o valore parametro, dovete codificarla modificandola da & in %26 poiché la e commerciale server da delimitatore per i parametri. A questo scopo, potete utilizzare la funzione encodeURIComponent() di livello principale.

Uso della classe URLLoader

La classe URLLoader vi consente di inviare una richiesta a un server e accedere alle informazioni restituite. Potete anche utilizzare la classe URLLoader per accedere ai file nel file system locale in contesti in cui l'accesso ai file locali è consentito (ad esempio, la sandbox locale con file system Flash Player e la sandbox dell'applicazione AIR). La classe URLLoader scarica i dati da un URL sotto forma di testo, dati binari o variabili con codifica URL. La classe URLLoader invia eventi quali complete , httpStatus , ioError , open , progress e securityError .

Il modello di gestione degli eventi di ActionScript 3.0 è significativamente diverso dal modello ActionScript 2.0, che utilizza i gestori di evento LoadVars.onData , LoadVars.onHTTPStatus e LoadVars.onLoad . Per ulteriori informazioni sulla gestione degli eventi in ActionScript 3.0, vedete Gestione degli eventi

I dati scaricati non sono disponibili fino al termine dello scaricamento. Potete verificare lo stato di avanzamento dello scaricamento (byte caricati e byte totali) intercettando l'evento progress da inviare. Tuttavia, se un file viene caricato in maniera abbastanza rapida, l'evento progress potrebbe non essere inviato. L'evento complete viene inviato dopo che un file è stato scaricato. Impostando la proprietà dataFormat di URLLoader, potete ricevere i dati come testo, dati binari originari o come un oggetto URLVariables.

Il metodo URLLoader.load() (e facoltativamente la funzione di costruzione della classe URLLoader) accetta un solo parametro, request , ovvero un oggetto URLRequest. Un oggetto URLRequest contiene tutte le informazioni per una singola richiesta HTTP, ad esempio l'URL di destinazione, il metodo di richiesta ( GET o POST ), informazioni aggiuntive sull'intestazione e il tipo MIME.

Ad esempio, per caricare un pacchetto XML in uno script sul lato server, potete utilizzare il codice riportato di seguito:

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); 

Lo snippet di codice precedente crea un documento XML denominato dataXML che contiene un pacchetto XML da inviare al server. L'esempio imposta la proprietà contentType di URLRequest su "text/xml" e assegna il documento XML alla proprietà data di URLRequest. Infine, l'esempio crea un oggetto URLLoader e invia la richiesta allo script remoto utilizzando il metodo load() .

Uso della classe URLStream

La classe URLStream fornisce l'accesso ai dati in corso di scaricamento man mano che questi arrivano. La classe URLStream consente inoltre di chiudere uno streaming prima che termini lo scaricamento. I dati scaricati sono disponibili come dati binari originari.

Durante la lettura di dati da un oggetto URLStream, utilizzate la proprietà bytesAvailable per determinare se sono disponibili dati sufficienti prima di leggerli. Se si tenta di leggere più dati di quelli disponibili, viene generata un'eccezione EOFError.

Evento httpResponseStatus (AIR)

In Adobe AIR, la classe URLStream invia un evento httpResponseStatus in aggiunta all'evento httpStatus . L'evento httpResponseStatus viene inviato prima di eventuali dati di risposta. L'evento httpResponseStatus (definito nella classe HTTPStatusEvent) include una proprietà responseURL , che corrisponde all'URL da cui è stata restituita la risposta, e una proprietà responseHeaders , che corrisponde a un array di oggetti URLRequestHeader che rappresentano le intestazioni di risposta che la risposta ha restituito.

Caricamento di dati da documenti esterni

Quando create applicazioni dinamiche, può essere utile per caricare dati da file esterni o da script lato server. In questo modo è possibile creare applicazioni dinamiche senza modificare o ricompilare l'applicazione. Ad esempio, se create un'applicazione “suggerimento del giorno”, potete scrivere uno script sul lato server che una volta al giorno recupera un suggerimento causale da un database e lo salva in un file di testo. L'applicazione può quindi caricare il contenuto di un file di testo statico, anziché interrogare il database ogni volta.

Lo snippet di codice seguente crea un oggetto URLRequest e URLLoader che carica il contenuto di un file di testo esterno, params.txt:

var request:URLRequest = new URLRequest("params.txt"); 
var loader:URLLoader = new URLLoader(); 
loader.load(request);
Per impostazione predefinita, se non definite un metodo di richiesta, Flash Player e Adobe AIR caricano il contenuto utilizzando il metodo GET di HTTP. Se desiderate inviare i dati utilizzando il metodo POST , impostate la proprietà request.method su POST utilizzando la costante statica URLRequestMethod.POST , come descritto nel codice seguente:
var request:URLRequest = new URLRequest("sendfeedback.cfm"); 
request.method = URLRequestMethod.POST;

Il documento esterno, params.txt, che viene caricato in fase di runtime contiene i seguenti dati:

monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday

Il file contiene due parametri, monthNames e dayNames . Ogni parametro contiene un elenco separato da virgole che viene analizzato come stringa. Questo elenco può essere suddiviso in un array utilizzando il metodo String.split() .

Evitate di utilizzare parole riservate o costrutti del linguaggio come nomi di variabili nei file di dati esterni, perché ciò rende più difficile la lettura e il debug del codice.
Dopo che i dati sono stati caricati, viene inviato l'evento complete e il contenuto del documento esterno diventa disponibile per l'utilizzo nella proprietà data di URLLoader, come illustrato nel codice riportato di seguito:
function completeHandler(event) 
{ 
    var loader2 = event.target; 
    air.trace(loader2.data); 
}

Se il documento remoto contiene coppie nome-valore, è possibile analizzare i dati utilizzando la classe URLVariables passando il contenuto del file caricato, come riportato di seguito:

private function completeHandler(event:Event):void 
{ 
    var loader2:URLLoader = URLLoader(event.target); 
    var variables:URLVariables = new URLVariables(loader2.data); 
    trace(variables.dayNames); 
}

Ogni coppia nome-valore contenuta nel file esterno viene creata sotto forma di proprietà nell'oggetto URLVariables. Ogni proprietà all'interno dell'oggetto variables nell'esempio di codice precedente viene considerato come una stringa. Se il valore della coppia nome-valore è un elenco di elementi, potete convertire la stringa in un array chiamando il metodo String.split() , come riportato di seguito:

var dayNameArray:Array = variables.dayNames.split(",");
Se caricate dati numerici dai file di testo esterni, convertite i valori in valori numerici utilizzando una funzione di primo livello quale int() , uint() o Number() .

Anziché caricare il contenuto del file remoto come stringa e creare un nuovo oggetto URLVariables, è possibile impostare la proprietà URLLoader.dataFormat su una delle proprietà statiche presenti nella classe URLLoaderDataFormat. Di seguito sono riportati i tre valori possibili per la proprietà URLLoader.dataFormat :

  • URLLoaderDataFormat.BINARY : la proprietà URLLoader.data contiene dati binari memorizzati in un oggetto ByteArray.

  • URLLoaderDataFormat.TEXT : la proprietà URLLoader.data contiene testo in un oggetto String.

  • URLLoaderDataFormat.VARIABLES : la proprietà URLLoader.data contiene variabili con codifica URL memorizzate in un oggetto URLVariables.

Il codice seguente dimostra come l'impostazione della proprietà URLLoader.dataFormat su URLLoaderDataFormat.VARIABLES consenta di analizzare automaticamente i dati caricati in un oggetto 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); 
        } 
    } 
}
Nota: il valore predefinito per URLLoader.dataFormat è URLLoaderDataFormat.TEXT .

Come illustrato nell'esempio seguente, caricare contenuto XML da un file esterno è come caricare URLVariables. Potete creare un'istanza di URLRequest e un'istanza di URLLoader e utilizzarle per scaricare un documento XML remoto. Dopo che il file è stato completamente scaricato, viene inviato l'evento Event.COMPLETE e il contenuto del documento esterno viene convertito in un'istanza di XML che può essere analizzata utilizzando i metodi e le proprietà 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()); 
        } 
    } 
}

Comunicazione con script esterni

Oltre a caricare file di dati esterni, potete utilizzare la classe URLVariables per inviare variabili a uno script sul lato server ed elaborare la risposta del server. Questa operazione è utile, ad esempio, quando programmate un gioco e desiderate inviare il punteggio dell'utente a un server per calcolare se dovrà essere aggiunto all'elenco dei punteggi più alti oppure per inviare le informazioni di login di un utente a un server per la convalida. Uno script sul lato server può elaborare il nome utente e la password, convalidarli rispetto a un database e confermare se le credenziali fornite dall'utente sono valide.

Lo snippet di codice seguente crea un oggetto URLVariables di nome variables , che a propria volta crea una nuova variabile denominata name . Viene quindi creato un oggetto URLRequest che specifica l'URL dello script sul lato server a cui inviare le variabili. Impostate quindi la proprietà method dell'oggetto URLRequest in modo che le variabili siano inviate come una richiesta POST HTTP. Per aggiungere l'oggetto URLVariables alla richiesta URL, impostate la proprietà data dell'oggetto URLRequest sull'oggetto URLVariables creato precedentemente. Infine, viene creata l'istanza di URLLoader e viene richiamato il metodo URLLoader.load() , che avvia la richiesta.

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); 
}

Il codice seguente contiene il contenuto del documento greeting.cfm di Adobe ColdFusion® utilizzato nell'esempio precedente:

<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> 
    <cfset Form.Name = "Stranger" /> 
</cfif> 
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# 
</cfoutput>