10 may 2010

Servicios Web – Retornar un XML con NuSOAP

Aquí estoy nuevamente con un artículo de web services / servicios web, en esta oportunidad, voy a incluir un ejemplo en el cual ser servidor retorna un XML al cliente, y este lo muestra por pantalla. Este ejemplo surgió a petición de un visitante a mi blog. Espero que les sea de utilidad.

Servidor

El servidor es muy similar a todos los servidores de los ejemplos anteriores, simplemente que retorna un XML. Dado que el servidor retorna un XML, debemos convertirlo antes de poder retornarlo, para que no genere conflictos con el código del “envoltorio” (SOAP) que transportará el XML. La forma más rápida es utilizar el método base64_encode que ya trae incorporado PHP. Es decir, codificamos el XML con base64, de esta forma nos aseguramos que no aparecerán caracteres extraños, y luego retornamos ese XML modificado.

<?php
require_once('nusoap/lib/nusoap.php');
$miURL = 'http://pruebas.orlandobrea.com.ar/nusoap_ejXML';
$server = new soap_server();
$server->configureWSDL('ws_orlando', $miURL);
$server->wsdl->schemaTargetNamespace=$miURL;

$server->register('getXML', // Nombre de la funcion
                   array(), // Parametros de entrada
                   array('return' => 'xsd:string'), // Parametros de salida
                   $miURL);
function getXML(){
    return new soapval('return', 'xsd:string', base64_encode('<?xml version="1.0" encoding="UTF-8"?>
<vehiculos>
  <coche>
      <marca>Toyota</marca>
      <modelo>Corolla</modelo>
      <fechaCompra>2002</fechaCompra>
  </coche>
  <coche>
      <marca>Honda</marca>
      <modelo>Civic</modelo>
      <fechaCompra>2003</fechaCompra>
  </coche'));
}

$server->service($HTTP_RAW_POST_DATA);
?>

En el ejemplo el XML es fijo y esta incorporado a la función del web services, en la vida real, el código XML lo generaremos a partir de algunos datos dinámicos o en como necesitemos.

Cliente

El cliente es casi el mismo que en los ejemplos iniciales que he dado en mi blog, salvo que antes de mostrar/procesar la respuesta, se debe transformar de base64 a texto normal, algo así como “descodificarla”. Para esto PHP también nos provee de una función base64_decode.

<?php
require_once('nusoap/lib/nusoap.php');
// Crear un cliente apuntando al script del servidor (Creado con WSDL)
$serverURL = 'http://pruebas.orlandobrea.com.ar';
$serverScript = 'nusoap_server_ejXML.php';
$metodoALlamar = 'getXML';

$cliente = new nusoap_client("$serverURL/$serverScript?wsdl", 'wsdl');
// Se pudo conectar?
$error = $cliente->getError();
if ($error) {
    echo '<pre style="color: red">' . $error . '</pre>';
    echo '<p style="color:red;'>htmlspecialchars($cliente->getDebug(), ENT_QUOTES).'</p>';
    die();
}

// 1. Llamar a la funcion getRespuesta del servidor
$result = $cliente->call(
    "$metodoALlamar",                     // Funcion a llamar
    array(),    // Parametros pasados a la funcion
    "uri:$serverURL/$serverScript",                   // namespace
    "uri:$serverURL/$serverScript/$metodoALlamar"       // SOAPAction
);
// Verificacion que los parametros estan ok, y si lo estan. mostrar rta.
if ($cliente->fault) {
    echo '<b>Error: ';
    print_r($result);
    echo '</b>';
} else {
    $error = $cliente->getError();
    if ($error) {
        echo '<b style="color: red">-Error: ' . $error . '</b>';
    } else {
        echo base64_decode($result);


    }
}

?>

En el ejemplo, solo muestro la respuesta que me ofreció el servidor del servicio web, cuando estemos ante una implementación real, seguramente deberemos procesar esta información para ofrecer, por ejemplo, una respuesta a un usuario.

Conclusión

Como hemos podido ver, la implementación de este tipo de alternativas, es muy sencilla, solo debemos tener especial cuidado en la codificación de la respuesta que utilizamos en NuSOAP. A modo de “regla” podría decir que todo aquello que sabemos que utilizará caracteres extraños, podemos codificarlo en base 64 en el servidor, y luego decodificarlo en el cliente (de esta forma nos aseguramos que la información ha viajado correctamente).

Debo reconocer que hace tiempo que no indago el código de NuSOAP, por lo tanto no recuerdo si codifica de alguna forma las respuestas automáticamente (que yo recuerde, no lo hace).

Espero que haya sido de utilidad, y que sirva para que sigan explorando con los Web Services.

Saludos a todos los seguidores, y gracias!

4 comentarios:

Anónimo dijo...

Buern dia orlando ojala me puedas ayudar tengo un problema con tu ejemplos2 me manda un error en el servidor Notice: Undefined variable: HTTP_RAW_POST_DATA in C:\wamp\www\webserver\servidor.php on line 23 y otro en el cliente ojala me puedas ayudar Error: wsdl error: XML error parsing WSDL from http://localhost/webserver/servidor.php?wsdl on line 2: Invalid document end
saludos

Santos10 dijo...

Gracias Orlando, leí todos tus tutoriales acerca de los WS y me han sido de gran ayuda, espero que sigas así, saludos desde Mazatlán, México...

jorge dijo...

Buen día, he leído todos los artículos que hacen referencia a web service y puedo decir que en realidad son muy buenos. Espero no los dejes a un lado ya que es una colaboración muy buena para los que estamos comenzando a documentarnos sobre este tema. Respecto al tema de XML. Quisiera saber por que cuando yo recibo un XML en mi servidor y lo descodifico solo puedo ver los datos que trae la primer etiqueta, de ante mano gracias Orlando...

jorge dijo...

Buen día, he leído todos los artículos que hacen referencia a web service y puedo decir que en realidad son muy buenos. Espero no los dejes a un lado ya que es una colaboración muy buena para los que estamos comenzando a documentarnos sobre este tema. Respecto al tema de XML. Quisiera saber por que cuando yo recibo un XML en mi servidor y lo descodifico solo puedo ver los datos que trae la primer etiqueta, de ante mano gracias Orlando...