jump to navigation

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 .

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.

  1. 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.

Comentarios»

1. Edgardo - julio 29, 2009

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.


Deja un comentario