Ejemplo de como programar un Web service utilizando NuSOAP y PHP (Parte I)

A continuación se muestra como desarrollar un Web Service del lado del proveedor / Servidor,

1.- Incluimos la librería nusoap dentro de nuestro archivo.  lo voy a llamar «mi_ws1.php», de manera que dentro de mi archivo mi_ws1.php voy a colocar el siguiente código:

<?php

// incluimos la libreria ó toolkit nusoap que descargamos previamente
require_once('lib/nusoap.php');

?>

2.- Creamos la instancia al servidor

<?php
// Vamos a crear la instancia del servidor.
$server = new nusoap_server();

?>

3.- Inicializamos el soporte WSDL

<?php
$server->configureWSDL('Mi Web Service #1', 'urn:mi_ws1');
?>

//urn es el «Uniform Resource Name», es el nombre del recurso con que va a ser accesado el Web Service como lo comentamos es como el manual del WSDL

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

<?php
// Parametros de entrada
$server->wsdl->addComplexType(  'datos_persona_entrada', 
                                'complexType', 
                                'struct', 
                                'all', 
                                '',
                                array('nombre'   => array('name' => 'nombre','type' => 'xsd:string'),
                                      'email'    => array('name' => 'email','type' => 'xsd:string'),
                                      'telefono' => array('name' => 'telefono','type' => 'xsd:string'),
                                      'ano_nac'  => array('name' => 'ano_nac','type' => 'xsd:int'))
);
// Parametros de Salida
$server->wsdl->addComplexType(  'datos_persona_salidad', 
                                'complexType', 
                                'struct', 
                                'all', 
                                '',
                                array('mensaje'   => array('name' => 'mensaje','type' => 'xsd:string'))
);
?>

5.- Registramos el método/función para que el Web Service lo reconozca y se pueda utilizar:

<?php
$server->register(  'calculo_edad', // nombre del metodo o funcion
                    array('datos_persona_entrada' => 'tns:datos_persona_entrada'), // parametros de entrada
                    array('return' => 'tns:datos_persona_salidad'), // parametros de salida
                    'urn:mi_ws1', // namespace
                    'urn:hellowsdl2#calculo_edad', // soapaction debe ir asociado al nombre del metodo
                    'rpc', // style
                    'encoded', // use
                    'La siguiente funcion recibe los parametros de la persona y calcula la Edad' // documentation
);
?>

6.- Definimos el método como una función PHP

Lo que aconsejo para que tu código sea ordenado,legible es que todas tus funciones de PHP sean construidas en una unidad aparte ( miarchivo_func_soap.php) y luego realizas el include de ese archivo en tu codigo de la declaracion del servicio SOAP.

<?php
function calculo_edad($datos) {
    $edad_actual = date('Y') - $datos['ano_nac'];
    $msg = 'Hola, ' . $datos['nombre'] . '. Hemos procesado la siguiente informacion ' . $datos['email'] . ', telefono'. $datos['telefono'].' y su Edad actual es: ' . $edad_actual . '.'; 
    return array('mensaje' => $msg);
}
?>

7.- Usamos el pedido para invocar el servicio y hasta aquí llegaría el ejemplo del lado del servidor.

<?php
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

Para probar el WS: http://www.validwsdl.com/
Escribes la dirección: http://www.mauricioalpizar.com/ejemplos/nusoap/mi_ws1.php?

Resultado:

 

Respuesta del consumo del Web Service deberia ser:

Outgoing SOAP Request

POST /ejemplos/nusoap/mi_ws1.php HTTP/1.0
Host: www.mauricioalpizar.com
Content-Type: text/xml
Content-Length: 1032
SOAPAction: "urn:hellowsdl2#calculo_edad"

<?xml version='1.0'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='urn:mi_ws1' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
   <SOAP-ENV:Body>
      <ns1:calculo_edad SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:ns1='urn:mi_ws1'>
         <datos_persona_entrada xsi:type='tns:datos_persona_entrada'>
            <nombre xsi:type='xsd:string'>
               Mauricio Alpizar
            </nombre>
            <email xsi:type='xsd:string'>
               ealpizar@cyberfuel.com
            </email>
            <telefono xsi:type='xsd:string'>
               8700-5455
            </telefono>
            <ano_nac xsi:type='xsd:int'>
               1980
            </ano_nac>
         </datos_persona_entrada>
      </ns1:calculo_edad>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Incoming SOAP Response

<?xml version='1.0' encoding='ISO-8859-1'?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='urn:mi_ws1'>
   <SOAP-ENV:Body>
      <ns1:calculo_edadResponse xmlns:ns1='urn:mi_ws1'>
         <return xsi:type='tns:datos_persona_salidad'>
            <mensaje xsi:type='xsd:string'>
               Hola, Mauricio Alpizar. Hemos procesado la siguiente informacion ealpizar@cyberfuel.com, telefono8700-5455 y su Edad actual es: 34.
            </mensaje>
         </return>
      </ns1:calculo_edadResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Si deseas ver el código para poder consumirlo aquí esta el ejemplo:

http://www.mauricioalpizar.com/ejemplo-de-como-consumir-un-web-service-utilizando-nusoap-y-php-parte-ii/

 Referencias bibliográficas:

  • http://searchsoa.techtarget.com/definition/URN