#17 Flash [Q] Tips: Trabajo con webservices en Flash Professional CS4 + ActionScript 3

Recientemente me ha tocado lidiar con un proyecto que basaba la toma de datos de un servidor remoto en el uso de comunicación mediante webservices. Cualquier que haya tenido que hacer algo similar con Flash CS4 o ActionScript 3 dentro de este IDE, se habrá dado cuenta que hemos perdido algo al respecto, más que nada los componentes que nos permitían sobrellevarlo de una manera bastante abstracta.

Si tratamos de tirar de AS3 puro y duro desde el IDE de flash, tampoco encontraremos la manera directa de comunicarnos con webservices… qué pasa, nos han dejado sin esta funcionalidad? Pues sí, pero al menos han dejado un regalo de consolación para que podamos apañárnoslas. Se trata de usar parte de las clases incluidas en el SDK de Flex, en nuestro proyecto Flash, y de esta manera importarlas y poder por tanto contar con clases como: WebService.

Lo primero que tenemos que hacer, es descargarnos el SDK de flex, que lo podemos hacer de forma gratuita desde este enlace. Una vez que lo tenemos descargado y listo en alguna carpeta de nuestro equipo, tendremos que importar los SWC necesarios a nuestro proyecto, para ello vamos a File > Publish Settings > Apartado Flash > Settings de AS3 > Grupo External Library Path. Aqui vamos a pulsar el icono del SWC que se ve en la imagen

Importando SWC del SDK de flex para poder acceder a servicios web desde flash cs4

para incorporar al proyecto los siguientes SWC:

  • framework.swc
  • rpc.swc

Con esto ya podremos tener en nuestro proyecto FlashCS4 las clases necesarias para trabajar con webservices, como se muestra en el siguiente ejemplo:

package com.qinteractiva.blog.webservices 
{
	import flash.display.Sprite;
	import mx.rpc.soap.*;
	import mx.rpc.events.*;

	public class WebserviceQTip extends Sprite
	{
		private var ws:WebService;
		private const WSDL_STOCKQUOTE:String = 'http://www.webservicex.net/stockquote.asmx?wsdl';
			
		public function WebserviceQTip ()
		{
			ws = new WebService();
			ws.addEventListener("load", wsdlLoaded);
			ws.loadWSDL(WSDL_STOCKQUOTE);
		}
		
		private function wsdlLoaded(evt:LoadEvent):void
		{
			var peticion:Operation;
			
			peticion = Operation(ws.getOperation("GetQuote"));
			peticion.addEventListener("fault", onWSFault);
			peticion.addEventListener("result", onWSResult);
			peticion.send('SAN');
		}
		
		private function onWSFault(evt:FaultEvent):void
		{
			trace(evt.fault);
		}
		
		private function onWSResult(evt:ResultEvent):void
		{
			var xml:XML = XML(evt.result);
			trace(xml.toXMLString());
		}
	}
}

Hemos decidido usar un webservice público sacado de webservicex.net (concretamente uno para consultar valores en bolsa), y básicamente los pasos para obtener respuesta son los siguientes:

LINEAS 14-16: Conectamos con el webservice cargando su definición en la clase WebService mediante el WSDL del servicio. En nuestro caso obtenemos la URL del WSDL de la página del webservice.

LINEAS 21-25: Preparamos la petición que haremos al servicio web, mediante la clase Operation. Para ello empleamos el método getOperation del WebService, indicando el nombre de la operación a realizar.

LÍNEA 26: Lanzamos la petición, si requiere parámetros estos se pasan en el método send de forma secuencial, y en el orden en el que los recibe el servicio web. En este caso nos gustaría ver cómo van los negocios de nuestro querido amigo Botín.

LÍNEA 36-37: En el caso de que la respuesta de la petición sea correcta, en este caso lo único que hacemos es convertirla a un objeto XML, y sacarlo por trace para ver su estructura.

Como complemento al TIP, os diremos que no es imprescindible el uso de la clase Operation, se podría hacer la petición con el siguiente código:

_ws = new WebService();
_ws.addEventListener(LoadEvent.LOAD, wsConnected);
_ws.loadWSDL(CONFIG_WS);

function wsConnected(ev:LoadEvent):void
{
	_ws.removeEventListeners(LoadEvent.LOAD, wsConnected);		
	_ws.nombreMetodoServicio.addEventListener(ResultEvent.RESULT, configLoaded);
	_ws.addEventListener(FaultEvent.FAULT, onError);
	_ws.nombreMetodoServicio(parametro);
}

Como podemos ver lo que cambia es que empleamos el nombre del método como método directamente del objeto WebService, y a dicha propiedad es a quien suscribimos el listener resultado. En vez de emplear el método send de Operation, aqui directamente llamamos a un método del webservice que tiene el mismo nombre, pasando los parámetros que se requieran.

Y para terminar, ármate de paciencia a la hora de compilar porque en cuanto incluyes en el proyecto SWCs de flex e importas algunas librerías (por cierto en este ejemplo concreto no hace falta importar los paquetes completos, o quizás alguno de los swc, pero son comunes cuando se quieren usar elementos del Flex Framework), el compilador de Flash Professional las empieza a pasar canutas, por tonto que sea el proyecto, personalmente lo he empleado en un proyecto en AIR reciente, y la compilación empezaba a ser una buena excusa para ir a tomar algo XD

Para quien le guste el videotraining, aquí os dejo esta entrada que trata este tema directamente, y para quien os gusta meter las manos en la masa, los archivos fuentes del ejemplo:

Source Code Webservices CS4

Tags