Web Services. El uso de PHP con NuSOAP.

Febrero 7th, 2007 by Eliurkis

¿Qué es un servicio web?

Un Servicio Web es una colección de protocolos y estándares que sirve para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, soportando así la interoperabilidad máquina - máquina (interoperabilidad sintáctica) y el intercambio de datos entre redes de ordenadores.
Esta interoperabilidad se consigue mediante la adopción de estándares abiertos.

Estándares empleados

  • Web Services Protocol Stack: Es el conjunto de servicios y protocolos de los Servicios Web.
  • XML: Es el formato estándar usado para los datos que se vayan a ser intercambiados.
  • SOAP o XML-RPC: Protocolos sobre los que se establece el intercambio.
  • Otros protocolos: los datos en XML también pueden enviarse de una aplicación a otra mediante protocolos normales como HTTP, FTP, o SMTP.
  • WSDL: Es el lenguaje de la interfaz pública para los servicios Web. Es una descripción basada en XML de cómo debe establecerse la comunicación de los servicios Web. Es una descripción basada en XML de los requisitos funcionales necesarios para establecer una comunicación con los servicios Web.
  • UDDI: Protocolo para publicar la información de los servicios Web. Permite a las aplicaciones comprobar qué servicios web están disponibles.
  • WS-Security: Protocolo de seguridad aceptado como estándar por OASIS. Garantiza la autenticación de los actores y la confidencialidad de los mensajes enviados.

Pero, ¿qué es NuSOAP?

NuSOAP es una reescritura de SOAPx4, provista por NuSphere y Dietrich Ayala. Es un conjunto de clases (no se requiere ninguna extensión de PHP) que permiten a los desarrolladores crear y consumir servicios web basados en SOAP 1.1, WSDL 1.1 y HTTP 1.0/1.1.
La instalación es bastante sencilla, sólo basta con ir a la página en sourceforge de NuSOAP http://sourceforge.net/projects/nusoap/ y bajar el archivo comprimido. Lo descomprimimos en un directorio de nuestro servidor web (como puede ser “nusoap”), y listo, ya podemos hacer uso de NuSOAP.

¿Cómo lo usamos?

Para responder a esto, lo ideal sería realizar un ejemplo donde utilicemos NuSOAP, lo cual nos permitirá terminar de entender bien los conceptos relaciones con los Servicios Web. Primeramente partiremos de la idea de crear un servicio web, y posteriormente consumir el mismo.
El ejemplo que mostraremos es una aplicación simple, que me permita emitir un saludo a una persona indicada. Para crear este Servicio Web (server.php) con PHP usando NuSOAP es de la siguiente manera:

PHP:
  1. // Incluimos NuSoap
  2. require_once('../nusoap/nusoap.php');
  3.  
  4. // Crear una instancia del soap server
  5. $server = new soap_server();
  6.  
  7. // Inicializar el soporte para WSDL
  8. $server->configureWSDL('holawsdl', 'urn:holawsdl');
  9.  
  10. // Registrar el método
  11. $server->register('hola',               // nombre método
  12. array('nombre' => 'xsd:string'),    // parámetros de entrada
  13. array('return' => 'xsd:string'),    // parámetros de salida
  14. 'urn:holawsdl',                     // namespace
  15. 'urn:holawsdl#hola',                // soapaction
  16. 'rpc',                              // estilo
  17. 'encoded',                          // uso
  18. 'Saludar a quien se desee'          // documentación
  19. );
  20.  
  21. // Definir el método como una función PHP
  22. /**
  23. * Saludar a una persona
  24. *
  25. * @param string $nombre
  26. * @return string
  27. */
  28. function hola($nombre) {
  29. return 'Hola, ' . $nombre;
  30. }
  31.  
  32. // Usar la petición (en caso de existir) para invocar al servicio
  33. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
  34.  
  35. $server->service($HTTP_RAW_POST_DATA);

Con este código hemos creado un Servicio Web, que al ser invocado saluda a una persona indicada, ahora debemos crear una aplicación que consuma este Servicio Web (client.php).

PHP:
  1. // Incluimos la clase NuSoap
  2. require_once('../nusoap/nusoap.php');
  3.  
  4. // Dirección del servicio web
  5. $url = 'http://dev.deepinphp.com/ejemplos/webservices/server.php?wsdl';
  6.  
  7. // Creamos una instancia del objeto Soap en su modo Cliente
  8. $soapclient = new soapclient($url, TRUE);
  9.  
  10. // Función "hola" a llamar en el webservices
  11. $function = 'hola';
  12.  
  13. // Parámetros pasados a la función
  14. $params = array('nombre' => 'Pepe');
  15.  
  16. // Llamamos a la función publicada en el servicio web y devolvemos el resultado en $result
  17. $result = $soapclient->call($function , $params);
  18.  
  19. // Imprimimos el resultado
  20. print_r($result);

Y de esta forma, hemos creado una aplicación sencilla de creación y consumo de un Servicio Web en PHP, para mostrar ver su funcionamiento pueden hacerlo en http://dev.deepinphp.com/ejemplos/webservices/client.php

Conclusiones

Los Servicios Web pueden ser muy útiles en ciertos casos concretos de programación. Los expertos de marketing de empresas de software como Microsoft anuncian a bombo y platillo una revolución debido a la aparición de SOAP, WSDL, UDDI, etc. Sin embargo, no conviene creerse todo lo que cuentan. Hay que tener en cuenta que les interesa que sus clientes actualicen sus herramientas de desarrollo a la versión .NET
La única revolución que podemos vivir en relación a los Servicios Web es la de ver como los servidores de Internet hablan entre ellos, y cada día son más independientes del programador. Y eso es algo que va a pasar completamente desapercibido para el resto de los usuarios de Internet.
Si logramos que existan Servicios Web de utilidad, gratuitos y sencillos, este nuevo esquema de comunicación y programación tendrá futuro. Si por el contrario, montamos campañas comerciales y vendemos fantasías en torno a palabras bonitas e incomprensibles como UDDI, WSDL, SOAP, XML, etc, habremos perdido nuestro valioso tiempo.

Archivos de ejemplo

Puede descargar los archivos del ejemplo anterior en http://dev.deepinphp.com/ejemplos/webservices/ejemplo.zip (Incluye la clase NuSoap)

Actualizado: 3 de noviembre del 2008

Posted in PHP, Servicios Web |

24 Responses

  1. rene Says:

    cualkiera con basicos conocimientos lo entenderá

  2. rdcklinux Says:

    esto es muy bueno, pero tengo una duda, si queremos que nuestro cliente se autentifique antes de obtener datos y se mantenga una sesion activa que perdure un cierto tiempo, como tendriamos que hacerlo en el codigo del servidor.

  3. Eliurkis Says:

    En este caso teniendo en cuenta que el servicio web pueda estar servido por otro lenguaje que no es PHP, pues se manejaría un sistema de tickets, que manejarían la autenticación.

  4. Juan Carlos Says:

    Hola, exelente manual, pero…
    para consumir un servicio web desde .net con php??

    he buscado y buscado y no he encontrado nada que me pueda ayudar

    salu2

  5. OTO Says:

    Que ta, copié el cliente en mi servidor y no me funciona, no me da nada, será porque están en difernetes servidores?

  6. Eliurkis Says:

    El estar en diferentes servidores no influye.

  7. Danny Says:

    q tal a mi tampoco me funciona me da el siguiente error:

    Warning: SoapClient::SoapClient(http://www.fashmatch.com/ws_server.php) [function.SoapClient-SoapClient]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\xampp\htdocs\tesis\nusoap\soap.php on line 15

    Warning: SoapClient::SoapClient() [function.SoapClient-SoapClient]: I/O warning : failed to load external entity “http://www.fashmatch.com/ws_server.php” in C:\xampp\htdocs\tesis\nusoap\soap.php on line 15

    Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://www.fashmatch.com/ws_server.php’ in C:\xampp\htdocs\tesis\nusoap\soap.php:15 Stack trace: #0 C:\xampp\htdocs\tesis\nusoap\soap.php(15): SoapClient->SoapClient(’http://www.fash…’) #1 {main} thrown in C:\xampp\htdocs\tesis\nusoap\soap.php on line 15

  8. Danny Says:

    Ya resolvi el prrblema anterior si funciona solo q hay q montarlo en un servidor real no localhost como lo estaba trabajando yo..

    Saludoss..

  9. vanesa Says:

    Hola, estoy realiando un proyecto y encontre esta pagina, que por cierto, gracias, porque me ha venido genial.
    Tengo que hacer un servicio web en PHP entre otras cosas.
    He realizado el ejemplo pero me da los mismos errores que al chico anterior, he leido que lo consiguio resolver montando en un servidor real, pero no sé como se hace, si me puedes ayudar, gracias.
    Yo lo he hecho en localhost.

  10. semi Says:

    he tenido ese mismo problema, para empezar además yo tenia que entrar por red local y tenia que establecer una conexion vpn, pero no creo que sea el caso de la mayoria de gente.

    1.- error de reescritura de classe….
    Los pasos que hice fue, renombrar la clase sopaclient() linea mas o menos 6400, y tambien renombrar la funcion constructura del mismo nombre.

    2.- error de acceso ala información failed to open stream..
    despues para que funcione tenemos que llamar a la nueva clase, si no llamamos a la que hemos cambiado el nombre se llamara a la que incluye el php5, y por lo tanto nos dara los errores.

    Espero que les sea de ayuda

  11. semi Says:

    para la gente menos suelta pongo lo que hay que modificar…
    nusoap.php
    esto:
    class soapclient extends nusoap_base {

    var $username = ‘’;
    por esto:
    class soapclient2 extends nusoap_base {

    var $username = ‘’;
    var $password = ‘’;

    y esto:

    function soapclient($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30)

    por esto:

    function soapclient2($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30)

    el resto, es decir donde creamos los nuevos obejetos de la clase ya es cosa vuestra ($algo=new soapclient2(’vuestro enlace’ )

    saludos de nuevo

  12. Benjamin Sagardia Says:

    A mi me pasa lo mismo y aun peor lo hago con el web service de Dicom y ellos no tienen idea por que
    Warning: SoapClient::SoapClient(http://dwww.dicom.cl/wse00.wpt.platinum/ServicePlatinum/informe.wsdl) [function.SoapClient-SoapClient]: failed to open stream: HTTP request failed! Bad request in ………. on line 30

    Warning: SoapClient::SoapClient() [function.SoapClient-SoapClient]: I/O warning : failed to load external entity “http://dwww.dicom.cl/wse00.wpt.platinum/ServicePlatinum/informe.wsdl” in ….. on line 30

  13. Nacho Says:

    Gracias semi por la solución, justo lo que necesitaba.

    Buen tutorial!

    saludos

  14. leo Says:

    excelente tutorial, pero tengo un par de preguntas,

    1.- en que parte se encuentra esto: function soapclient2($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30), no lo busco en ninguna parte de nusoap.php

    2.- que pasa si tenemos always_populate_raw_post_data en OFF??

    saludos.

  15. Paco Says:

    Felicidades por el artículo. He intentado encontrar ejemplos lo suficientemente sencillos como para poder empezar a entender los servicios web con PHP y este ejemplo es el ideal. Ha funcionado a la primera y ya puedo arrancar a partir de algo que funciona.

    Gracias.

  16. Ale Says:

    Hola, disculpa soy nueva en esto de los ws, instalo tu ejemplo y no aparece nada de resultado, tienes alguna idea del por q?

  17. Jose Says:

    Saludos;

    En esencia, hasta la fecha tu ejemplo sigue funcionando y es muy util y facil de comprender, te felicito!!!.

  18. Nacho Says:

    No me trae nada el ejemplo… :S

  19. renee Says:

    Muy bueno, Gracias me fue de gran ayuda, es un ejemplo basico pero muy ilustrativo, Gracias !!!!!!

  20. cesar Says:

    me aparece este error en la aplicacion cliente el server si me funciona

    Fatal error: Uncaught SoapFault exception: [Client] SoapClient::SoapClient() [soapclient.soapclient]: Invalid parameters in C:\xampp\htdocs\ws\ejemplo\client.php:12 Stack trace: #0 C:\xampp\htdocs\ws\ejemplo\client.php(12): SoapClient->SoapClient(’http://dev.deep…’, true) #1 {main} thrown in C:\xampp\htdocs\ws\ejemplo\client.php on line 12

  21. Trabajo Peruano Says:

    Me salía este error:
    annot modify header information - headers already sent by …./home/jorgemen/public_html/webservice/nusoap.php on line 3668

    Luego de probar y probar me dí cuenta uqe el error era en quitar

  22. Trabajo Peruano Says:

    Creo qeu era quitar espacios antes del

  23. pako Says:

    hola disculpa soy nuevo en esto pero no se porke me manda error al ejecutar el cliente en la linea dond se instancia el objeto soapclient(url), pero no se a ke se deba cuando le pongo nusoap_client(url), es cuando no marca error pero no aparece nada ke problema puede ser?

  24. Oliver Says:

    Excelente, de hecho habia leido otros articulos y probado los ejemplos y es el unico que funciono (gracias a la SemiSolucion)

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.