Carga de datos externos

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

ActionScript 3.0 incluye mecanismos para cargar datos desde fuentes externas. Estas fuentes pueden ser contenido estático, como archivos de texto, o contenido dinámico generado por un script web. Se puede aplicar formato a los datos de varias maneras y ActionScript proporciona funcionalidad para descodificar y acceder a los datos. También se pueden enviar datos al servidor externo como parte del proceso de recuperación de datos.

Uso de la clase URLRequest

Muchas API que cargan datos externos utilizan la clase URLRequest para definir las propiedades de la petición de red necesaria.

Propiedades de URLRequest

Puede utilizar las siguientes propiedades de un objeto URLRequest en cualquier entorno limitado de seguridad:

Propiedad

Descripción

contentType

El tipo de contenido MIME de todos los datos enviados con la petición de URL. Si no se establece contentType, los valores se envían como application/x-www-form-urlencoded .

data

Un objeto que contiene datos que se van a transmitir con la petición de URL.

digest

Una cadena que identifica de forma unívoca el componente firmado de la plataforma de Adobe que se va a almacenar (o recuperar) en la caché de Adobe® Flash® Player.

method

El método de petición HTTP, por ejemplo, GET o POST. (El contenido ejecutado en el dominio de seguridad de la aplicación de AIR puede especificar cadenas que no sean "GET" o "POST" como propiedad method . Se permite cualquier palabra clave HTTP, aunque "GET" es el método predeterminado. Consulte Seguridad en AIR .

requestHeaders

El conjunto de encabezados de petición HTTP que se añadirán a la petición HTTP. Tenga en cuenta que el permiso para definir determinados encabezados en Flash Player y en contenido de AIR ejecutado fuera del entorno limitado de seguridad de la aplicación está restringido.

url

Especifica la dirección URL que se va a solicitar.

En AIR, puede definir propiedades adicionales de la clase URLRequest que solo están disponibles en contenido de AIR ejecutado fuera del entorno limitado de seguridad de la aplicación. El contenido del entorno limitado de la aplicación también puede definir las direcciones URL mediante los nuevos esquemas de URL (además de los esquemas estándar como file y http ).

Propiedad

Descripción

followRedirects

Especifica si se siguen las redirecciones ( true , valor predeterminado) o no ( false ). Esto solo se admite en el entorno limitado de la aplicación AIR.

manageCookies

Especifica si la cola del protocolo HTTP debe gestionar las cookies ( true , valor predeterminado) o no ( false ) en esta petición. La configuración de esta propiedad solo se admite en el entorno limitado de la aplicación de AIR.

authenticate

Especifica si deben manejarse peticiones de autenticación ( true ) en esta petición. La configuración de esta propiedad solo se admite en el entorno limitado de la aplicación de AIR. El comportamiento predeterminado es autenticar peticiones. Esto puede provocar la aparición de un cuadro de diálogo si el servidor requiere credenciales. También puede establecer el nombre de usuario y la contraseña con la clase URLRequestDefaults; consulte Configuración de los valores predeterminados de URLRequest (solo AIR) .

cacheResponse

Especifica si los datos de respuesta de esta petición se deben guardar en la memoria caché. La configuración de esta propiedad solo se admite en el entorno limitado de la aplicación de AIR. El valor predeterminado es guardar la respuesta en la memoria caché ( true ).

useCache

Especifica si se debe consultar la memoria caché local antes de que el objeto URLRequest tome los datos. La configuración de esta propiedad solo se admite en el entorno limitado de la aplicación de AIR. El comportamiento predeterminado ( true ) es utilizar la versión guardada en la memoria local, si está disponible.

userAgent

Especifica la cadena de agente de usuario que se utiliza en la petición HTTP.

Nota: la clase HTMLLoader tiene propiedades relacionadas para ajustes que pertenecen al contenido cargado mediante un objeto HTMLLoader. Para obtener más información, consulte Información sobre la clase HTMLLoader .

Configuración de los valores predeterminados de URLRequest (solo AIR)

La clase URLRequestDefaults permite definir la configuración predeterminada específica de la aplicación de los objetos URLRequest. Por ejemplo, el siguiente código establece los valores predeterminados de las propiedades manageCookies y useCache. Todos los nuevos objetos URLRequest utilizarán los valores especificados para estas propiedades y no los valores predeterminados:

URLRequestDefaults.manageCookies = false; 
URLRequestDefaults.useCache = false;
Nota: la clase URLRequestDefaults se define para el contenido que se ejecuta únicamente en Adobe AIR. No se admite en Flash Player.

La clase URLRequestDefaults contiene un método setLoginCredentialsForHost() que permite especificar un nombre de usuario y una contraseña predeterminados para usarlos con un host específico. El host, definido en el parámetro hostname del método, puede ser un dominio (por ejemplo "www.example.com" ) o un dominio y un número de puerto (por ejemplo "www.example.com:80" . Observe que "example.com" , "www.example.com" , y "sales.example.com" se consideran hosts únicos.

Estas credenciales solo se utilizan si las requiere el servidor. Si el usuario ya se ha autenticado (por ejemplo, desde el cuadro de diálogo de autenticación), llamar al método setLoginCredentialsForHost() no cambiará al usuario autenticado.

El siguiente código establece el nombre de usuario y contraseña predeterminados para las peticiones enviadas a www.example.com:

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

La configuración de URLRequestDefaults solo se aplica al dominio de la aplicación actual con una excepción. Las credenciales transferidas al método setLoginCredentialsForHost() se utilizan para peticiones realizadas en cualquier dominio de aplicación dentro de la aplicación de AIR.

Para obtener más información, consulte la clase URLRequestDefaults en Referencia de ActionScript 3.0 para la plataforma de Adobe Flash .

Esquemas de URI

Los esquemas de URI estándar, como el siguiente, se pueden utilizar en peticiones realizadas desde cualquier entorno limitado de seguridad:

http: y https:

Utilice este esquema para URL de Internet estándar (del mismo modo que se utilizan en un navegador web).

file:

Utilice file: para especificar la URL de un archivo ubicado en el sistema de archivos local. Por ejemplo:

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

En AIR, también se pueden utilizar los siguientes esquemas al definir una dirección URL para el contenido que se ejecuta en el entorno limitado de seguridad de la aplicación:

app:

Utilice app: para especificar una ruta relativa al directorio raíz de la aplicación instalada. Por ejemplo, la siguiente ruta apunta a un subdirectorio de recursos del directorio de la aplicación instalada:

app:/resources 

Cuando se inicia una aplicación de AIR con AIR Debug Launcher (ADL), el directorio de la aplicación es el directorio que contiene el archivo descriptor de la aplicación.

La dirección URL (y la propiedad url ) de un objeto File creado con File.applicationDirectory utiliza el esquema de URI app , tal como se puede ver a continuación:

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

app-storage:

Use app-storage: para especificar una ruta relativa al directorio de almacenamiento de datos de la aplicación. AIR crea un directorio de almacenamiento exclusivo para cada una de las aplicaciones instaladas (y usuarios), lo cual proporciona un lugar útil para guardar datos que son específicos para esa aplicación. Por ejemplo, la siguiente ruta apunta al archivo "prefs.xml" en el subdirectorio "settings" del directorio de almacenamiento de la aplicación:

app-storage:/settings/prefs.xml 

La dirección URL (y la propiedad url ) de un objeto File creado con File.applicationStorageDirectory utiliza el esquema de URI app-storage , tal como se indica a continuación:

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

mailto:

Puede utilizar el esquema mailto en objetos URLRequest transmitidos a la función navigateToURL() . Consulte Apertura de una URL en otra aplicación .

Puede elegir un objeto URLRequest que utilice cualquiera de estos esquemas de URI para definir la petición de URL para varios objetos, como FileStream o Sound. También puede utilizar estos esquemas en contenido HTML que se ejecute en AIR; por ejemplo, es posible utilizarlos en el atributo src de una etiqueta img .

No obstante, solo se pueden utilizar estos esquemas de URI específicos de AIR ( app: y app-storage: ) en contenido del entorno limitado de seguridad de la aplicación. Para obtener más información, consulte Seguridad en AIR .

Configuración de variables URL

Aunque puede añadir variables a la cadena URL directamente, es más sencillo utilizar la clase URLVariables para definir cualquier variable necesaria para la petición.

Hay tres formas de añadir parámetros a un objeto URLVariables:

  • En el constructor URLVariables

  • Con el método URLVariables.decode()

  • Como propiedades dinámicas del propio objeto URLVariables

El siguiente ejemplo ilustra los tres métodos y cómo asignar las variables a un objeto 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;

Cuando se definen variables en el constructor URLVariables o en el método URLVariables.decode() , es importante codificar en la URL los caracteres que puedan tener un significado especial en una cadena URI. Por ejemplo, si utiliza un ampersand en un nombre de parámetro o valor, debe codificarlo cambiando su forma & por %26 para que el ampersand haga de delimitador en los parámetros. La función encodeURIComponent() de nivel superior se puede utilizar para este fin.

Uso de la clase URLLoader

La clase URLLoader permite enviar una petición a un servidor y acceder a la información devuelta. También puede utilizar la clase URLLoader para acceder a archivos del sistema de archivos local en contextos en los que el acceso está permitido (por ejemplo, en el entorno limitado con sistema de archivos local de Flash Player y el entorno limitado de la aplicación de AIR). La clase URLLoader descarga datos desde una URL como texto, datos binarios o variables con codificación URL. La clase URLLoader distribuye eventos como, por ejemplo, complete , httpStatus , ioError , open , progress y securityError .

El modelo de gestión de eventos de ActionScript 3.0 difiere bastante del modelo de ActionScript 2.0, que utilizaba los controladores de eventos LoadVars.onData , LoadVars.onHTTPStatus y LoadVars.onLoad . Para obtener más información sobre la gestión de eventos en ActionScript 3.0, consulte Gestión de eventos

Los datos descargados no están disponibles hasta que finaliza la descarga. Es posible supervisar el progreso de la descarga (bytes cargados y bytes totales) detectando el evento progress que se va a distribuir. No obstante, en ocasiones los archivos se cargan tan rápido que no se llega a distribuir ningún evento progress . Cuando el archivo se ha descargado correctamente, se distribuye el evento complete . Al establecer la propiedad dataFormat de URLLoader, puede recibir datos como texto, como datos binarios sin procesar o como un objeto URLVariables.

El método URLLoader.load() (y opcionalmente el constructor de la clase URLLoader) admite un solo parámetro, request , que es un objeto URLRequest. Un objeto URLRequest contiene toda la información de una sola petición HTTP, como la URL de destino, el método de petición ( GET o POST ), información de encabezado adicional y el tipo MIME (por ejemplo, cuando se carga contenido XML.

Por ejemplo, para cargar un paquete XML en un script de servidor, se podría usar el siguiente código

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

El fragmento de código anterior crea un documento XML denominado dataXML que contiene el paquete XML que se enviará al servidor. El ejemplo establece la propiedad contentType de URLRequest como "text/xml" y asigna el documento XML a la propiedad data de URLRequest. Finalmente, este ejemplo crea un objeto URLLoader y envía la petición al script remoto mediante el método load() .

Uso de la clase URLStream

La clase URLStream proporciona acceso a los datos de descarga a medida que se reciben. La clase URLStream también permite cerrar una transmisión antes de que finalice su descarga. Los datos descargados están disponibles como datos binarios sin procesar.

Cuando lea los datos desde un objeto URLStream, utilice la propiedad bytesAvailable para determinar si hay suficientes datos disponibles antes de leerlos. Se emite un excepción EOFError si se intenta leer más datos de los disponibles.

El evento httpResponseStatus (AIR)

En Adobe AIR, la clase URLStream distribuye un evento httpResponseStatus además del evento httpStatus . El evento httpResponseStatus se distribuye antes de recibid cualquier dato de respuesta. El evento httpResponseStatus (representado por la clase HTTPStatusEvent) incluye una propiedad responseURL (que es la dirección URL desde la que se devolvió la respuesta) y una propiedad responseHeaders (que es un conjunto de objetos URLRequestHeader que representan los encabezados de respuesta devueltos).

Carga de datos desde documentos externos

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

Comunicación con scripts externos

Además de cargar archivos de datos externos, se puede utilizar la clase URLVariables para enviar variables a un script de servidor y procesar la respuesta del servidor. Esto resulta útil, por ejemplo, si está programando un juego y quiere enviar la puntuación del jugador a un servidor para calcular si se deben añadir a la lista de máximas puntuaciones o incluso para enviar la información de conexión del usuario a un servidor para su validación. Un script de servidor puede procesar el nombre y la contraseña del usuario y devolver una confirmación para saber si las credenciales facilitadas por el usuario son válidas.

El siguiente fragmento de código crea un objeto URLVariables denominado variables , que crea una nueva variable denominada name . A continuación, se crea un objeto URLRequest que especifica la dirección URL del script del servidor a la que se deben enviar las variables. Después, establezca la propiedad method del objeto URLRequest para que envíe las variables como una petición HTTP POST . Para añadir el objeto URLVariables a la petición de URL, establezca la propiedad data del objeto URLRequest como el objeto URLVariables creado anteriormente. Para terminar, se crea la instancia de URLLoader y se invoca el método URLLoader.load() , iniciándose así la petición.

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

El código siguiente incluye el contenido del documento greeting.cfm de Adobe ColdFusion® utilizado en el ejemplo anterior:

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