Home > desarrollo, Spanish > Servicios web con PHP utilizando la herramienta NuSoap

Servicios web con PHP utilizando la herramienta NuSoap

El presente artículo esta dirigido a las personas que ya poseen conocimientos sobre Internet y programación y quieren comenzar a conocer el mundo de los web services (servicios web).

Antes de comenzar con lo que es NuSoap creo que es conveniente realizar una introducción a lo que son los Servicios Web, y para esto debemos comenzar con la definición de Web Service.

Web Service: es un sistema software diseñado para soportar la interoperabilidad máquina – máquina a través de una red. Este tiene una interfaz descripta en un formato que puede ser procesado por una máquina (específicamente WSDL, que veremos más adelante). Otros sistemas interactúan con el Web service utilizando mensajes SOAP los cuales se encuentran establecidos previamente.
Entonces podríamos decir que un Web Service es una comunicación por medio de mensajes SOAP  entre diferentes equipos a través de una red.

SOAPSimple Object Access Protocol

Es un protocolo de comunicación, el cual permite la comunicación entre aplicaciones a través de mensajes por medio de Internet. Es independiente de la plataforma, y del lenguaje. Esta basado en XML y es la base principal de los Web Services. Los mensajes SOAP son documento XML propiamente dicho, pero esto lo veremos más adelante cuando veamos un ejemplo de un mensaje SOAP.

WSDL – Web Services Description Language

Es un protocolo basado en XML que describe los accesos al Web Service. Podriamos decir que es el manual de operación del web service, porque nos indica cuales son las interfaces que provee el Servicio web y los tipos de datos necesarios para la utilización del mismo.

¿Que es NuSOAP?
NuSOAP es un kit de herramientas (ToolKit) para desarrollar Web Services bajo el lenguaje PHP. Esta compuesto por una serie de clases que nos harán mucho más fácil el desarrollo de Web Services. Provee soporte para el desarrollo de clientes (aquellos que consumen los Web Services) y de servidores (aquellos que los proveen). NuSOAP esta basado en SOAP 1.1, WSDL 1.1 y HTTP 1.0/1.1
No  es el único soporte para Web Services en PHP, existen otros, pero es uno de los que están en una fase de desarrollo mucho más avanzada. Sin ir más lejos, PHP a partir de su versión 5 comienza a dar soporte para SOAP, pero aun esta en fase experimental.

La instalación es bastante sencilla, solo basta ir a la pagina en sourceforge de NuSOAP http://sourceforge.net/projects/nusoap/ y bajar el archivo comprimido (es un .zip).

Lo descomprimimos en un directorio de nuestro servidor web (como puede ser /lib que es el directorio por default), y listo, ya podemos hacer uso de NuSOAP.

Ejemplo de servicios web utilizando nusoap

Les mostrare la forma de usar nusoap para aplicaciones de servicios web usando wsdl.

ejemplo : nusoap usando wsdl

(Como proveedor del servicio web)

1.- Incluimos la libreria nusoap dentro de nuestro archivo

require_once(‘lib/nusoap.php’);

2.- Creamos la instancia al servidor

$server = new soap_server();

3.- Inicializamos el soporte WSDL

$server->configureWSDL(‘hellowsdl2’, ‘urn:hellowsdl2’);

4.- Registramos la estructura de datos usado por el servicio

// Parametros de entrada
$server->wsdl->addComplexType(
‘Person’,
‘complexType’,
‘struct’,
‘all’,
”,
array(
‘firstname’ => array(‘name’ => ‘firstname’, ‘type’ => ‘xsd:string’),
‘age’ => array(‘name’ => ‘age’, ‘type’ => ‘xsd:int’),
‘gender’ => array(‘name’ => ‘gender’, ‘type’ => ‘xsd:string’)
)
);
// Parametros de salida
$server->wsdl->addComplexType(
‘SweepstakesGreeting’,
‘complexType’,
‘struct’,
‘all’,
”,
array(
‘greeting’ => array(‘name’ => ‘greeting’, ‘type’ => ‘xsd:string’),
‘winner’ => array(‘name’ => ‘winner’, ‘type’ => ‘xsd:boolean’)
)
);

5.- Registramos el metodo a exponer

$server->register(‘hello’,                // method name
array(‘person’ => ‘tns:Person’),        // input parameters
array(‘return’ => ‘tns:SweepstakesGreeting’),    // output parameters
‘urn:hellowsdl2’,                // namespace
‘urn:hellowsdl2#hello’,                // soapaction
‘rpc’,                        // style
‘encoded’,                    // use
‘Greet a person entering the sweepstakes’    // documentation
);

6.- Definimos el metodo como una función PHP

function hello($person) {
global $server;

$greeting = ‘Hello, ‘ . $person[‘firstname’] .
‘. It is nice to meet a ‘ . $person[‘age’] .
‘ year old ‘ . $person[‘gender’] . ‘.’;

if (isset($_SERVER[‘REMOTE_USER’])) {
$greeting .= ‘  How do you know ‘ . $_SERVER[‘REMOTE_USER’] . ‘?’;
}

$winner = $person[‘firstname’] == ‘Scott’;

return array(
‘greeting’ => $greeting,
‘winner’ => $winner
);
}

7.- Usamos el pedido para invocar el servicio

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ”;
$server->service($HTTP_RAW_POST_DATA);

(Como cliente, consumidor del servicio web)
——————————————-

1.- Incluimos la libreria nusoap dentro de nuestro archivo

require_once(‘lib/nusoap.php’);

2.- Creamos la instancia como cliente
$client = new soapclient(‘http://localhost/phphack/hellowsdl2.php?wsdl’, true);

3.- Chekeamos para un posible error

$err = $client->getError();
if ($err) {
// Display the error
echo ‘<h2>Constructor error</h2><pre>’ . $err . ‘</pre>’;
// At this point, you know the call that follows will fail
}

4.- Llamamos al metodo soap

$person = array(‘firstname’ => ‘Willi’, ‘age’ => 22, ‘gender’ => ‘male’);
$result = $client->call(‘hello’, array(‘person’ => $person));

5.- Chekeamos para una falla al momento de llamar al metodo
if ($client->fault) {
echo ‘<h2>Fault</h2><pre>’;
print_r($result);
echo ‘</pre>’;
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo ‘<h2>Error</h2><pre>’ . $err . ‘</pre>’;
} else {
// Display the result
echo ‘<h2>Result</h2><pre>’;
print_r($result);
echo ‘</pre>’;
}
}

6.- Una vez que todo este bien obtenemos la información deseada del servicio a travez del metodo que hemos invocado
se pude ver los pedidos y respuestas de esta manera:

echo ‘<h2>Request</h2>’;
echo ‘<pre>’ . htmlspecialchars($client->request, ENT_QUOTES) . ‘</pre>’;
echo ‘<h2>Response</h2>’;
echo ‘<pre>’ . htmlspecialchars($client->response, ENT_QUOTES) . ‘</pre>’;
// Display the debug messages
echo ‘<h2>Debug</h2>’;
echo ‘<pre>’ . htmlspecialchars($client->debug_str, ENT_QUOTES) . ‘</pre>’;

  1. Sapiens
    March 24, 2009 at 2:39 pm

    Saludos, muy bueno el articulo, pero yo necesito, enviar un conjunto de datos en un archivo .xml, Como paso el archivo completo con 50 o 100 registros en formato .xml ?

    Gracias..

    • ywarnier
      March 24, 2009 at 5:28 pm

      Hola Sapiens,

      Implementaciones a partir de formatos de datos personalizados varian mucho, y no es posible de darte una respuesta genérica. Todo depende de como están tus datos al inicio. No obstante, esta solución debería ser un trabajo personal tuyo (del cual te invitamos a reportar el éxito acá cuando lo terminas), y no uno de nosotros.

      Yannick

  2. Nicolas
    June 30, 2009 at 3:20 pm

    Buenas, yo tengo una consulta.
    Tengo un webservices funcionando pero basico, lo hice para pruebas, le paso un int y me lo multipica por 10.
    el tema que el webserver que tengo que implementar debe recibir como parametro un archivo xml, y esto es lo que no logro hacer.

    Algun comentario?

    Muchas Gracias

    • ywarnier
      June 30, 2009 at 3:41 pm

      Hola Nicolas,

      Deberías usar un cliente y un servidor de la misma librería. Si tu cliente no envia un XML y que tu servidor está esperando uno, es que no usas el mismo protócolo de comunicación… o algún problema parecido.

      • Nicolas
        June 30, 2009 at 4:56 pm

        Uso NuSOAP pero no se como indicar en el servidor para que lo que va a recibir es un archivo XML.

        Gracias, por la pronta respuesta.

  3. adrian
    August 5, 2009 at 5:36 pm

    me parese un articulo muy interesante y practico para crear un servicio web

  4. August 18, 2009 at 6:01 pm

    Excelente articulo y el ejemplo muy bien explicado.

    Ya depende la habilidad y creatividad del programador hacer uso de esta tecnologia pero a mi me parece excelente inicio este articulo para todos aquellos que no habiamos hecho un webservice, yo gracias a este articulo me adentre muy rapido y ahora ya tengo algunos webservice en activo. A diferencia de un libro que compre que tocaba el tema y llevaba leyendo 1 semana y no habia logrado nada, aqui en 5 minutos ya tenia un webservice, gracias.

  5. karelina
    May 23, 2012 at 2:34 am

    trato de hacer un consumidor de web service y me da estos errores:
    Deprecated: Assigning the return value of new by reference is deprecated in C:\wamp\www\sitios\kareprac\SIGPLAG\library\nusoap\lib\nusoap.php on line 6508

    Deprecated: Assigning the return value of new by reference is deprecated in C:\wamp\www\sitios\kareprac\SIGPLAG\library\nusoap\lib\class.soapclient.php on line 114

    qué será

  6. Juan Manuel Rivera
    July 3, 2012 at 6:42 pm

    Ha sido super clara la explicación, me dejo claro los conceptos base para trabajar WS, sabes de algun ejemplo que use WS security tanto a nivel de server como de cliente, quiero profundizar mas en el tema. Gracias..!

  7. Mariana
    May 28, 2014 at 11:53 pm

    Gracias Amigo me ha servido de mucho, buen trabajo, de verdad Gracias!!! :D

  8. cesar
    June 10, 2014 at 9:08 pm

    tengo un problema con el retorno de datos, cuando intento retornar mas de 5 registros no me devuelve nada, no se si hay alguna propiedad en el WS que tenga que cambiar el valor del maximo de datos de retorno

  9. Cristian
    September 29, 2014 at 2:29 am

    Hola, muy bueno el articulo pero soy nuevo en esto y quisiera saber lo siguiente: Como le doy seguridad, o sea por ejemplo: tengo un WS para hacer un abm de articulos, ahora bien cualquier que tenga acceso a por ejemplo http://www.servidor.com/ws.php?wsdl accede a las funciones, porque intentado validar y no puedo lograr que funcione, andan por separado, pero cuando quiero validar el usuario y listar no funciona,

    Espero me puedan ayudar.
    Saludos y gracias

    • Antonio
      September 30, 2014 at 1:09 am

      Es difícil que te contesten, porque es de hace 5 años, actualmente yo estoy trabajando con WS(solo cliente), y de lado del servidor no se como anda pero la mayoría de los WS con los que he trabajado me piden usuario y contraseña en el header del XML que envio para consumirlos , así que tu puedes ver como hacer eso.Saludos

      • Yannick Warnier
        September 30, 2014 at 1:32 am

        Difícil pero no imposible :-)
        En principio sí, deberías funcionar con un usuario y contraseña y cifrando los datos.
        El tema es que el usuario y la contraseña pasarán en claro, a menos que estos mismos sean cifrados. El problema que sigue es que usualmente no quieres tener un sistema cerrado (lo que te dificulta usar una llave común de ambos lados).
        Usualmente quieres que, con los datos correctos, cualquier usuario que ya tiene una cuenta en tu sistema pueda usar tus servicios web (no siempre, pero es la lógica de las APIs).

        La solución general es usar otra capa para el cifrado: si usas HTTPS (SSL) en tu sitio, automáticamente todos los parámetros que se intercambian con tu sistema son cifrados. Por lo tanto, desde ahí puedes pasar cualquier dato (incluyendo usuario y contraseña) para que el sistema del otro lado reconozca tu usuario y le de los permisos.

        Finalmente (pero ya es un poco más avanzado), en general los sistemas actuales usan una “llave API” (un SHA1 generado aleatoriamente) como clave en vez de usar la contraseña del usuario.
        De otro lado, la implementación de OAUTH2 permite alcanzar flexibilidad y seguridad pero ya es un tema mucho más extenso.

  10. Anonimo
    October 3, 2014 at 11:26 pm

    Como envio el xml si el wsdl me pide la siguiente estructura:

    jesus
    torres

    direccion por ejemplo
    Codigo postal

    $parametros=array(‘nombre’=>jesus,’apellido’=>torres);

    yo tengo lo siguiente:

    call(‘Consultar’,$parametros)

    el problema es que no me regresa nada, me muestra un error

  11. Robert
    July 15, 2015 at 7:52 pm

    Hola, oye buenisimo tu articulo, pero espero me puedas ayudar, yo realize un web service en php y lo consumo desde matlab, esto es (http) pero quieren que sea https (SSL), que debo hacer en mi web service para que maneje el ssl?
    Saludos.

  1. March 22, 2009 at 12:27 pm
    Dokeos Latinoamérica
  2. March 22, 2009 at 12:59 pm

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: