Servicios Web WCF con PHP julio 18, 2009
Posted by xibian in General.trackback
Hola, si bien días atras habiamos definido NuSoap como la herramienta para consumir el servicio web WCF, debido a incovenientes que teniamos con los tipos de datos , por ejemplo si en el WCF devolviamos un string en php al mostrar el resultado nos mostraba un char.
Este hecho motivo a iterar el plan de desarrollo con una nueva herramienta que es la extensión soap nativa de php , la cual soporta especificaciones SOAP 1.1 , SOAP 1.2 y WSDL 1.1 según su página oficial.
Instalación de las extensiones SOAP php
Cabe mencionar que estamos usando Windows 7 con IIS7 corriendo en el puerto 80 para el WCF service y Wamp 2.0 cuyo Apache corre en el puerto 88, en esta entrada del blog aprendimos como configurar apache y iis en un mismo equipo.
1. Abrimos la consola del wamp y nos dirigimos a PHP > PHP settings > allí encontraremos todas las extensiones disponibles por wamp, entre las cuales está la extensión SOAP que deseamos habilitar.
2. Buscamos y habilitamos dando click sobre php_soap , el wamp2.0 automaticamente se reiniciará para cargar la nueva configuración.
Tendremos instalada la extension SOAP en PHP.
Escribiendo el Servicio WCF
Escribiremos un servicio que reciba dos parámetros numéricos y luego retornará la suma de ambos números.
1. Abrimos Visual Studio como administrador, seguiremos en el ejemplo trabajando con el TestService que creamos en un post anterior.
2. Dando click derecho sobre la solución TestService agregamos un nuevo item de tipo WCF Service y le llamamos Operaciones.svc.
3. Visual Studio nos creará lo siguiente, un archivo Operaciones.svc, el archivo IOperaciones.cs interface que contiene la declaración de nuestro método sumar y Operaciones.cs que es la clase que implementa la interface IOperaciones.cs.
4. Abrimos IOperaciones.cs y declaramos el método sumar como [OperationContract], definiendo que devuelve un double y que recibe dos parámetros.
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Runtime.Serialization;
5: using System.ServiceModel;
6: using System.Text;
7:
8: // NOTE: If you change the interface name "IOperaciones" here, you must also update the reference to "IOperaciones" in Web.config.
9: [ServiceContract]
10: public interface IOperaciones
11: {
12: [OperationContract]
13: double Sumar(double parametro1,double parametro2);
14:
15: }
5. Abrimos Operaciones.cs e implementamos la interface IOperaciones.cs.
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Runtime.Serialization;
5: using System.ServiceModel;
6: using System.Text;
7:
8: // NOTE: If you change the class name "Operaciones" here, you must also update the reference to "Operaciones" in Web.config.
9: public class Operaciones : IOperaciones
10: {
11:
12: public double Sumar(double parametro1, double parametro2)
13: {
14: return parametro1 + parametro2;
15: }
16:
17: }
6. En el Web.config cambiamos a basicHTTPBinding , por defecto tiene wsHttpBinding.
1: <service behaviorConfiguration="OperacionesBehavior" name="Operaciones">
2: <endpoint address="" binding="basicHttpBinding" contract="IOperaciones">
3: <identity>
4: <dns value="localhost" />
5: </identity>
6: </endpoint>
7: <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
8: </service>
7. Construimos la Solución con F6 , vemos que la solución no tiene errores y vamos al navegador a la dirección.
http://diegotoala-xi/TestService/Operaciones.svc
Si queremos ver el wsdl que genera el vs accedemos a:
http://diegotoala-xi/TestService/Operaciones.svc?wsdl
Consumiendo el Servicio WEB WCF con PHP
Antes que nada , gracias a Gunnar Peipman, cuyo blog me sirvio de mucho para hallar la solución, y agregar que estoy utilizando para los ejemplos en PHP el Visual Studio, gracias al componente VS.PHP de jcx software.
- Vamos al C:/wamp/www/ y creamos un archivo que se llame proxy.php y escribimos el siguiente código:
1: <?php
2:
3: header('Content-Type: text/plain');
4:
5: echo "Prueba WCF \r\n\r\n";
6:
7: //Instanciamos el objeto de tipo SoapClient pasando la direccion wsdl del servicio Operaciones
8: $client = new SoapClient('http://diegotoala-xi/TestService/Operaciones.svc?wsdl');
9:
10: //Establecemos que la codificacion sea en UTF-8 que soporta caracteres especiales
11: $client->soap_defencoding = 'UTF-8';
12:
13: //PHP no es fuertemente tipado, eso nos permite tener la siguiente declaracion en la cual
14: //el objeto $obj debe tener una propiedad parametro1 que se llame igual al nombre del parametro que espera
15: //el Operation Contract declarado en el servicio Operaciones
16: $obj->parametro1 =2.5;
17:
18: //Segundo parametro
19: $obj->parametro2 =3.5;
20:
21: echo "Sumar: {$obj->parametro1} + {$obj->parametro2} \r\n";
22:
23: //Llamamos al metodo Sumar y pasamos el objeto $obj que tiene los parametros
24: $retval= $client->Sumar($obj);
25:
26: //El resultado de la suma se devuelve en la variable $retval->SumarResult
27: echo "Resultado: $retval->SumarResult";
28:
29: ?>
2. Revisamos el resultado en http:/localhost:88/soap.php
Hemos consumido el servicio WCF en PHP, ahora nos falta agregarle seguridad para que solo puedan consumirlo sistemas autorizados.
Hasta la próxima.
Sería interesante armar una conferencia en donde se muestre como trabajan los servicios con WCF y mostrar la interacción por ejemplo con aplicaciones win32, con WinMo, con aplicaciones php, etc.