domingo, 1 de febrero de 2009

Video tutorial WebService basico con php


En la version 5.0 de PHP (Desconosco si en las anteriores tambien, pero no lo creo) existe una libreria llamada php_soap.dll, esta librería permite, realizar llamadas a metodos y objetos remotos utilizando el protocolo SOAP.

En este ejemplo veremos de una manera muy sencilla como invocar nuestros dos primeros metodos remotos Suma (Que dado dos numero devuelve la suma de ellos) y Resta (que dados dos numeros devuelve la resta de ellos).

Parte I

Parte II

Para lograr esto debemos cumplir con los siguientes pasos:

  1. Asegurarnos de tener activada la libreria php_soap.dll.
  2. Definir el WSDL del Webservice que vamos a consumir.
  3. Implementar el lado del servidor, donde codificaremos y registraremos las dos funciones.
  4. Deinir el lado del cliente donde invocaremos las dos funciones.
Activando la libreria php_soap.dll

Para hacer esto nos vamos al archivo de configuracion de php llamado php.ini, en este archivo vamos a buscar el php_soap.dll y verificamos que no este comentado, es decir, que no tenga un ";" punto y coma por delante. Algo asi:

;extension=php_shmop.dll
;extension=php_snmp.dll
extension=php_soap.dll
;extension=php_sockets.dll
extension=php_sqlite.dll
Definir el WSDL

Para aprender mejor como definir tu propio WSDL te recomiendo el siguiente artículo de Desarrolloweb.com. Les recomiendo tener este archivo alojado en el servidor donde se encontrará la funcion. En nuestro caso el WSDL quedará de la siguiente manera:

Código scramble.wsdl

<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='Scramble'
targetNamespace='http://localhost/tutoriales/webservice/servidor/scramble.wdsl'
xmlns:tns='http://localhost/tutoriales/webservice/servidor/scramble.wdsl'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>

<message name='sumarRequest'>
<part name='symbol' type='xsd:string'/>
<part name='symbol2' type='xsd:string'/>
</message>
<message name='sumarResponse'>
<part name='Result' type='xsd:string'/>
</message>
<message name='restarRequest'>
<part name='symbol' type='xsd:string'/>
<part name='symbol2' type='xsd:string'/>
</message>
<message name='restarResponse'>
<part name='Result' type='xsd:string'/>
</message>

<portType name='ScramblePortType'>
<operation name='sumar'>
<input message='tns:sumarRequest'/>
<output message='tns:sumarResponse'/>
</operation>
<operation name='restar'>
<input message='tns:restarRequest'/>
<output message='tns:restarResponse'/>
</operation>
</portType>

<binding name='ScrambleBinding' type='tns:ScramblePortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='sumar'>
<soap:operation soapAction='urn:localhost-scramble#sumar'/>
<input>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
<operation name='restar'>
<soap:operation soapAction='urn:localhost-scramble#restar'/>
<input>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>

<service name='ScrambleService'>
<port name='ScramblePort' binding='ScrambleBinding'>
<soap:address location='http://localhost/tutoriales/webservice/servidor/sumar.php'/>
</port>
</service>
</definitions>

El archivo scramble.wsdl debe tener el targetNamespace con la ubicacion de si mismo. Tambien debemos recordar colocar la direccion del archivo del servidor (que en este tutorial se llama sumar.php), esta direcicon se coloca en la seccion Service:
<service name="'ScrambleService'">
<port name="'ScramblePort'" binding="'ScrambleBinding'">
<soap:address location="'http://localhost/tutoriales/webservice/servidor/sumar.php'/">
</soap:address>
</port></service>

Implementando el lado del Servidor:


En este lado vamos a crear nuestras dos funciones Sumar y Restar:
function sumar($a,$b)
{
return $a+$b;
}

function restar($a,$b)
{
return $a-$b;
}
Tambien es necesario decirle al cache del SOAP cuales son las funciones de las que le hablamos en el WSDL, para eso colocaremos el siguiente codigo:

// turn off the wsdl cache
ini_set("soap.wsdl_cache_enabled", "0");

$server = new SoapServer("scramble.wsdl");

$server->addFunction("sumar");
$server->addFunction("restar");

$server->handle();

Al final tendremos un archivo llamado "sumar.php" con el siguiente codigo:

Código sumar.php

<?php

function sumar($a,$b)
{
return $a+$b;
}

function restar($a,$b)
{
return $a-$b;
}

// turn off the wsdl cache
ini_set("soap.wsdl_cache_enabled", "0");

$server = new SoapServer("scramble.wsdl");

$server->addFunction("sumar");
$server->addFunction("restar");

$server->handle();

?>


Definir el lado del Cliente

Para el cliente primero creamos un formulario donde se introduciran los dos numeros que deseamos sumar, luego (si ya se recibieron los dos numeros por el metodo POST) lo que tenemos que hacer es crear un objeto SoapClient diciendole la ubicacion de nuestro WSDL, luego podremos llamar a los metodos sumar y restar como si fueran metodos de este objeto. El codigo del archivo client.php nos queda de la siguiente manera:

Código client.php
<form id="form1" name="form1" method="post" action="">
<table width="23%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>a: </td>
<td><input name="a" type="text" id="a" size="5" /></td>
</tr>

<tr>
<td>b: </td>
<td><input name="b" type="text" id="b" size="5" /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="button" id="button" value="Submit" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['a']) && isset($_POST['b']))
{
// turn off the WSDL cache
ini_set("soap.wsdl_cache_enabled", "0");

$client = new SoapClient("http://ejemplos.net78.net/webservice/servidor/scramble.wsdl");

$a = $_POST['a'];
$b = $_POST['b'];

$resultado = $client->sumar($a,$b);
print("La suma de los numeros : $a + $b es: $resultado <br>");

$resultado = $client->restar($a,$b);
print("La resta de los numeros : $a + $b es: $resultado");
}

?>

Lamentablemente no puedo demostrar este ejemplo funcionando, ya que el hosting php con el que trabajo no tiene habilitada la libreria
php_soap.dll. Por ende, solo les puedo dejar un link para descargar el ejemplo.

37 comentarios:

  1. Uno de los ejemplos mas claros acerca de Web Services que he visto. Muchas gracias!

    ResponderEliminar
  2. Opino lo mismo. Muchas gracias.

    ResponderEliminar
  3. Muchisimas Gracias!!! tu ejemplo es una maravilla!....lo básico pero perfecto para comprender la esencia del asunto de los web services!!!

    ResponderEliminar
  4. Muchisinas Gracias!!!! no sabes lo claro que me dejo el tema de web service. 10 puntos la verdad cortito pero al pie.-
    CN

    ResponderEliminar
  5. es un ejemplo sencillo pero muy claro y entendible muchisimas gracias

    ResponderEliminar
  6. el video muy bueno pero no se puede descargar el ejemplo lo tienes roto, espero se pueda descargar gracias.

    ResponderEliminar
  7. tienes toda la razon, ya he corregido el vinculo que estaba roto. Disculpame esa!

    ResponderEliminar
  8. ola!! me marca un error a la ora de correrlo
    "FATAL ERROR CLASS SOAP CLIENT NOT FOUND" me podrian ayudar a corregir el error. . . . gracias

    ResponderEliminar
  9. Exelente lo mejor que hay en la red att GIL(GCC)

    ResponderEliminar
  10. Hola como estas Alejandro muy bueno tu tutorial soy de Lima - Peru y actualente deseo involucrarme mas sobre el tema de web services por un proyecto que me ha salido desearia saber si tienes mas tutoriales o como podria contactarte para tu asesoramiento mi mail es faguilar@tecprovider.com espero podamos conversar y me puedas apoyar

    ResponderEliminar
  11. Fernando, eres un vil estafador saca proyectos y nunca cumple

    ResponderEliminar
  12. Sou brasileiro e no sei espanhol.
    Muito obrigado por este tutorial. Procurei a net toda e graças a Deus achei seu tutorial.

    Muchisimas gracias!

    Att, Alexandro (AlexSoft.4138)

    ResponderEliminar
  13. Alejandro, Muy bueno el tutotial xq esta muy claro para principiantes como yo. Lo que no puedo hacer es bajar el archivo de ejemplo.

    Muchas Gracias

    Slds
    Gonzalo

    ResponderEliminar
  14. Muchas gracias el ejemplo y por ser tan claro...

    ResponderEliminar
  15. gracias, esto lo necesitaba :-)

    estaba buscando.. pero lo explicaste bastante bien.. facil de entender...

    www.studio77-k.com.mx

    ResponderEliminar
  16. Alejandro eres un fenomeno, gracias por el aporte!
    tendras algun ejemplo un poco mas complejo, tengo trabajar con base de datos para llenar combos y guardar info.

    desde ya muchas gracias!

    ResponderEliminar
  17. Hola Alejandro un excelente tutorial en verdad me ayudo gracias... quisiera saber si me puedes ayudar con web services pero con dos lenguajes distintos osea Java con PHP o algo asi no se si has hecho

    ResponderEliminar
  18. Amigo Este articulo es Fenomenal Saludos desde Peru, Cesar Aguirre

    ResponderEliminar
  19. jhan carlos herrera13 de enero de 2011, 1:19

    hey gracias por ese ejemplo lo necesitaba para entender y poner algo en el trabajo final de la maestria que es sobre webservice, me gustaria saber si puedo hacer unas modificaciones de tu codigo y ponerlo en mi trabajo, claro esta poniendo los creditos y agradecimientos en la misma, le agradeceria, necesito la contesta pa que no sea plagio.

    ResponderEliminar
  20. Claro q puedes jhan carlos, enviame despues tu tesis, estos temas son interesantes!

    ResponderEliminar
  21. jhan carlos herrera14 de enero de 2011, 2:48

    claro cuando la tenga lista te paso un enlace para que la veas, gracias.

    ResponderEliminar
  22. Buenas Alejandro muy buen ejemplo me funciono excelente en PHP pero al momento de agregar la referencia desde visual basic 2010 da un error me gustaría saber si me podrías ayudar con este problema.

    ResponderEliminar
  23. en el caso de que este utilizando linux como quedaria el wsdl?

    ResponderEliminar
  24. excelente.. me has sacado de un apuro.

    ResponderEliminar
  25. Muchas gracias, eres muy claro para esplicar

    Luis desde Chile

    ResponderEliminar
  26. Muy Buen ejemplo, por fin le entendi como se usaba el bendito archivo wsdl

    ResponderEliminar
  27. gracias... un buenisimo ejemplo

    ResponderEliminar
  28. Excelente ejemplo.
    tengo una pregunta estoy aprendiendo web service y quiero saber si php_soap y nusoap son lo mismo o son librerias distintas
    Gracias.

    ResponderEliminar
    Respuestas
    1. por lo que he leido php_soap vine con php5, para la version 4 se usa nusoap, ahora pueden coexistir diferentes versiones de php, lo agregas cono add-on, primero se instala el 5 despues el 4 cuando se activa el servicion elijes con cual trabajar.

      Eliminar
  29. Empece a buscar información y ejemplos sobre soap, Es increíble que tantos sitios y paginas CASI ninguna exponga un concepto de forma SENCILLA CLARA y COMPLETA. sobretodo completa. en la mayoria de sitios solo exponen partes y asumen lo demas.

    Dejo la palabra CASI solo por tus videos y explicaciones de este sitio que son excelentes. gracias por compartir y dedicar tiempo. es una lastima que no hayas escrito mas articulos y quedo en deuda la parte II sobre el proyecto de emprendimiento.

    De nuevo muchas gracias !!

    ResponderEliminar
  30. Increible tutorial me ayudo a comprender como trabaja un webservice.

    En localhost me funciono perfecto pero ya en el servidor real no a pesar de que si tiene la libreria soap activa, seguire revisando las configuraciones de este que no puede ser otra cosa y Muchas Gracias!!

    ResponderEliminar
  31. Excelente Ejemplo justo lo que necesitaba para entender el funcionamiento de los webservices

    Muchas Gracias

    ResponderEliminar
  32. he buscado tanto un ejemplo que funcione y este me funcionó, realmente te agradezco mucho este tutorial, me quedo todo muy claro, ahora a trabajar con web service.

    ResponderEliminar
  33. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  34. Hola amigo, tengo el siguiente problema:

    He creado el archivo "CLIENTE.PHP" como se hizo en la lección en video.En mi caso, tengo un archivo "WSDL" hecho y voy a utilizar una función llamada "ConsultPrePago".
    Cuando accedo a mi "CLIENT.PHP" y paso a valores de los parámetros requeridos por la función, la página me devuelve el siguiente error:

    " Catchable fatal error: Object of class stdClass could not be converted to string in C:\AppServ\www\contrato\client.php on line 38 "


    En la línea 38 de mi archivo "CLIENT.PHP", tengo el siguiente código: echo $resultado;

    La función se utiliza una clase llamada "TPrePago".



    ---------------------
    Class - TPrePago
    ---------------------
    Atributos
    * CodPrePago - INT
    * QtdDisponivel - INT
    * Mensagem - STRING
    ---------------------


    Mi pregunta es cómo conseguir que este tipo de cambio.


    Voy a poner el enlace del archivo "CLIENT.PHP" (PDF) y WSDL (PDF). Yo no puedo poner códigos HTML en BlogSpot


    Client.php - http://centercob.com.br/client.pdf

    WSDL - http://centercob.com.br/WSDL.pdf



    Gracias por la atención

    ResponderEliminar
  35. Hola que tal, muy buen video, pero abusando de tu amabilidad como se le puede hacer para que un web service me regrese una consulta de mysql y mostrala asi como muestras el resultado de la suma y resta

    ResponderEliminar
  36. AYUDA! del lado del Cliente necesito hacer lo siguiente:

    $client = new SoapClient("http://localhost/ejemplo/codigo/trunk/index.php/custom/service/scramble.wdsl");

    No logro hacerlo andar, no hay respuesta alguna, si lo dejo con "http://ejemplos.net78.net/webservice/servidor/scramble.wsdl" funciona perfectamente. Ya definí mi propio wsdl y todo lo necesario.

    Que puede ser?

    ResponderEliminar