AS 3.0/ Flex

Por que dá erro ao carregar um Feed no Datagrid do Flex?

Esse post é dedicado a todos aquiles que já falaram, P…A, quando tentaram colocar para popular um Datagrid no Flex usando algum feed público como UOL, iMasters, Estadão, etc..

Então amigos posso confessar que não só você já tive esse problema, não sou muito de xingar, mas já falei poucas e boas quanto a essa questão. Ai me esqueci de um detalhe que depois de pensar e repensar, 4 copos de café e nada de funcionar lembrei. P…A, é isso. Tá dando problema nisso.

Saiu aquila luz do thomas Ed., achei o meu problema. Pensando no bem estar de todos os participantes da Flex-Brasil e de todos aquiles que faz acontecer nesse exato momento o Adobe Flex 2.0 que muito me orgulha ( Estamos crescendo ). Eis que preparei um pequeno White paper para resolver o problema.

Por que isso acontece?

O Sandbox do Flash Player 7,8,9 é bem restrito quanto a isso, Alguém deve ter lembrado de uma falha crítica que até a Microsoft reportou a antiga Macromedia sobre possíveis técnicas de hijack usando o Flash Player para acessar a máquena do usuário. Então para acabar com o problema foi liberada uma nova versão do player que foi se extendendo até a atual com a mesma técnica de segurança.

Então, quem é o grande vilão?

crossdomain.xml. Por incrível que pareça o grande vilão de ao tentar popular um datagrid com feed e gerar um erro do tipo ” Couldn’t resolve the HTTP protocol” ou do tipo “Unable to found “http://www.urldosite.com.br/feed/” at method invoke”. Calma o grande pilantra da situação é o crossdomain.xml.

Por que tudo isso?

Devido a falha crítica comentada acima na linha 13 acima dessa, a Macromedia pensou em uma solução mais prática para o assunto e resolveu ajudar de forma mais ou menos legal para o ponto de vista de um programador que não está muito ligado a essas coisas.

O melhor de tudo, qual a solução?

Primeiro para saber qual a solução, tem que saber para que serve esse PPA(pequeno poderoso arquevo) que fez você xingar sem parar e até desistir de continuar.

crossdomain.xml serve para restringir certos tipos de acessos ao seu arquevo .swf para que seja bloqueado alguns tipos de trocas de dados entre domínios diferentes. Por exemplo imagine o seguinte caso hipotético.

Mr. Haywire,diz: Eu tenho um arquevo.swf que está no domínio www.drhaywire.com, porém esse meu arquevo.swf carrega dados ou envia dados para outros domínios como www.uol.com.br e www.estadao.com.br. Porém ele não dá nenhum erro* ( geralmente ocorre isso só quando faz no Flash 8, ou quando o programador esquece de debuggar ou dá trace() ai fica sem saber o que ocorre). Porém não carrega, só após muita pesquesa, eu cheguei a uma decisão que tive que mudar para o tal do AJAX.

OK, Ok, Mr. Haywire, se você tivesse conhecido o famoso crossdomain.xml seu arquevo ainda estaria a salvo do botão delete.

Certo, como faço funcionar?

No Flex builder se você tiver a opção marcada no Compiler Paramaters como (-incremental=true), você vai dá algum gás para o seu swf tentar ao máximo executar e ignorar os whitespaces de arquevos .xml ou query de bancos.

Ok, se não tiver habilite já.

Certo, então como fazer?

Só basta criar um novo arquevo de texto, e dentro dele colocar as seguintes tags.

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*" />
</cross-domain-policy>

No caso acima, fiz assim, declarei o tipo de documento que ele é, e criei um tag root que é o cross-domain-policy, que vai setar minhas configurações para o player poder acessar. Logo após criei outro tag que faz a permissão de trocas de dados entre os domínios que eu selecionar, então como não sei quais irei usar, deixo marcado como *, ou melhor, ele vai indexar todos que eu tentar usar.

Salve o arquevo e onde eu devo usar?

Se você for esperto, importe logo para dentro do Flex Project.

File > Import wizard > File System > teu crossdomain.xml dentro da pasta onde seu projeto está aberto.

Ok, só isso e vai funcionar?

Sim vai sim.

Porém eu devo receber muito e-mails perguntando ” Então, como eu vou saber se o meu está funcionando?”.

Bom para saber não há nada melhor do que testar por sí próprio.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="feed.send();" layout="absolute">
<mx:HTTPService id="feed" useProxy="false"  showBusyCursor="true"
	url="http://www.imasters.com.br/feed/"/>
 
	<!-- Criando grid -->
	<mx:DataGrid
		dragEnabled="true"
		id="feediMasters"
		dataProvider="{feed.lastResult.rss.channel.item}"
		x="291" y="31"
		height="229" width="400">
 
		<mx:columns>
		<mx:DataGridColumn width="25" headerText="Excluir">
			<mx:itemRenderer>
					<mx:Component>
						<mx:Image source="@Embed('add.png')"/>
					</mx:Component>
			</mx:itemRenderer>
		</mx:DataGridColumn>
			<mx:DataGridColumn headerText="Descrição" dataField="description"/>
		</mx:columns>
	</mx:DataGrid>
</mx:Application>

No exemplo acima usei o feed geral do iMasters.

Onde ir pegar mais informações sobre isso?

www.crossdomainxml.org