Cuando se crean aplicaciones dinámicas, puede ser útil cargar datos de archivos externos o scripts de servidor. De esta forma es posible generar aplicaciones dinámicas sin tener que editar o recompilar los archivos de ActionScript. Por ejemplo, si se genera una aplicación de "sugerencia del día", se puede escribir un script de servidor que recupere una sugerencia aleatoria de una base de datos y la guarde en un archivo de texto una vez al día. Luego la aplicación puede cargar el contenido de un archivo de texto estático en lugar de consultar la base de datos cada vez.
El siguiente fragmento de código crea un objeto URLRequest y URLLoader, que carga el contenido de un archivo de texto externo, params.txt:
var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);
De forma predeterminada, si no se define un método de petición, Flash Player y Adobe AIR cargan el contenido con el método HTTP
GET
. Si se desea enviar los datos con el método
POST
, es necesario establecer la propiedad
request.method
en
POST
con la constante estática
URLRequestMethod.POST
, como se muestra en el siguiente código:
var request:URLRequest = new URLRequest("sendfeedback.cfm");
request.method = URLRequestMethod.POST;
El documento externo (params.txt) que se carga en tiempo de ejecución contiene los siguientes datos:
monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
El archivo contiene dos parámetros,
monthNames
y
dayNames
. Cada parámetro incluye una lista separada por comas que se analiza como cadenas. Se puede dividir esta lista en un conjunto con el método
String.split()
.
Conviene evitar la utilización de palabras reservadas y construcciones del lenguaje como nombres de variables en archivos de datos externos, ya que dificulta la lectura y depuración del código.
Cuando se han cargado los datos, se distribuye el evento
Event.COMPLETE
y el contenido del documento externo está disponible para utilizarlo en la propiedad
data
de URLLoader, como se muestra en el siguiente código:
function completeHandler(event)
{
var loader2 = event.target;
air.trace(loader2.data);
}
Si el documento remoto contiene pares nombre-valor, puede analizar los datos con la clase URLVariables analizando el contenido del archivo cargado del modo siguiente:
private function completeHandler(event:Event):void
{
var loader2:URLLoader = URLLoader(event.target);
var variables:URLVariables = new URLVariables(loader2.data);
trace(variables.dayNames);
}
Cada par nombre-valor del archivo externo se crea como una propiedad en el objeto URLVariables. Cada propiedad del objeto variables del ejemplo de código anterior se trata como una cadena. Si el valor del par nombre-valor es una lista de elementos, puede convertir la cadena en un conjunto llamando al método
String.split()
, como se indica a continuación:
var dayNameArray:Array = variables.dayNames.split(",");
Si se cargan datos numéricos de archivos de texto externos, es necesario convertir los valores en valores numéricos, mediante una función de nivel superior como
int()
,
uint()
o
Number()
.
En lugar de cargar el contenido del archivo remoto como una cadena y crear un nuevo objeto URLVariables, se puede establecer la propiedad
URLLoader.dataFormat
en una de las propiedades estáticas de la clase URLLoaderDataFormat. Los tres valores posibles para la propiedad
URLLoader.dataFormat
son los siguientes:
-
URLLoaderDataFormat.BINARY
: la propiedad
URLLoader.data
contendrá datos binarios almacenados en un objeto ByteArray.
-
URLLoaderDataFormat.TEXT
: la propiedad
URLLoader.data
contendrá texto en un objeto String.
-
URLLoaderDataFormat.VARIABLES
: la propiedad
URLLoader.data
contendrá variables con codificación URL almacenadas en un objeto URLVariables.
En el código siguiente se muestra que, al establecer la propiedad
URLLoader.dataFormat
en
URLLoaderDataFormat.VARIABLES
, se permite analizar automáticamente los datos cargados en un objeto 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:
el valor predeterminado de
URLLoader.dataFormat
es
URLLoaderDataFormat.TEXT
.
Como puede verse en el siguiente ejemplo, cargar XML desde un archivo externo es lo mismo que cargar URLVariables. Puede crear una instancia de URLRequest y una instancia de URLLoader, y utilizarlas para descargar un documento XML remoto. Cuando el archivo se ha descargado completamente, se distribuye el evento
Event.COMPLETE
y el contenido del archivo externo se convierte en una instancia de XML, que puede analizarse con los métodos y propiedades de 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());
}
}
}