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.

SOAP  Simple 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>’;

Comments

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

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

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

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.

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.

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:wampwwwsitioskarepracSIGPLAGlibrarynusoaplibnusoap.php on line 6508

Deprecated: Assigning the return value of new by reference is deprecated in C:wampwwwsitioskarepracSIGPLAGlibrarynusoaplibclass.soapclient.php on line 114

qué será

Enlace permanente

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

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

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

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

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.

Como envío 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