Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/05/2011, 06:19
MeSientoFlex
 
Fecha de Ingreso: abril-2011
Mensajes: 2
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Webservice no responde

Bueno, he seguido mirando y creo que he encontrado el problema y un par de posibles soluciones. Se ve que a partir de la versión 9.0xx de flash, las restricciones de seguridad cambiaron y ya no es suficiente con el crossdomain.xml:

Cita:
you do not have the same security restrictions when testing your application from the flex builder compared to starting your swf through the flash player (since flash player 9.0xxx the security settings have been changed quite a bit - that´s why the settings in the crossdomain.xml in the domain you´re using is not sufficient)
you´d have to use some kind of proxy to 'pass' the data to your application - do this (the 'quick and diry' approach - you´d have to change the values for the service you are using)
Así que para poder llamar al webservice, necesita hacerse a través de un proxy para evitar las restricciones de seguridad.

Para realizar esto, podemos hacerlo de al menos dos maneras:
  • Por medio del servidor [URL="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS"]BlazeDs[/URL], que hará de proxy. Esta solución aún no la he probado.
  • Implementando una clase en php que haga la llamada al webservice. Para implementar esta clase me he valido de la librería de componentes [URL="http://framework.zend.com/manual/en/learning.quickstart.intro.html"]ZendFramework[/URL], que ya había utilizado con Flex anteriormente.

Para las pruebas iniciales he creado la siguiente clase en un fichero .php:

Código:
class WebserviceProxy {

	var $connection;
	

	public function __construct() {
		set_include_path('../ZendFramework/library/');
		require_once('Zend/Soap/Client.php');		
		$this->connection = new Zend_Soap_Client('http://192.168.1.235/doc.wsdl');		
	}

	public function cancelMission($mission_id) {
		$response = $this->connection->CancelMission($mission_id);
		
		return $response;
	}

}
Una vez tenemos la clase, la podemos importar desde Flash Builder > "Connect to Data/Service" > "PHP" > "Browse PHP Class" y seleccionamos la clase que acabamos de crear, con lo que solamente tendremos que declarar un objeto de ese servicio y realizar la llamada. Finalmente el código quedaría algo parecido a esto:

Código:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			    creationComplete="application1_creationCompleteHandler(event)">

	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.controls.Alert;
			import mx.events.FlexEvent;
			import mx.rpc.AsyncToken;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.InvokeEvent;
			import mx.rpc.events.ResultEvent;
			import mx.rpc.soap.Operation;
			import mx.rpc.soap.SOAPFault;
			
			import services.webserviceproxy.WebserviceProxy;
			[Bindable] 
			private var employees:ArrayCollection = new ArrayCollection();
			private var webserviceProxy:WebserviceProxy = new WebserviceProxy();
			
			protected function button1_clickHandler(event:MouseEvent):void
			{
				
				cancelMissionResult.token = webserviceProxy.cancelMission(5);
				Alert.show("Sending cancel to 5");
				
			}
			
			protected function resultCancelHandler(event:ResultEvent):void
			{
				Alert.show("Result cancel = " + event.result.toString());
			}


			protected function cancelMissionResult_resultHandler(event:ResultEvent):void
			{
				var ret:int = event.result as int;
				Alert.show("Response received = "+ ret);	
			}


			protected function cancelMissionResult_faultHandler(event:FaultEvent):void
			{
				Alert.show(event.fault.faultString + "\n" + event.fault.faultDetail, "Fault Information");
			}

		]]>
	</fx:Script>

	<fx:Declarations>
		
		<s:CallResponder id="cancelMissionResult" result="cancelMissionResult_resultHandler(event)"
						  fault="cancelMissionResult_faultHandler(event)" />
		
	</fx:Declarations>
	<s:Button x="298" y="161" label="Cancel" click="button1_clickHandler(event)"/>
</s:Application>
Bueno, espero que esta solución le sirva a alguien