Estou neste momento a desenvolver um projecto em Flex que consiste na criação de um corrector ortográfico sem recurso a qualquer ficheiro de dicionário (wordlist), mas sim tentando dissecar o Google Web Toolkit e perceber realmente como funciona o seu sistema que está incorporado na toolbar para o firefox.
Inicialmente pensei que seria fácil, visto que pensar que existiria uma API para flash/Flex do Spell Checker do Google, mas enganei-me, e bem!
Andei a vasculhar pelas api’s do Google e seu código (maioritariamente java e/ou js e algum php) e o mais difícil foi encontrar o Script ou ligação que permitia a verificação de texto/palavra nos dicionários do Google, foi então que descobri uma coisa engraçada, o endereço https://www.google.com/tbproxy/ misturado no meio do código, claro que directamente este endereço não está disponível (nem esperava), depois de mais uns minutos encontrei o parâmetro "spell?lang=en" que ao adicionar ao endereço em cima já me "respondia". Tinha descoberto a pólvora!
Depois disto seria fácil, pensei eu…mas piorou, já que o endereço não aceitava parâmetros via URL (GET/POST)… Então, se o servidor me retornava XML, talvez se enviasse XML como POST poderia obter resposta.. fui vasculhar de novo no GWT (Google Web Toolkit) e lá encontrei as devidas instruções XML que seriam enviadas..
Voltei ao Flex e lá fiz o <mx:HTTPService> para ligar a esse endereço, e não é que funcionou…
Os verdadeiro problemas começaram quando coloquei a minha aplicação online, uma verdadeiro quebra cabeças:
Erro:
[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTP"]
Mas que raio era isto? tentei com o URLRequest,/URLVariables e outro erro, SandBox security error, depois de muito pesquisar percebi que o problema ainda era pior do que simples erros de código ou POST para o servidor.
O grande problema é que na realidade o Flash não deixa aceder a um endereço externo directamente, por exemplo o feed api ou o adwords. Parece que é mesmo o problema do sandbox / browser. Este problema seria facilmente contornável se o Google disponibilizasse junto do seu servidor um crossdomain.xml que permitisse o acesso directo, mas parece que o Google insiste em tornar a vida difícil aos programadores Flex/action script.
Bom, estava num beco sem saída.. o que fazer??
Comecei a pensar como ultrapassar este problema, varias sugestões apontavam para o uso deste crossdomain.xml, o que acabou por estar fora de contexto, logo que outras opções tinha? talvez usar uma proxy no HTTPService do Flex, como indica em: Adobe Flex - Setting Proxy , mas coloquei essa hipótese fora de questão para já.
Arranquei para a possibilidade de fazer um Script php que fizesse a comunicação entre o Google e o Flex, já que era possível assim em alguns exemplos de outras api’s do Google.
Depois de alguns minutos dei com outro problema, ao usar o fsockopen(url:porta); reparei que o Google simplesmente não me respondia, mas porque?
Recapitulando:
abre o socket (consegui abrir), enviava os dados:
$dados="<post em XML>";
$envia = "POST /tbproxy/spell?lang HTTP/1.1\r\n";
$envia .= "Host: www.google.com \r\n";
$envia .= "Content-Length: " . strlen($data) . "\r\n";
$envia .= "Content-type: application/x-www-form-urlencoded\r\n";
$envia .= "Connection: Close\r\n\r\n";
Simplesmente não me retornava nada.
Mais uma hora de volta disto e percebi que o problema estava $envia = "POST /tbproxy/spell?lang HTTP/1.1\r\n"; deveria enviar HTTP/1.0 em vez de 1.1. A partir daí foi brincadeira de criança
Trabalho final, chamar o meu script php do Flex, enviar o pedido para correcção e receber os dados no Flex, a partir dai, encontrar as palavras com erros no texto e apresentar as devidas correcções.
Isto tudo parece muito simples, mas passei um dia de volta do sistema de comunicação com o Google.
Brevemente coloco aqui o resultado final








