Flex Remoting

Tres son los posibles caminos utilizados por una aplicación Flex para acceder a los datos del servidor. HTTPService, para hacer las tradicionales HTTPrequests (tanto GET como POST, con o sin parametros) y recibir HTTPResponses, WebServices (basados en SOAP) y Remote Objects.

Estos últimos son los que a mi juicio son más interesantes pues es donde se encuentra todo el potencial de lo que antes conociamos como Flash Remoting. Este tipo de objetos son los que deberemos usar para obtener un acceso directo y óptimo a nuestra lógica de servidor. De hecho se recomienda su uso sobre los web services debido a su rápidez cuando se manejan grandes colecciones de datos. La razón es el uso de AMF, un protocolo binario propietario de Macromedia que hace compresión de datos para mandarlos por el cable. Solo se recomienda el uso de Web Services cuando se quiera sacrificar optimización y rendimiento en pro de los standards.

Una ventaja de usar Remote Objects con Flex es que la lógica del servidor puede ser Java, pero no tiene porque. Si queremos, podemos usar PHP (con AMFPHP como gateway), .NET, o Coldfusión. Por otra parte, esta característica, aunque demuestra nuevamente la FLEXibilidad, no odeja de ser anecdótica, puesto que la empresa que utilice Flex normalmente tendrá toda su infraestructura montada sobre Java.

Los Remote Objects por defecto utilizan codificación AMF para aprovechar todo su potencial, pero también puede utilizar SOAP.

A continuación un pequeño ejemplo. Muy básico con lo mínimo para realizar una llamada a un Remote Objects, seguro que los que habeis usado Flash Remoting localizais enseguida las semejanzas. En el se carga un DataGrid con datos de una clase Java muy tonta y que utiliza objetos Usuario:

<mx :Application xmlns:mx="http://www.macromedia.com/2003/mxml">

	</mx><mx :RemoteObject
		id="users_ro"
		source="com.carlosrovira.Usuarios"
		result="user_dg.dataProvider=event.result"
		fault="alert(event.fault.faultstring, 'RemoteObject Error')">
		
			<mx :method name="getUsuarios"/>
	</mx>

	<mx :Button label="Listar Usuarios..." click="users_ro.getUsuarios()"/>

	<mx :  DataGrid id="user_dg" widthFlex="1">
		</mx><mx :columns>
			</mx><mx :Array>
				<mx : DataGridColumn columnName="nombre" headerText="Nombre"/>
				<mx : DataGridColumn columnName="edad" headerText="Edad"/>
				<mx : DataGridColumn columnName="fecha" headerText="Fecha"/>
			</mx><mx :Array>
		</mx><mx :columns>
	</mx><mx :  DataGrid>

</mx><mx :Application>

Ahora las clases Java usadas para las pruebas. Primero la clase Usuario.java:

package com.carlosrovira;

import java.io.Serializable;
import java.util.Date;

public class Usuario implements Serializable
{
        private String nombre;
        private Integer edad;
        private Date fecha;
        
        public String getNombre()
        {
                return nombre;
        }
        
        public void setNombre(String nuevoNombre)
        {
                nombre = nuevoNombre;
        }
        
        public Integer getEdad()
        {
                return edad;
        }
        
        public void setEdad(Integer nuevaEdad)
        {
                edad = nuevaEdad;
        }
        
        public Date getFecha()
        {
                return fecha;
        }
        
        public void setFecha(Date nuevafecha)
        {
                fecha = nuevafecha;
        }
        
        public String toString()
        {
                return "Usuario["
                + getNombre()
                + ", "
                + getEdad()
                + ", "
                + getFecha()
                + "]";
        }
}

…Y Ahora este es el servicio invocado por Flex. Como veis es una clase muy tonta, pero valida para demostrar el uso de los Remote Objects:

package com.carlosrovira;

import java.util.ArrayList;
import java.util.Date;

public class Usuarios
{
        public ArrayList getUsuarios()
        {
                ArrayList al = new ArrayList();
                Usuario u1;
                
                for(int i=0; i&lt;5; i++)
                {
                        u1 = new Usuario();
                        u1.setNombre("usuario_" + i);
                        u1.setEdad(new Integer(10));
                        u1.setFecha(new Date());
                        al.add(u1);
                }
                
                return al;
        }
}

Nota: Tened en cuenta que debeis de configurar el fichero flex-config.xml para permitir el acceso a estas clases. Para ello debeis de poner en la <whitelist> del tag <remote-objects>, y dentro de los servicios sin nombre (es decir, dentro de <unnamed>), la linea correspondiente que de permiso a las clases que vais a usar. En este caso las clases están todas dentro del paquete com.carlosrovira: <source>com.carlosrovira.*</source>

Por último si quereis hacer Debug tanto en cliente como en servidor, modificar el tag <remote-objects-debug> a true. Esto sacaría en el flashlog.txt lo que antes veiamos en el NetConnectionDebuger.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *