Diferencia entre revisiones de «ManuelRomero/DAW/dwes/serviciosWebSoap»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con '===Obetener el fichero wsdl=== *Tenemos una serie de métodos o funciones que queremos ofrecer a otras aplicacones web ===Fichero del servicio web=== *server.php <source lang=ph…')
 
(Generando la clase a partir del wsdl wsdl2php)
 
(9 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
===Obetener el fichero wsdl===
+
==Práctica de servicos web con SOAP==
*Tenemos una serie de métodos o funciones que queremos ofrecer a otras aplicacones web
+
*A partir de la descripción de la práctica.
 +
*Tenemos una serie de métodos o funciones que queremos ofrecer a otras aplicacones web.
 
===Fichero del servicio web===
 
===Fichero del servicio web===
*server.php
+
*server.php: en él temenos los métodos que qeremos ofrecer.
 +
*La clase DB.PHP contiene la parte del modelo de datos (conexión a bd, y métodos  para recuperar información concreta.
 +
*La clase producto.php tiene los atributos del producto y sus métodos get and set.
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
Línea 17: Línea 20:
 
       return $producto->getPVP();
 
       return $producto->getPVP();
 
     }
 
     }
   
 
 
     /**
 
     /**
 
     * Devuelve un array con los códigos de todas las familias
 
     * Devuelve un array con los códigos de todas las familias
Línea 26: Línea 28:
 
       return $familias;
 
       return $familias;
 
     }
 
     }
 
 
     /**
 
     /**
 
     * Devuelve un array con los códigos de los productos de una familia
 
     * Devuelve un array con los códigos de los productos de una familia
Línea 47: Línea 48:
  
 
?>
 
?>
 +
</source>
 +
*Lo que queremos es ofrecer estos métodos para que otras aplicaciones las usen
 +
*Si tenemos la situación que conocemos perfectamente estos métodos, no necesitaremos ningún fichero wsdl que los describa, sino que directamente los podemos usar.
 +
*La prctica tiene dos partes, una sin usar el fichero wsdl y otra usándolo.
 +
===PARTE 1 DE LA PRÁCTICA SIN FICHERO WSDL===
 +
*Crearemos un objeto de la case SoapServer para que haya un obejto en el servidor esperadno a que haya una solicitud del cliente y atenderla
 +
*Para ello crearemos el fichero servicio.php
 +
<source lang=php>
 +
<?php
 +
require_once('server.php');
 +
 +
//Sin WSDL -> uri es obligatorio
 +
$server = new SoapServer(null, array('uri'=>"aquí poner el directorio donde tengamos el servicio"));
 +
 +
$server->setClass('Server');
 +
$server->handle();
 +
?>
 +
</source>
 +
*Observa que creamos un objeto del tipo SoaoServer
 +
*Cargamos en ese objeto la clase que contine los métodos del servicio
 +
*con handle generamos la respuesta del fichero html.
 +
====Usar el servicio====
 +
*Ahora ya tenemos el servicio y el objeto que esta escuchando esperando que alguien quiera usarlo
 +
*implementamos el fichero cliente
 +
*En él instanciamos un objeto de la clase SoapClient como se ve en el fichero descrito a continuación
 +
<source lang=php>
 +
<?php
 +
$url="especificar la ubicación absoluta del fichero que contiene el objeto SoapServer";
 +
$uri="especificar el directorio donde está el fichero"
 +
 +
//Creamos un cliente para llamar a esa URL.
 +
//Es obligatorio establecer el parámetro 'uri' al no tener WSDL , igual que ocurría al instanciar el objeto SoapServer
 +
 +
$cliente = new SoapClient(null, array('location'=>$url,'uri'=>$uri"http://localhost/Saop"));
 +
 +
//Ahora por ejemplo podemos consumir el servicio getFamilias();
 +
$familias = $cliente->getFamilias();
 +
print_r($familias);
 +
 +
//Prueba el resto de servicios.
 +
 +
?>
 +
 +
</source>
 +
 +
===USANDO WSDL===
 +
*Ahora estamos en el caso de que esta interfaz de los métodos (nombre, parámetros y  valor de retorno) no son conocidas por los que las quieren usar
 +
*Para ello las debemos publicar es un documento WSDL.
 +
*Para generar este docuemento tenemos utilidades que automatzan (a mano es algo complicado, cuando menos tedioso ).
 +
*Pasos a realizar
 +
#Primero debemos comentar los métodos con las directivas o marcas usados por lenguejes que generan documentación como '''''javadoc''''' o '''''phpDocumentor'''''
 +
*Entre las más importantes usarmeos @param @return
 +
*Nos quedará
 +
<source lang=php>
 +
  /**
 +
    * Obtiene el PVP de un producto a partir de su código
 +
    * @param string $cod@igo
 +
    * @return float
 +
    *
 +
    *
 +
    */
 +
    public function getPVP($codigo){
 +
      $producto = DB::obtieneProducto($codigo);
 +
      return $producto->getPVP();
 +
...
 +
</source>
 +
*Entre los tipos usaremos '''''int''''' para entero '''''string''''' para caracter '''''string[]''''' para un array o registro
 +
*Una vez hecho esto procedemos a generar un fichero php para que usando [WSDLDocument|http://code.google.com/p/wsdldocument/]  se nos genere el fichero correspondiente
 +
*como indican en los apuntes escribimos el fichero genera.php
 +
<source lang=php>
 +
<?php
 +
//serverW.php es el fichero descrito anteriormente, donde se implementan los métodos que se se ofrecen
 +
        require_once 'serverW.php';
 +
        require_once'WSDLDocument.php'; //script que generará el fichero xml
 +
 +
        $url="Especifica la ubiación del fichero servidor con los comentarios @param..."
 +
        $uri="especifica la ubiación de los ficheros dominio de nombres"
 +
       
 +
     
 +
        //serviciow.php es el fichero que genera el objeto servidor soap
 +
        $accion = new WSDLDocument("serverW",$url,$uri);
 +
           
 +
      echo  $accion->saveXML(); //Genera el en  navegador el fichero xml que hay que revisar
 +
/* LOS PARAMETROS DE WSDLDOCUMENT(  )
 +
    1º: El nombre de la clase que gestionará las peticiones al servicio.
 +
    2º: La URL en que se ofrece el servicio.
 +
    3º: El espacio de nombres destino.
 +
* */
 +
 +
?>
 +
</source>
 +
*Revisa la cabecera del xml por si tubieras que añadir algún nombre de dominio ns, fíjate en los ejemplos de los apuntes
 +
*Coge el contenido que sale por la pantalla del navegador y pégala en un fichero. nombralo con extensión '''''xml'''''
 +
 +
===Generando la clase  a partir del wsdl '''''wsdl2php'''''===
 +
Ahora tenemos el xml que describe el servicio soap el fichero serviciow.wsdl.xml
 +
Nuestro objeto servidor deberá publicar el interfaz de los métodos que servimos
 +
<source lang=php>
 +
<?php
 +
  require_once('serverW.php');
 +
 +
  //En este caso especificmos el fichero de descripcion del servicio generado anteriormente con la herramienta '''''WSDLDocument'''''
 +
    $server = new SoapServer("ubicación del fichero xml");
 +
 +
  $server->setClass('ServerW');
 +
  $server->handle();
 +
?>
 +
</source>
 +
 +
*Ahora instalamos la herramienta '''''wsdl2php''''' para generar un fichero php en la máquina cliente que contiene los métodos del servidor que podemos usar según las especificaciones del fichero wsdl
 +
*Descargamos 
 +
http://sourceforge.net/projects/wsdl2php/
 +
*Instalamos
 +
  sudo pear install wsdl2php-0.2.1-pear.tgz
 +
*ahora generamos la clase a partir de la especificación wsdl y podemos usar en el cliente
 +
wsdl2php serviciow.wsdl.xml
 +
y generamos un fichero.
 +
Si observamos al final del fichero wsdl
 +
<source lang=xml>
 +
    <wsdl:service name="ServerW">
 +
        <wsdl:documentation>Clase ServerW</wsdl:documentation>
 +
        <wsdl:port name="ServerWPort" binding="tns:ServerWBinding">
 +
            <soap-env:address location="http://localhost/Saop4/serviciow.php"/>
 +
        </wsdl:port>
 +
    </wsdl:service>
 +
</source>
 +
*El nombre del fichero que genera es ServerW.php
 +
*Si analizamos este fichero
 +
<source lang=xml>
 +
<?php
 +
/**
 +
* ServerW class
 +
*
 +
* Clase ServerW
 +
*
 +
* @author    {author}
 +
* @copyright {copyright}
 +
* @package  {package}
 +
*/
 +
class ServerW extends SoapClient {
 +
 +
  private static $classmap = array(
 +
                                  );
 +
 +
  public function ServerW($wsdl = "serviciow.wsdl.xml", $options = array()) {
 +
    foreach(self::$classmap as $key => $value) {
 +
      if(!isset($options['classmap'][$key])) {
 +
        $options['classmap'][$key] = $value;
 +
      }
 +
    }
 +
    parent::__construct($wsdl, $options);
 +
  }
 +
 +
  /**
 +
  * Obtiene el PVP de un producto a partir de su código
 +
  *
 +
  * @param string $codigo
 +
  * @return float
 +
  */
 +
  public function getPVP($codigo) {
 +
    return $this->__soapCall('getPVP', array($codigo),      array(
 +
            'uri' => 'http://localhost/Saop4',
 +
            'soapaction' => ''
 +
          )
 +
      );
 +
  }
 +
//Así para el resto de métodos que puedo consumir por que el servidor nos ofrece.
 +
 +
?>
 +
 +
</source>
 +
*Tenemos las clases que el servidor nos ofrece y podemos usar facilmente
 +
 +
===Usando las clases del servicio===
 +
 +
*Ahora usamos la clase generada anteriormente
 +
*Esta clase que extiende '''''SoapCliente'''''
 +
*En ella tenemos los métodos que el servidor ofrece como un servicio
 +
*Lo ejecutamos y verificamos su funcionamiento.
 +
<source lang=php>
 +
<?php
 +
require_once 'ServerW.php';
 +
 +
 +
//Instanciamos un objeto de la case ServerW
 +
//Esta clase se ha generado automáticamente por la herramienta wsdl2php
 +
$cliente = new ServerW();
 +
 +
// Probamos a obtener el array con todas las familias
 +
$familias = $cliente->getFamilias();
 +
print_r($familias);
 +
print "<br />";
 +
 +
// Probamos a obtener todos los productos de una familia
 +
$productos = $cliente->getProductosFamilia("ORDENA");
 +
print_r($productos);
 +
print "<br />";
 +
 +
// Probamos a obtener el precio de un producto
 +
$pvp = $cliente->getPVP("KSTMSDHC8GB");
 +
print("El PVP es ".$pvp);
 +
print "<br />";
 +
 +
// Probamos a obtener el stock de un producto en una tienda
 +
$unidades = $cliente->getStock("KSTMSDHC8GB", 3);
 +
print("Existen ".$unidades." unidades");
 +
?>
 +
 
</source>
 
</source>

Última revisión de 01:05 13 mar 2014

Práctica de servicos web con SOAP

  • A partir de la descripción de la práctica.
  • Tenemos una serie de métodos o funciones que queremos ofrecer a otras aplicacones web.

Fichero del servicio web

  • server.php: en él temenos los métodos que qeremos ofrecer.
  • La clase DB.PHP contiene la parte del modelo de datos (conexión a bd, y métodos para recuperar información concreta.
  • La clase producto.php tiene los atributos del producto y sus métodos get and set.
<?php
require_once('DB.php');
require_once('producto.php');
 
class Server {
    /**
     * Obtiene el PVP de un producto a partir de su código
     * 
     */
    public function getPVP($codigo){
      $producto = DB::obtieneProducto($codigo);
      return $producto->getPVP();
    }
    /**
     * Devuelve un array con los códigos de todas las familias
     * 
     */
    public function getFamilias(){
      $familias = DB::obtieneFamilias();
      return $familias;
    }
    /**
     * Devuelve un array con los códigos de los productos de una familia
     * 
     */
    public function getProductosFamilia($familia){
      $productos = DB::obtieneProductosFamilia($familia);
      return $productos;
    }
 
    /**
     * Devuelve el número de unidades que existen en una tienda de un producto
     * 
     */
    public function getStock($codigo, $tienda){
        $unidades = DB::obtieneStock($codigo, $tienda);
        return $unidades;
    }
}
 
?>
  • Lo que queremos es ofrecer estos métodos para que otras aplicaciones las usen
  • Si tenemos la situación que conocemos perfectamente estos métodos, no necesitaremos ningún fichero wsdl que los describa, sino que directamente los podemos usar.
  • La prctica tiene dos partes, una sin usar el fichero wsdl y otra usándolo.

PARTE 1 DE LA PRÁCTICA SIN FICHERO WSDL

  • Crearemos un objeto de la case SoapServer para que haya un obejto en el servidor esperadno a que haya una solicitud del cliente y atenderla
  • Para ello crearemos el fichero servicio.php
<?php
require_once('server.php');
 
//Sin WSDL -> uri es obligatorio
 $server = new SoapServer(null, array('uri'=>"aquí poner el directorio donde tengamos el servicio"));
 
 $server->setClass('Server');
 $server->handle();
?>
  • Observa que creamos un objeto del tipo SoaoServer
  • Cargamos en ese objeto la clase que contine los métodos del servicio
  • con handle generamos la respuesta del fichero html.

Usar el servicio

  • Ahora ya tenemos el servicio y el objeto que esta escuchando esperando que alguien quiera usarlo
  • implementamos el fichero cliente
  • En él instanciamos un objeto de la clase SoapClient como se ve en el fichero descrito a continuación
<?php
$url="especificar la ubicación absoluta del fichero que contiene el objeto SoapServer";
$uri="especificar el directorio donde está el fichero"
 
//Creamos un cliente para llamar a esa URL. 
//Es obligatorio establecer el parámetro 'uri' al no tener WSDL , igual que ocurría al instanciar el objeto SoapServer
 
$cliente = new SoapClient(null, array('location'=>$url,'uri'=>$uri"http://localhost/Saop"));
 
//Ahora por ejemplo podemos consumir el servicio getFamilias();
$familias = $cliente->getFamilias();
print_r($familias);
 
//Prueba el resto de servicios.
 
?>

USANDO WSDL

  • Ahora estamos en el caso de que esta interfaz de los métodos (nombre, parámetros y valor de retorno) no son conocidas por los que las quieren usar
  • Para ello las debemos publicar es un documento WSDL.
  • Para generar este docuemento tenemos utilidades que automatzan (a mano es algo complicado, cuando menos tedioso ).
  • Pasos a realizar
  1. Primero debemos comentar los métodos con las directivas o marcas usados por lenguejes que generan documentación como javadoc o phpDocumentor
  • Entre las más importantes usarmeos @param @return
  • Nos quedará
  /**
     * Obtiene el PVP de un producto a partir de su código
     * @param string $cod@igo
     * @return float
     * 
     * 
     */
    public function getPVP($codigo){
      $producto = DB::obtieneProducto($codigo);
      return $producto->getPVP();
...
  • Entre los tipos usaremos int para entero string para caracter string[] para un array o registro
  • Una vez hecho esto procedemos a generar un fichero php para que usando [WSDLDocument|http://code.google.com/p/wsdldocument/] se nos genere el fichero correspondiente
  • como indican en los apuntes escribimos el fichero genera.php
<?php
//serverW.php es el fichero descrito anteriormente, donde se implementan los métodos que se se ofrecen
        require_once 'serverW.php';
        require_once'WSDLDocument.php'; //script que generará el fichero xml 
 
        $url="Especifica la ubiación del fichero servidor con los comentarios @param..."
        $uri="especifica la ubiación de los ficheros dominio de nombres"
 
 
         //serviciow.php es el fichero que genera el objeto servidor soap 
        $accion = new WSDLDocument("serverW",$url,$uri);
 
      echo  $accion->saveXML(); //Genera el en  navegador el fichero xml que hay que revisar
/* LOS PARAMETROS DE WSDLDOCUMENT(   )
    1º: El nombre de la clase que gestionará las peticiones al servicio.
    2º: La URL en que se ofrece el servicio.
    3º: El espacio de nombres destino.
 * */
 
?>
  • Revisa la cabecera del xml por si tubieras que añadir algún nombre de dominio ns, fíjate en los ejemplos de los apuntes
  • Coge el contenido que sale por la pantalla del navegador y pégala en un fichero. nombralo con extensión xml

Generando la clase a partir del wsdl wsdl2php

Ahora tenemos el xml que describe el servicio soap el fichero serviciow.wsdl.xml Nuestro objeto servidor deberá publicar el interfaz de los métodos que servimos

<?php
  require_once('serverW.php');
 
  //En este caso especificmos el fichero de descripcion del servicio generado anteriormente con la herramienta '''''WSDLDocument'''''
    $server = new SoapServer("ubicación del fichero xml");
 
  $server->setClass('ServerW');
  $server->handle();
?>
  • Ahora instalamos la herramienta wsdl2php para generar un fichero php en la máquina cliente que contiene los métodos del servidor que podemos usar según las especificaciones del fichero wsdl
  • Descargamos
http://sourceforge.net/projects/wsdl2php/
  • Instalamos
 sudo pear install wsdl2php-0.2.1-pear.tgz
  • ahora generamos la clase a partir de la especificación wsdl y podemos usar en el cliente
wsdl2php serviciow.wsdl.xml

y generamos un fichero. Si observamos al final del fichero wsdl

    <wsdl:service name="ServerW">
        <wsdl:documentation>Clase ServerW</wsdl:documentation>
        <wsdl:port name="ServerWPort" binding="tns:ServerWBinding">
            <soap-env:address location="http://localhost/Saop4/serviciow.php"/>
        </wsdl:port>
    </wsdl:service>
  • El nombre del fichero que genera es ServerW.php
  • Si analizamos este fichero
<?php
/**
 * ServerW class
 * 
 * Clase ServerW
 * 
 * @author    {author}
 * @copyright {copyright}
 * @package   {package}
 */
class ServerW extends SoapClient {
 
  private static $classmap = array(
                                   );
 
  public function ServerW($wsdl = "serviciow.wsdl.xml", $options = array()) {
    foreach(self::$classmap as $key => $value) {
      if(!isset($options['classmap'][$key])) {
        $options['classmap'][$key] = $value;
      }
    }
    parent::__construct($wsdl, $options);
  }
 
  /**
   * Obtiene el PVP de un producto a partir de su código 
   *
   * @param string $codigo
   * @return float
   */
  public function getPVP($codigo) {
    return $this->__soapCall('getPVP', array($codigo),       array(
            'uri' => 'http://localhost/Saop4',
            'soapaction' => ''
           )
      );
  }
//Así para el resto de métodos que puedo consumir por que el servidor nos ofrece.
 
?>
  • Tenemos las clases que el servidor nos ofrece y podemos usar facilmente

Usando las clases del servicio

  • Ahora usamos la clase generada anteriormente
  • Esta clase que extiende SoapCliente
  • En ella tenemos los métodos que el servidor ofrece como un servicio
  • Lo ejecutamos y verificamos su funcionamiento.
<?php
 require_once 'ServerW.php';
 
 
//Instanciamos un objeto de la case ServerW
 //Esta clase se ha generado automáticamente por la herramienta wsdl2php
$cliente = new ServerW();
 
// Probamos a obtener el array con todas las familias
$familias = $cliente->getFamilias();
print_r($familias);
print "<br />";
 
// Probamos a obtener todos los productos de una familia
$productos = $cliente->getProductosFamilia("ORDENA");
print_r($productos);
print "<br />";
 
// Probamos a obtener el precio de un producto
$pvp = $cliente->getPVP("KSTMSDHC8GB");
print("El PVP es ".$pvp);
print "<br />";
 
// Probamos a obtener el stock de un producto en una tienda
$unidades = $cliente->getStock("KSTMSDHC8GB", 3);
print("Existen ".$unidades." unidades");
?>