Trabalhando com Flex com um backend em Java, cheguei a conclusão que a melhor alternativa para o projeto seria simplesmente fazer posts de dados do flex para o java e receber XML de volta (o Flex trabalha muito bem com XML).
Mas tem um problema nisto, passar um ou dois valores desta forma é bastante fácil, mas quando eu precisava passar objetos complexos era muito chato passar milhares de parâmetros para uma URL, então tive a idéia de mandar também XML de volta para o Java …
desta forma, o único problema que continuou foi eu precisar escrever manualmente o XML para cada post, sendo que na maioria das vezes eu ja tinha um objeto Flex …
Solucionei isto com uma pequena função utilitária que transforma qualquer objeto em XML, tentei procurar alguma coisa na API padrão, mas não encontrei nada, então escrevi isto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package teste { import mx.utils.ObjectUtil; public class Utils { public static function objectToXml(obj : Object, name : String) : XML{ var result : XML; var info:Object = ObjectUtil.getClassInfo(obj); if(name==null) name = info.name; result = new XML("<" + name + "></"+ name + ">"); for each (var qn : QName in info.properties){ var val : Object = obj[qn.toString()]; if(ObjectUtil.isSimple(val)) result[qn.toString()] = val; else result.appendChild(objectToXml(val,qn.toString())); } return result; } } } |
Para usar também é bem fácil:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="appInit()"> <mx:Script> <![CDATA[ import teste.Utils; import mx.utils.ObjectUtil; import mx.controls.Alert; public function appInit() : void { var obj : Object = {name:'teste',address:{street:'rua',number:20}}; Alert.show(Utils.objectToXml(obj,'teste').toXMLString()); } ]]> </mx:Script> </mx:Application> |
e o XML gerado no exemplo é este:
1 2 3 4 5 6 7 | <teste> <address> <number>20</number> <street>rua</street> </address> <name>teste</name> </teste> |
Bom, não sei se esta é a melhor forma de se trabalhar, mas até que gostei da solução
Tags: actionscript, dica, flex, howto
aeee, cara realmente muito legal e útil esse seu post =D
[Tradutor]
Tchê, na real a melhor forma pra tu fazer isto é trabalhar com Remote Object ou Data Service no flex, neste caso tu cria um pojo no lado flex que reflete teu objeto do lado java e diz pra ele que ele é remote, desta forma tu não precisa construir nada de parser de xml, trabalha diretamente com os objetos.
O Flex funciona muito bem desta forma, estou desenvolvendo todo um ECM com flex, java no Backend e JSR 168, e está indo igual a um “Dodge morro abaixo”!!
Bueno, se tu precisares de mais detalhes sobre esta implementação, pregue um grito!!
[]´s
[Tradutor]
Éverton, eu concordo contigo, mas o Data Service não é uma opção para este projeto
[Tradutor]
Cara…muito bom..a função ficou ótima e bem simples….parabéns
[Tradutor]
Discordo, e cocordo com o Éverton, XML é texto, a adobe desenvolveu o protocolo AMF (RemoteObject), justamente para melhorar a comunicação dos dados, uma vez que o AMF provê compactação e tranferência binaria.
Outra… com RemoveObeject, você trabalha como se o Flex chamasse diretamente os métodos java, o que lhe abstrai de ficar fazendo essas classes uteis.
Lembrando também que existe vários Frameworks OpenSource que implementam o AMF 3, como GraniteDataService, OpenAMF, WebOrb, e o mais recém, e acredito definitivo: o BlazeDS, desenvolvido pela própria Adobe, que além de implementar o RemoteObject, implementa o DataPush.
ver: http://www.adobe.com/devnet/flex/articles/datapush.html
Esse sim é o canal, acredito que qualquer framework que se baseia em html hoje, está longe de realizar o DataPush.
Dica dada,
Abraços!
\o/
[Tradutor]
Olá, gostaria de saber se existe o caminho inverso, quero transformar os dados do amf pra xml. Eu consigo acesso direto ao banco, mas só me retorna strings, quero tranformar essa string em um xml. Isso é possível?
Abs
[Tradutor]