Mi primer webservice en PHP (chispas)

Tras mucho tiempo consumiendo webservices de otros me ha tocado crear mi primer servidor SOAP en PHP y, la verdad, me ha parecido realmente sencillo e intuitivo. Creas una clase con los métodos que vas a exponer en el ws y se crea automáticamente el servicio sobre ellos, tan sencillo como eso.

<?php
$wsdl="miclase.wsdl";
$soap = new SoapServer($wsdl);
$soap->setClass('MiClase');
$soap->handle();

//clase que gestiona el ws
class MiClase {
    public function MiClase(){
      //tu código
    }

    /**
     *
     * @param string $email
     * @return string
     */
    public function is_email_available($email){
        //tu codigo...
        return "OK";
    }
    /**
    *
    * @param string $phone
    * @param string $email
    * @return string
    */
    public function register_user($phone, $email){
       //tu codigo...
       return "OK";
    }
    /**
    *
    * @param string $phone
    * @return string
    */
    public function downgrade_user($phone){
       //tu codigo...
       return "OK";
    }
}
?>

Con esto se crea automáticamente nuestro webservice con los tres métodos públicos. Pero espera, falta algo, arriba de todo defines un “miclase.wsdl“. ¿Qué es eso? ¿De dónde sale?

En efecto, ese es el principal problema al crear un webservice SOAP con PHP, no se genera el WSDL automáticamente sino que hay que escribirlo ¡a mano!. Para solucionarlo tenemos la librería PHP WSDL Generator a la que únicamente debemos pasarle la clase de la que queremos extraer el WSDL y lo hace por nosotros :). Para que todo funciona bien es necesario que los métodos de nuestra clase estén bien documentados tal y como aparecen en el ejemplo anterior, de esta manera WSDL Generator sabrá configurar los tipos de datos de los parámetros de entrada y salida de los métodos.

Veamos un ejemplo:

<?php
require_once("wsdl2php/WSDLCreator.php");
$test = new WSDLCreator("miclase", "http://ws.tudominio.com/wsdl");
$test->addFile("miclase.php");
$test->setClassesGeneralURL("http://tudominio.com");
$test->addURLToClass("MiClase", "http://ws.tudominio.com/miclase.php");
$test->ignoreMethod(array("MiClase"=>"MiClase"));
$test->createWSDL();
$test->saveWSDL(dirname(__FILE__)."/miclase.wsdl", false);
?>

Este pequeño código nos generará el archivo WSDL de nuestro webservice. Como veis simplemente le indicamos el archivo con nuestra clase (el que escribimos anteriormente), la clase que queremos mapear con la URL del webservice (el endpoint) y, además, le indicamos que ignore el constructor de la clase ya que no será un método de nuestro webservice. Eso es todo.

Si ahora probamos el servicio web, por ejemplo desde el Web Service Explorer de Eclipse:

Tras darle la ruta del wsdl, http://ws.tudominio.com/miclase.php?wsdl, veremos los tres métodos que hemos expuesto y podremos probarlos y utilizarlos.

Nunca había tenido la necesidad de crear un servidor SOAP pero ha sido realmente sencillo. Ahora estoy buscando la manera de devolver tipos de datos complejos, pero eso será en el próximo capítulo :P.

7 comentarios en “Mi primer webservice en PHP (chispas)

  1. Saludos, excelente articulo, sigue así con el blog, gustaría que los post fueran un poco mas a menudo, aunque entiendo que a veces el tiempo falte, si necesitas gente que envié un articulo de vez en cuando que puedas postear no dudes en contactar, saludos!!

  2. He estado probando el codigo en SoapUI , me salen los tres metodos pero solo en el primero me sale bien definido el tipo de datos como string en el WSDL , alguien sabe por que solo en primer metodo toma bien el tipo de dato en los demas me los deja como anyType

  3. He estado probando la herramienta propuesta (WSDL Generator) con el ejemplo que expones, solo cambié los los nombres de los métodos (method1, method2 y method3 respectivamente) y los textos de retorno (“OK” para cada uno de los métodos) por “Method1”, “Method2” y “Method3”, esto para probar que cada uno de los métodos expuestos fuera correctamente invocado.

    Resulta que al probarlo con SoapUI (version 4.0.1) solo funciona el primer método, los llamados a los demás métodos fallan. En SoapUI se puede ver que el mensaje de respuesta para los métodos 2 y 3 queda mal construido, que crees que puede estar pasando?

    Mil gracias.

  4. @Leonardo,
    Wsdl Generator NO es perfecto, tiene ciertos fallos y habría que revisar el wsdl generado y solucionar los errores, normalmente son debidos a que no define bien los parámetros de entrada/salida, toda la estructura es correcta.

  5. Si me paso alguna vez que use esa clase generadora de wsdl y no creaba el terminador de servicio por tanto tube que dejarlo estatico y no dinamico , pero es una solucion completa para generar el descriptor de igual manera .

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *