DevSecOps

28 jan, 2009

Leitura de arquivos externos no ActionScript 3.0

Publicidade

Chamando URLs externas

No ActionScript 2.0, para chamar uma URL externa, utilizávamos o método getURL, que pedia uma String contendo o caminho da URL.

No ActionScript 3.0, todo caminho de URL é do tipo URLRequest, que pede como parâmetro uma String contendo o caminho da URL. Isso vale para qualquer chamado externo, seja com caminho local ou global.

Na nova versão podemos armazenar em arquivos externos não somente classes e interfaces, mas também funções, como é o caso abaixo com o navigateToURL que substitui o getURL.

import flash.net.URLRequest;
import flash.net.navigateToURL;
var chama:URLRequest = new URLRequest("http://www.leandroamano.com.br");
navigateToURL(chama);

Lendo arquivos externos (.txt e .xml)

O conteúdo do site deve sempre estar bem dividido para que assim haja uma fácil manutenção para o administrador do site, bem como fácil acesso dos usuários. Neste artigo iremos observar como funciona o carregamento de dados textuais externos, da maneira mais simples possível.

Também podemos utilizar XML ou Flash Remoting (sistema AMF) para envio e recebimento de dados com o servidor, através de chamadas assíncronas. Este último foi estudado no artigo anterior.

Existe uma série de utilidades para usar o servidor como acesso e/ou envio de dados, que incluem:

  • Enviar valores de um formulário para armazenamento num banco de dados.
  • Enviar valores de um formulário para um ou mais e-mails.
  • Carregar valores de um texto para criação de links ou novidades.
  • Carregar valores a partir de um arquivo de servidor para exibição de uma aplicação simples como uma galeria de fotos, ou mesmo uma aplicação mais complexa como um e-commerce.
  • Enviar valores e aguardar uma resposta como, por exemplo, um acesso restrito de usuário e senha.

A forma de acesso a esses dados é dada em pares de valores, por exemplo, nome=valor.

Quando se tem mais pares de valores, é necessário utilizar o símbolo &, por exemplo, nome=valor&nome2=valor2

Carregando arquivos de dados externos

O objeto usado será o URLLoader que substitui o LoadVars do ActionScript 2.0.

Para carregar dados externos definiremos dois arquivos, o primeiro um texto simples, e o segundo um arquivo de servidor, em nosso exemplo o ColdFusion.

O formato de retorno vem em valores em pares, ou seja, variável=valor, determinamos então que o formato é: (flash.net.URLLoaderDataFormat.VARIABLES)

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.load(new URLRequest("texto.txt"));

É necessário saber também quando os dados estão disponíveis. O evento event.COMPLETE nos avisa e, quando executado, podemos aplicar um loop no resultado:

function handleComplete(event:Event):void {
	trace("O Resultado pode ser apresentado");
	for (var i:String in resposta.data) {
		trace(i + " = "+ resposta.data[i]);
	}
}

Um exemplo completo pode ser observado abaixo:

//Arquivo texto.txt

nome=Leandro+Amano&numero=1234


//Arquivo index.cfm

<cfsetting enablecfoutputonly="yes">
<cfprocessingdirective suppresswhitespace="yes">
	<cfset someText = "teste">
	<cfoutput>someText=#someText#</cfoutput>
</cfprocessingdirective>


//Arquivo .fla

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;

import flash.events.IOErrorEvent;
import flash.events.HTTPStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.events.Event;

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;


loader.addEventListener(IOErrorEvent.IO_ERROR, handleIOError);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, handleHTTPStatus);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleSecurityError);
loader.addEventListener(Event.COMPLETE, handleComplete);

//loader.load(new URLRequest("texto.txt"));
loader.load(new URLRequest("http://localhost:8500/as3/index.cfm"));

function handleIOError(event:IOErrorEvent):void {
	trace("Loade failed: IO error: "+event.text);
}
function handleHTTPStatus(event:HTTPStatusEvent):void {
	trace("Load status: HTTP status: "+event.status);
}
function handleSecurityError(event:SecurityErrorEvent):void {
	trace("Load failed: Security Error: "+event.text);
}
function handleComplete(event:Event):void {
	trace("The data has successfully loaded");
	var resposta:URLLoader = URLLoader(event.target);
	trace(resposta.data.nome);
	trace(resposta.data.numero);
	for (var i:String in resposta.data) {
		trace(i + " = "+ resposta.data[i]);
	}
}

Objeto XML

Desde o ActionScript 1 (Flash Player 5) o Flash possuía a capacidade de ler objetos XML externos, baseados no DOM (W3C Document Object Model), o padrão para interação com documentos XML.

Em ActionScript 3.0 a classe XML foi totalmente modificada. XML é um tipo nativo do Flash, antigos métodos e propriedades para a leitura desses dados externos (firstChild, childNodes, etc) se encontram agora na classe XMLDocument, localizada no pacote flash.xml.

A ActionScript 3.0 implementa o padrão ECMAScript for XML (E4X) que não será discutido agora.

//Top Level class XML
var xml:XML = <doc>
	<curso>ActionScript 3.0</curso>
	<curso>Adobe Flex 3</curso>
	<curso>Adobe Dreamweaver CS3</curso>
	<curso>Adobe ColdFusion 8</curso>
</doc>;

Lendo um XML externo

Para a leitura de um XML externo utilizaremos uma leitura de arquivo externo comum como vimos acima. Dentro do evento Event.COMPLETE, trataremos o objeto lido como um XMLDocument.

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.xml.XMLDocument;
import flash.events.Event;

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("xml_externo.xml"));

function onComplete(e:Event):void {
	var xml:XML = XML(e.currentTarget.data);
	
	var xmlDoc:XMLDocument = new XMLDocument();
	xmlDoc.ignoreWhite = true;
	xmlDoc.parseXML(xml);
	
	var tamanho:uint = xmlDoc.firstChild.childNodes.length;
	
	for(var i:uint; i<tamanho; i++){
		// ActionScript 3.0
// Adobe Flex 3
// Adobe Dreamweaver CS3
// Adobe ColdFusion 8
		trace(xmlDoc.firstChild.childNodes[i].firstChild.nodeValue);
	}
}