É possível no Flex 2, hoje, consumir objetos do PHP tal como era feito no Flex 1.5 com o uso do AMFPHP, assim como é possível consumir objetos Java com o OpenAMF sem a necessidade do Flex Data Services.
Para consumir objetos Java diretamente do Flex 2.0 usa-se o componente RemoteObject, que implementa um conjunto de funcionalidades - entre elas a serialização ("tradução") dos objetos - do Java para o ActionScript 3.0. No Flex 2 o RemoteObject troca informação com o servidor utilizando um formato chamado AMF3 (ActionScript Message Format 3), de forma que ele pode conversar com qualquer servidor que também saiba receber e enviar objetos (bem como fazer sua serialização) em AMF3. O Flex Data Service é uma aplicação J2EE para comunicação entre a camada de apresentação feita em Flex e a camada de negócios em Java de alta performance, que além de "falar" em AMF3 e ter o RPC (Remote Procedure Call) via RemoteObject oferece funcionalidades de Messaging (colaboração, push de dados, etc) e de Data Management (sincronização de objetos, clientes off-line, etc). O Flex também pode se comunicar com serviços em SOAP (WebServices) ou via HTTP.
Contudo, nem sempre é possível utilizar um servidor capaz de se comunicar em AMF3, como o Flex Data Services ou o ColdFusion.
A versão anterior do Flex (versão 1.5) era baseada no ActionScript 2.0, cujo formato para troca de dados do RemoteObject era o AMF0 (não existe AMF1 nem AMF2). Para esse formato de troca de mensagens há outros servidores que podem ser utilizados, como o OpenAMF (para Java) e o AMFPHP (para PHP). O ColdFusion já conversava nativamente com o Flex 1.5, assim como faz com o Flex 2.
É esperado que essas tecnologias (OpenAMF e AMFPHP) sejam atualizados para se comunicar também em AMF3 e conversar nativamente com o Flex 2, mas ainda assim é possível utilizar as versões existentes do OpenAMF e AMFPHP que se comunicam apenas via AMF0 com o Flex 2. O que precisa ser feito, basicamente, é dizer para o Flex que os dados que serão trocados estarão no formato AMF0, e não no formato AMF3.
Como o RemoteObject só conversa em AS3, podemos utilizar a classe flash.net.NetConnection que igualmente pode ser utilizada para se comunicar com o servidor e contém uma propriedade (objectEncoding) indicando o encoding dos objetos trocados com o servidor. Essa variável é static e os possíveis valores para ela estão definidos na classe flash.net.ObjectEncoding:
NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;
Assim, podemos criar um novo serviço regido pela classe NetConnection:
public var service:NetConnection = new NetConnection();
E definir qual o endpoint ele acessará:
service.connect("http://localhost:8080/TesteAMF/amfgateway");
A partir daí, basta usar o método call() de nosso serviço (que é um NetConnection) para chamar os métodos no servidor. Nesse momento vamos também definir os responsáveis por tratar a resposta do servidor, utilizando a flash.net.Responder:
service.call("Teste.getArrayList", new Responder(resultHandler, faultHandler));
Abaixo um exemplo completo em Flex 2.0 que se consome uma classe Java via AMF0:
XML:
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application
-
xmlns:mx="http://www.adobe.com/2006/mxml"
-
initialize="initApp()">
-
-
<mx:Script>
-
<![CDATA[
-
import flash.net.ObjectEncoding;
-
import flash.net.NetConnection;
-
import mx.collections.ArrayCollection;
-
import mx.controls.Alert;
-
-
// O serviço poderá ser chamado de qualquer lugar.
-
public var service:NetConnection = new NetConnection();
-
-
[Bindable]
-
public var meses:ArrayCollection;
-
-
public function initApp():void
-
{
-
// define o encoding para amf0
-
NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;
-
-
// Conecta no servidor amf. O endereço é o "endpoint" do RemoteObject
-
service.connect("http://localhost:8080/TesteAMF/amfgateway");
-
}
-
-
public function getArrayList():void {
-
// Chama o método getArrayList da classe Teste.
-
// Define um handler para o o resultado e um para a falha.
-
service.call("Teste.getArrayList", new Responder(resultHandler, faultHandler));
-
}
-
-
public function resultHandler(result:Array):void
-
{
-
meses = new ArrayCollection(result);
-
}
-
-
public function faultHandler(fault:String):void
-
{
-
Alert.show('Erro');
-
}
-
-
]]>
-
</mx:Script>
-
-
<mx:RemoteObject />
-
<mx:ComboBox dataProvider="{meses}" />
-
-
<mx:Button buttonDown="getArrayList()" label="Pegar dados do servidor" />
-
-
</mx:Application>
É possível até mesmo conectar à serviços disponíveis em uma instalação do Flex 1.5. Assim, novas aplicações podem ser desenvolvidas em Flex 2 para aproveitar os novos recursos de interface, até o servidor ser efetivamente migrado para o Flex Data Services.
Esse é um exemplo simples de integração, uma prova de conceito. Boa parte da lógica de conexão com o serviço remoto pode ser encapsulada em uma classe para ser mais fácil de trabalhar. Já há um componente muito interessante chamado RemoteObjectAMF0 que visa justamente isso.
A prática de consumo e troca de objetos é encorajada em relação ao WebService e à serviços HTTP. Além dos ganhos de performance e escalabilidade, há troca (e serialização) dos objetos nativos das linguagens. Prefira o uso do RemoteObject, aproveite os benefícios do AMF.