Caricamento di dati esterniFlash 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 URLRequestNumerose API che caricano dati esterni utilizzano la classe URLRequest per definire le proprietà di richiesta di rete necessarie. Proprietà URLRequestPotete impostare le proprietà seguenti di un oggetto URLRequest in qualsiasi sandbox di sicurezza:
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).
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 in ActionScript 3.0 Reference for the Adobe Flash Platform (Guida di riferimento di Adobe ActionScript 3.0 per la piattaforma Adobe Flash). Schemi URIGli 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. 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 Il percorso della directory di memorizzazione dell'applicazione è basato su nome utente, ID applicazione e ID editore (se applicabile):
Nota: analogamente a AIR 1.5.3, non tutte le applicazioni AIR dispongono di un ID editore.
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 dir:File = File.applicationStorageDirectory;
dir = dir.resolvePath("preferences");
trace(dir.url); // app-storage:/preferences
mailto:Potete usare lo schema mailto negli oggetti URLRequest passati alla funzione navigateToURL(). Consultate 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. Schemi URI proibiti (in AIR)Alcune API consentono di avviare contenuto in un browser Web. Per motivi di sicurezza, alcuni schemi URI non sono consentiti quando si utilizzano queste API in AIR. L'elenco degli schemi non consentiti dipende dalla sandbox di sicurezza del codice che utilizza l'API. Per ulteriori informazioni, consultate Apertura di un URL in un'altra applicazione. Impostazione di variabili URLSebbene 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:
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&2=%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 URLLoaderLa 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 URLStreamLa 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 esterniQuando 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:
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 esterniOltre 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>
|
|