Primeiro post sobre ActionScript =)
Seguindo a aula do Gholias sobre AJAX , decidi fazer o mesmo script em Flash, pra demonstrar a utilização de uma técnica que batizei de AFAX (Asynchronous Flash And XML) - hey, se podem inventar a sigla AJAX eu também posso! ;)
Passo 1: A interface

Coisa simples, só lembre-se de nomear os itens de acordo:
Campo de texto do CEP: nome: "cep_txt", tipo: input
Campo de texto da Cidade: nome: "cidade_txt", tipo: dynamic
Campo de texto do Estado: nome: "estado_txt", tipo: dynamic
"Aguarde...": movieclip, nome: "progresso_mc"
Passo 2: ActionScript
(leia os comentários)
// esconde o indicador de "aguarde"
progresso_mc._visible = false;
// ignorar espaço em branco no XML é sempre uma boa =)
XML.prototype.ignoreWhite = true;
// este vai ser o objeto que irá conter a resposta do servidor
var respostaXML:XML = new XML();
// esta função será executada assim que o server enviar a resposta
respostaXML.onLoad = function(sucesso:Boolean) {
// esconde novamente o indicador de "aguarde" - o resultado já chegou
progresso_mc._visible = false;
if (sucesso) {
// servidor respondeu
cidade_txt.text = this.firstChild.attributes.cidade;
estado_txt.text = this.firstChild.attributes.estado;
} else {
// servidor nao respondeu, provavelmente está indisponível
cidade_txt.text = "Erro acessando servidor";
estado_txt.text = "XX";
}
};
/* esta função será chamada quando o campo "cep" perder o foco, ou seja,
quando o usuario "sair" do campo, dando enter, tab, clicando fora, etc... */
cep_txt.onKillFocus = function() {
// mostra o indicador de "aguarde"
progresso_mc._visible = true;
// objeto que será enviado para o servidor
var enviaXML:XML = new XML();
// formata os dados a serem enviados no XML
var elemento:XMLNode = enviaXML.createElement("ceps");
elemento.attributes.cep = cep_txt.text;
// adiciona os dados ae objeto XML
enviaXML.appendChild(elemento);
/* precisa explicitamente definir isso, senão o XML vai para o servidor como
POST_DATA, e nao RAW_POST_DATA */
enviaXML.contentType = "text/xml";
/* envia o XML para o servidor, e passa como argumento o objeto que receberá
a resposta do servidor */
enviaXML.sendAndLoad("retorna_cep.php", respostaXML);
};
Passo 3: PHP
(leia os comentários)
<?php
// Arquivo: retorna_cep.php
// Este é o XML recebido pelo Flash
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
// lista com os CEPS válidos - idealmente isso deve ser substituido
// por uma chamada a um banco de dados
"12345678" =>
array("cidade" =>
"Campinas",
"estado" =>
"SP"),
"21598000" =>
array("cidade" =>
"New York",
"estado" =>
"NY"),
"13450000" =>
array("cidade" =>
"Sta. Barbara",
"estado" =>
"SP")
);
// Função para "decifrar" o XML recebido
function startElement($parser, $name, $attrs) {
if ("CEPS" == $name) {
$cep = $attrs["CEP"];
}
}
function endElement($parser, $name) {}
// Rodando o "decifrador" =P
// Atribuindo variáveis para retorno
if ($lista["$cep"]) {
$cidade = $lista["$cep"]["cidade"];
$estado = $lista["$cep"]["estado"];
} else {
$cidade = "CEP Indisponivel";
$estado = "XX";
}
// Envia o resultado de volta para o Flash
// Como é somente uma linha, um simples print já basta pra montar o XML
print "<cep cidade=\"" .
$cidade .
"\" estado=\"" .
$estado .
"\" />";
?>
Pronto, coloque os arquivos em um servidor Web com PHP instalado e rode pelo navegador.
Nota: Necessário Flash Player 7. Roda no 6 com algumas alterações no código.