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&2=%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>
|
|
|