Carregamento de dados externos

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

O ActionScript 3.0 inclui mecanismos para carregamento de dados de fontes externas. As origens podem fornecer conteúdo estático, como arquivos de texto, ou conteúdo dinâmico, como o conteúdo gerado por um script da Web. Os dados podem ser formatados de diversas maneiras, e o ActionScript oferece a funcionalidade para decodificá-los e acessá-los. Você também pode enviar dados para o servidor externo como parte do processo de recuperação de dados.

Uso da classe URLRequest

Muitas APIs que carregam dados externos utilizam a classe URLRequest para definir as propriedades da solicitação de rede necessária.

Propriedades de URLRequest

Você pode definir as propriedades a seguir de uma objeto URLRequest em qualquer área de segurança:

Propriedade

Descrição

contentType

O tipo de conteúdo MIME de qualquer dado enviado com a solicitação de URL. Se nenhum valor é definido para contentType, os valores serão enviados como application/x-www-form-urlencoded .

data

Um objeto contendo dados a serem transmitidos com a solicitação de URL.

digest

Uma string que identifica de forma exclusiva o componente da plataforma Adobe assinado a ser armazenado (ou recuperado) no cache do Adobe® Flash® Player.

method

O método de solicitação HTTP, como uma operação GET ou POST. (O conteúdo em execução no domínio de segurança do aplicativo do AIR pode especificar strings diferentes de "GET" ou "POST" como a propriedade method . É permitido qualquer verbo HTTP, e "GET" é o método padrão. Consulte Segurança do AIR .)

requestHeaders

A matriz de cabeçalhos de solicitação HTTP a ser acrescentada à solicitação HTTP. Observe que as permissões para definir alguns cabeçalhos são restritas no Flash Player, assim como no conteúdo do AIR executado fora da área de segurança do aplicativo.

url

Especifica a URL a ser solicitada.

No AIR, você pode definir propriedades adicionais da classe URLRequest, disponíveis somente no conteúdo AIR, executado na área de segurança do aplicativo. O conteúdo na caixa de proteção do aplicativo também pode definir URLs usando novos esquemas de URL (além de esquemas padrão, como file e http ).

Propriedade

Descrição

followRedirects

Especifica se os redirecionamentos devem ser seguidos ( true , o valor padrão) ou não ( false ). Isso só recebe suporte na caixa de proteção do aplicativo do AIR.

manageCookies

Especifica se a pilha de protocolo HTTP deve gerenciar cookies ( true , o valor padrão) ou não ( false ) desta solicitação. Definir essa propriedade só recebe suporte na caixa de proteção do aplicativo do AIR.

authenticate

Especifica se as solicitações de autenticação relativas a esta solicitação devem ser manipuladas ( true ). Definir essa propriedade só recebe suporte na caixa de proteção do aplicativo do AIR. O padrão é autenticar as solicitações, o que pode fazer com que seja exibida uma caixa de diálogo de autenticação se o servidor exigir as credenciais. Você também pode definir o nome de usuário e a senha utilizando a classe URLRequestDefaults — consulte Definir os padrões de URLRequest (somente AIR) .

cacheResponse

Especifica se os dados de resposta devem ser armazenados em cache para esta solicitação. Definir essa propriedade só recebe suporte na caixa de proteção do aplicativo do AIR. O padrão é armazenar a resposta em cache ( true ).

useCache

Especifica se o cache local deve ser consultado antes que URLRequest saia em busca dos dados. Definir essa propriedade só recebe suporte na caixa de proteção do aplicativo do AIR. O padrão ( true ) é usar a versão armazenada no cache local, se disponível.

userAgent

Especifica a string user-agent a ser usada na solicitação HTTP.

Nota: A classe HTMLLoader tem propriedades relacionadas para configurações que pertencem ao conteúdo carregado por um objeto HTMLLoader. Para obter detalhes, consulte Sobre a classe HTMLLoader .

Definir os padrões de URLRequest (somente AIR)

A classe URLRequestDefaults permite definir configurações padrão específicas do aplicativo para objetos URLRequest. Por exemplo, o código abaixo define os valores padrão para as propriedades manageCookies e useCache. Todos os objetos URLRequest novos utilizarão os valores especificados para essas propriedades, em vez dos padrões normais:

URLRequestDefaults.manageCookies = false; 
URLRequestDefaults.useCache = false;
Nota: A classe URLRequestDefaults é definida para o conteúdo em execução apenas no Adobe AIR. Não há suporte no Flash Player.

A classe URLRequestDefaults inclui um método setLoginCredentialsForHost() que permite especificar um nome de usuário e uma senha padrão para uso em um determinado host. O host, definido no parâmetro hostname do método, pode ser um domínio, como "www.example.com" , ou um domínio e um número de porta, como "www.example.com:80" . Observe que "example.com" , "www.example.com" e "sales.example.com" são todos considerados hosts únicos.

Essas credenciais só serão utilizadas se exigidas pelo servidor. Se o usuário já foi autenticado (por exemplo, utilizando a caixa de diálogo de autenticação), a chamada do método setLoginCredentialsForHost() não altera o usuário autenticado.

O código a seguir define o usuário padrão e a senha utilizada para solicitações enviadas para www.example.com:

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

As configurações de URLRequestDefaults somente se aplicam ao domínio atual do aplicativo, com uma exceção. As credenciais enviadas para o método setLoginCredentialsForHost() são utilizadas para solicitações feitas em qualquer domínio de aplicativo, dentro do aplicativo do AIR.

Para obter mais informações, consulte a classe URLRequestDefaults em Referência do ActionScript® 3.0 para Adobe® Flash® Platform .

Esquemas de URI

Os esquemas padrão de URI como os esquemas a seguir, podem ser utilizados em solicitações feitas a partir de qualquer área de segurança:

http: e https:

Utilize-as para URLs padrão da Internet (da mesma forma como são utilizadas pelo navegador a Web).

arquivo:

Use file: para especificar o URL de um arquivo localizado no sistema de arquivos local. Por exemplo:

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

No AIR, também é possível utilizar os esquemas a seguir para definir o URL para conteúdo em execução na área de segurança do aplicativo:

app:

Use app: para especificar um caminho relativo ao diretório raiz do aplicativo instalado. Por exemplo, o seguinte caminho aponta para um subdiretório de recursos do diretório do aplicativo instalado:

app:/resources 

Quando o aplicativo do AIR é executado utilizando o AIR Debug Launcher (ADL), o diretório do aplicativo é o diretório que contém o arquivo descritor do aplicativo.

O URL (e a propriedade url ) de um objeto File criado com File.applicationDirectory utiliza o esquema de URI app , como mostrado a seguir:

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

app-storage:

Use app-storage: para especificar um caminho relativo ao diretório de armazenamento de dados do aplicativo. Para cada aplicativo (e usuário) instalado, o AIR cria um diretório exclusivo de armazenamento do aplicativo, que é um local útil para armazenar dados específicos desse aplicativo. Por exemplo, o caminho a seguir aponta para o arquivo prefs.xml em um subdiretório de configurações do diretório de armazenamento do aplicativo:

app-storage:/settings/prefs.xml 

A URL (e a propriedade url ) de um objeto File criado com File.applicationStorageDirectory usa o esquema de URL app-storage , como no exemplo abaixo:

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

mailto:

Você pode usar o esquema mailto em objetos URLRequests enviados para a função navigateToURL() . Consulte Abertura de um URL em outro aplicativo .

Você pode usar um objeto URLRequest que utiliza qualquer um desses esquemas de URL para definir uma solicitação de diferentes objetos como, por exemplo, um objeto FileStream ou Sound. Também é possível usar esses esquemas em um conteúdo HTML em execução no AIR; por exemplo, você pode usá-los no atributo src de uma tag img .

Porém, você só pode usar estes esquemas de URI específicos do AIR, ( app: e app-storage: ) no conteúdo localizado na área de segurança do aplicativo. Para obter mais informações, consulte Segurança do AIR .

Definição de variáveis de URL

Embora seja possível adicionar variáveis diretamente na sequência de caracteres do URL, pode ser mais fácil utilizar a classe URL Variables para definir quaisquer variáveis necessárias para uma solicitação.

Existem três formas em que é possível adicionar parâmetros a um objeto URLVariables:

  • No construtor URLVariables

  • Com o método URLVariables.decode()

  • Como propriedades dinâmicas no próprio objeto URLVariables

O exemplo a seguir ilustra todos os três métodos e também como atribuir variáveis ao 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;

Ao definir variáveis no construtor URLVariables ou no método URLVariables.decode() , certifique-se de que os caracteres que possuem um significado especial em uma sequência de caracteres de URI sejam codificados em formato URL. Por exemplo, ao utilizar o & (e comercial) em um nome de parâmetro ou valor, é necessário codificar o &, alterando-o de & para %26 , porque o & atua como um delimitador de parâmetros. A função de nível superior encodeURIComponent() pode ser utilizada para isso.

Uso da classe URLLoader

A classe URLLoader permite enviar uma solicitação ao servidor e acessar as informações retornadas. Você também pode utilizar a classe URLLoader para acessar arquivos no sistema de arquivos local, onde o acesso de arquivos é permitido (por exemplo, na área de segurança local do Flash Player e do aplicativo do AIR). A classe URLLoader baixa dados de um URL como texto, dados binários ou variáveis codificadas em URL. A classe URLLoader envia eventos como complete , httpStatus , ioError , open , progress e securityError .

O modelo de manipulação de eventos do ActionScript 3.0 é substancialmente diferente do modelo do ActionScript 2.0 que utilizava os manipuladores de evento LoadVars.onData , LoadVars.onHTTPStatus e LoadVars.onLoad . Para obter mais informações sobre como tratar eventos no ActionScript 3.0, consulte Manipulação de eventos

Os dados descarregados só ficam disponíveis depois que o download é concluído. Você pode monitorar o andamento do download (bytes carregados e total de bytes) ouvindo o evento progress a ser despachado. No entanto, se um arquivo é carregado muito rapidamente, o evento progress pode não ser despachado. Quando um arquivo é baixado com sucesso, o evento complete é despachado. Ao definir a propriedade URLLoader dataFormat , é possível receber os dados como texto, raw, dados binários ou como objeto URLVariables.

O método URLLoader.load() (e opcionalmente o construtor da classe URLLoader) utiliza um único parâmetro, request , que é um objeto URLRequest. Um objeto URLRequest contém todas as informações para uma única solicitação HTTP, como o URL de destino, método de solicitação ( GET ou POST ), informações de cabeçalho adicionais e o tipo MIME.

Por exemplo, para carregar um pacote XML em um script de servidor, você pode usar o seguinte 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); 

O snippet anterior cria um documento XML denominado dataXML que contém um pacote XML a ser enviado ao servidor. O exemplo define a propriedade URLRequest contentType para "text/xml" e atribui o documento XML à propriedade URLRequest data . Por fim, o exemplo cria um objeto URLLoader e envia a solicitação para o script remoto utilizando o método load() .

Uso da classe URLStream

A classe URLStream fornece acesso aos dados descarregados conforme os dados se tornam disponíveis. A classe URLStream também permite encerrar um fluxo antes que o seu download seja finalizado. Os dados descarregados estão disponíveis como dados binários raw.

Ao ler dados de um objeto URLStream, use a propriedade bytesAvailable para determinar se dados suficientes estão disponíveis antes da leitura. Uma exceção EOFError é enviada se você tentar ler mais dados do que o disponível.

O evento httpResponseStatus (AIR)

No Adobe AIR, a classe URLStream envia um evento httpResponseStatus além do evento httpStatus . O evento httpResponseStatus é entregue antes de quaisquer dados de resposta. O evento httpResponseStatus (representado pela classe HTTPStatusEvent) inclui uma propriedade responseURL , que é o URL do qual a resposta foi retornada, e uma propriedade responseHeaders , que é uma matriz de objetos URLRequestHeader representando os cabeçalhos de resposta retornados pela resposta.

Carregamento de dados de documentos externos

Ao construir aplicativos dinâmicos, pode ser útil carregar os dados de arquivos externos ou de scripts do lado do servidor. Isso permite criar aplicativos dinâmicos sem precisar editar ou recompilar seu aplicativo. Por exemplo, se você criar um aplicativo “dica do dia”, poderá gravar um script do lado do servidor que recupera uma dica aleatória de um banco de dados e salva-a em um arquivo de texto uma vez por dia. Em seguida, o aplicativo pode carregar o conteúdo de um arquivo de texto estático em vez de consultar o banco de dados a cada vez.

O seguinte snippet cria um objeto URLRequest e URLLoader que carrega o conteúdo de um arquivo de texto externo, params.txt:

var request:URLRequest = new URLRequest("params.txt"); 
var loader:URLLoader = new URLLoader(); 
loader.load(request);
Por padrão, se você não definir um método de solicitação, o Flash Player e o Adobe AIR carregarão o conteúdo usando o método GET HTTP. Para enviar os dados usando o método POST , defina a propriedade request.method como POST usando a constante estática URLRequestMethod.POST , conforme mostrado no seguinte código:
var request:URLRequest = new URLRequest("sendfeedback.cfm"); 
request.method = URLRequestMethod.POST;

O documento externo (params.txt), que é carregado no tempo de execução, contém os seguintes dados:

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

O arquivo contém dois parâmetros: monthNames e dayNames . Cada parâmetro contém uma lista separada por vírgulas que é analisada como strings. Você pode dividir essa lista em uma matriz usando o método String.split() .

Evite usar palavras reservadas ou construções de linguagem como nomes de variáveis em arquivos de dados externos, porque isso dificulta a leitura e a depuração do código.
Depois que os dados são carregados, o evento complete é despachado, e o conteúdo do documento externo fica disponível para uso na propriedade data de URLLoader, como ilustrado neste código:
function completeHandler(event) 
{ 
    var loader2 = event.target; 
    air.trace(loader2.data); 
}

Se o documento remoto contém pares de nome e valor, é possível analisar os dados através da classe URLVariables passando o conteúdo do arquivo carregado, como segue:

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

Cada par de nome e valor do arquivo externo é criado como propriedade no objeto URLVariables. Cada propriedade no objeto variables do exemplo de código anterior é tratada como string. Se o valor do par de nome e valor é uma lista de termos, você pode converter a string em qualquer matriz chamando o método String.split() , como segue:

var dayNameArray:Array = variables.dayNames.split(",");
Se você estiver carregando dados numéricos de arquivos de texto externos, converta os valores em valores numéricos usando a função de nível superior, como int() , uint() ou Number() .

Em vez de carregar o conteúdo do arquivo remoto como uma string e criar um novo objeto URLVariables, você pode definir a propriedade URLLoader.dataFormat como uma das propriedades estáticas encontradas na classe URLLoaderDataFormat. Os três valores possíveis para a propriedade URLLoader.dataFormat são os seguintes:

  • URLLoaderDataFormat.BINARY — a propriedade URLLoader.data contém dados binários armazenados em um objeto ByteArray.

  • URLLoaderDataFormat.TEXT — a propriedade URLLoader.data contém texto em um objeto String.

  • URLLoaderDataFormat.VARIABLES — a propriedade URLLoader.data contém variáveis codificadas em URL armazenadas em um objeto URLVariables.

O código a seguir demonstra como a configuração da propriedade URLLoader.dataFormat como URLLoaderDataFormat.VARIABLES permite analisar automaticamente dados carregados em um 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: O valor padrão de URLLoader.dataFormat é URLLoaderDataFormat.TEXT .

Como ilustrado no exemplo a seguir, carregar XML de um arquivo externo é o mesmo que carregar URLVariables. Você pode criar uma ocorrência de URLRequest e uma de URLLoader e usá-las para baixar um documento XML remoto. Quando o arquivo é baixado completamente, o evento Event.COMPLETE é despachado e o conteúdo do arquivo externo é convertido para uma ocorrência XML, que pode ser analisada usando métodos e propriedades 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()); 
        } 
    } 
}

Comunicação com scripts externos

Além de carregar arquivos de dados externos, você pode usar também a classe URLVariables para enviar variáveis a um script do lado do servidor e processar a resposta do servidor. Isso é útil, por exemplo, se você está programando um jogo e deseja enviar a pontuação do usuário para um servidor, que calculará se ela deve ser adicionada à lista de pontuações mais altas, ou mesmo enviar informações de logon de um usuário para um servidor validá-las. Um script de servidor pode processar o nome do usuário e a senha, validá-los em um banco de dados e confirmar se as credenciais fornecidas pelo usuário são válidas.

O seguinte snippet cria um objeto URLVariables denominado variables que cria uma nova variável chamada name . Em seguida, é criado um objeto URLRequest que especifica a URL do script de servidor para a qual enviar as variáveis. Depois, você define a propriedade method do objeto URLRequest para enviar as variáveis como uma solicitação HTTP POST . Para adicionar o objeto URLVariables à solicitação de URL, defina a propriedade data do objeto URLRequest como o objeto URLVariables criado anteriormente. Por fim, é criada a ocorrência de URLLoader e o método URLLoader.load() , que inicia a solicitação, é chamado.

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

O código a seguir contém o conteúdo do documento greeting.cfm do Adobe ColdFusion® usado no exemplo 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>