Escolar Documentos
Profissional Documentos
Cultura Documentos
6 TEMA
Esquema
TEMA 6 – Esquema
Implementación en PHP de servicios web
2
Características Definición de SOA Servicios web sin WSDL Características
Ideas clave
Para estudiar este tema lee las Ideas clave que encontrarás a continuación.
Además, tendrás que estudiar las siguientes páginas disponibles bajo licencia CEDRO:
Aprenderemos qué es SOA, una Arquitectura Orientada a Servicios. Verás que existen
diferentes definiciones, pero entenderás la idea rápidamente. También aprenderemos
qué son los servicios web.
Al final del tema hemos incluido más ejemplos, tanto de SOAP como de REST. Además
te dejamos información adicional sobre XML y otros temas relacionados, para que tengas
suficiente información para resolver tus dudas e inquietudes.
Así, al finalizar el tema, tendremos una visión general de los servicios web y tendremos
las herramientas necesarias para poder iniciarnos en la programación de este tipo de
aplicaciones.
Los servicios web trabajan frecuentemente con XML, por lo que es importante conocer
cómo funciona este lenguaje. XML (eXtensible Markup Language) es un lenguaje de
marcado, al igual que HMTL, cuya finalidad no es mostrar datos, como HTML, sino
describirlos. Para hacerlo, utiliza etiquetas que se describen ad hoc para cada documento
(o tipo de documento). Estas etiquetas siguen unas reglas gramaticales similares a las
de HTML, de tal forma que tendremos etiquetas de apertura y cierre, los elementos
podrán anidarse y podremos darles atributos.
Sin embargo, la principal diferencia entre HTML y XML es que las etiquetas que
utilizamos no están definidas a priori, sino que se diseñan para cada
documento, lo que aporta una flexibilidad extraordinaria a este lenguaje.
Entonces, ¿cómo se puede compartir la información? ¿cómo entiende el destinatario el
contenido del fichero si no utilizamos etiquetas estándar? La respuesta es sencilla: junto
con el fichero que describe los datos, el XML, necesitamos enviar lo que se denomina una
DTD (Document Type Definition) o un esquema XML (XMLSchema), donde
describiremos las etiquetas utilizadas en el documento XML, así como sus atributos y las
relaciones entre las etiquetas.
En las páginas del libro que te hemos proporcionado en este tema en el apartado 6.1.
¿Cómo estudiar este tema? puedes ver un ejemplo de un fichero XML. Podrás
comprobar su sencillez de comprensión, ya que las etiquetas tienen una fuerte carga
semántica y podrás comprobar cómo sigue reglas de uso muy similares a HTML.
Además, al final del tema te dejamos una referencia para que puedas profundizar en el
uso de XML.
No obstante, a lo largo del tiempo, han surgido numerosas definiciones de qué es SOA,
aunque a modo de introducción, nos quedaremos con una: Según la W3C, es un conjunto
componentes que pueden ser invocados y cuyas interfaces se pueden publicar y
descubrir.
SOA está muy enfocada al negocio, de tal forma que trata de resolver necesidades
cambiantes de las empresas para que se adapten rápidamente a las necesidades del
mercado. Aunque ya ha habido intentos anteriores, la ventaja de SOA ha surgido por la
adopción de estándares, que ha permitido aumentar la interoperabilidad, muy necesaria
en un escenario donde las empresas trabajan de forma descentralizada y a nivel
internacional. Además, la tecnología ha ganado en seguridad y compatibilidad, por lo
que el proceso técnico se ha facilitado también.
Intermediario de servicios
Descripción
del servicio
Encuentra Publica
La principal ventaja que ofrecen los servicios web es que estas aplicaciones que
intercambian datos pueden estar implementadas en diferentes lenguajes de
programación y ejecutadas sobre cualquier plataforma. Así, un servicio es accesible por
medio de un protocolo estándar y puede ser invocado por medio de una interfaz bien
definida. De esta forma, se consigue la extensibilidad e interoperabilidad tan
demandada y evita la necesidad de reescribir las aplicaciones para poder comunicarse
con otros sistemas.
En este sentido, PHP permite utilizar conexiones a servicios web con WSDL o sin
él, aunque si vamos a usar un WSDL necesitaremos generarlo con alguna herramienta
auxiliar, ya que PHP no lo genera automáticamente. No obstante, existen algunas
herramientas que nos permiten generarlo, como por ejemplo:
» WSDLCreator: http://www.phpclasses.org/package/3509-PHP-Generate-WSDL-
from-PHP-classes-code.html
» WSDLDefinition: creado por David Giffin y disponible en la siguiente dirección
web https://github.com/digitick/php-wsdl-writer
Empezaremos por crear un servicio web SOAP en PHP. Antes de nada, señalaremos
que cada servicio debe estar en un fichero .php independiente. Para crear el servicio,
necesitaremos utilizar la clase SoapServer, tal como veremos en el siguiente ejemplo, que
crea un servicio (miServicio) al que añade dos operaciones: sumar y restar. Guardaremos
el fichero con el nombre server1.php.
<?php
function sumar($val1,$val2){
return $val1+$val2;
}
function restar($val1,$val2){
return $val1-$val2;
}
$miServicio->handle();
?>
Veamos lo que hace el código del ejemplo. Al principio, crea las dos funciones que serán
las operaciones de nuestro servicio. Como vemos, las funciones se crean de la forma
habitual, es decir, no es necesario hacer ninguna referencia al servicio web al que se van
a incorporar. A continuación, creamos un objeto de la clase SoapServer, que recibe dos
parámetros:
Una vez que tenemos el servicio creado, para que esté disponible y pueda usarse, hay que
desplegarlo en el servidor (deploy). A efectos prácticos y, asumiendo que utilizamos
XAMPP, lo único que tendremos que hacer es colocar el fichero en el directorio htdocs.
En el otro extremo tendremos el cliente PHP que consumirá servicios web, que
necesitará saber su ubicación, ya que no tenemos el fichero WSDL que contiene esa
información. Supongamos que sabemos que la ubicación del servicio es
http://localhost:8080/ejemploWS1/server1.php. Entonces, nuestro cliente
(client1.php) quedaría de la siguiente forma:
<?php
$url="http://localhost:8080/ejemploWS1/server1.php";
$suma = $cliente->sumar(2,3);
print("La suma es ".$suma."<br>");
$resta = $cliente->restar(3,2);
print("La resta es ".$resta);
?>
Vemos que el código es sencillo. En la primera línea, hemos indicado la ubicación del
servicio al que queremos acceder. A continuación, hemos creado un cliente SOAP
utilizando la clase SoapClient, que tiene los mismos argumentos que la clase SoapServer,
con el mismo significado y restricciones. De nuevo, puesto que no tenemos WSDL del
servicio, hemos indicado el URI en el array del segundo argumento, además de la URL
del servicio. Si tenemos el fichero WSDL no es necesario porque la ubicación del servicio
está indicada en dicho fichero.
El siguiente paso, será utilizar las operaciones del servicio. De nuevo, al no tener
el fichero WSDL tendremos que conocer las operaciones por algún medio para saber que
existen. Así, en el ejemplo utilizamos las operaciones de sumar y restar, mostrando el
resultado obtenido al usuario.
Como hemos visto, la creación y uso de servicios web es relativamente sencilla. Por
supuesto, se puede complicar cuanto queramos pero, conceptualmente, es fácil de
manejar. Sin embargo, parece que el hecho de obviar el fichero WSDL no es una buena
solución, ya que obliga a tener que localizar manualmente los datos del servicio. Por eso,
a continuación vamos a ver cómo podemos crear un servicio generando su WSDL.
Lo primero que haremos será crear una clase que contenga las operaciones que
implementa nuestro servicio. Lo haremos de esta forma porque la librería que
utilizaremos para generar el WSDL requiere una clase como argumento.
Para que podamos comprender bien las diferencias entre el uso o no de un fichero WSDL,
implementaremos de nuevo el mismo ejemplo anterior, pero de esta segunda manera.
Vamos a crear el fichero classService2.php:
<?php
/**
* Clase para manejar el Servicio
*/
class ClassService{
/**
* Sumar
*
* @param int $val1 Primer argumento de la suma
* @param int $val2 Segundo argumento de la suma
* @return int Resultado de sumar los argumentos
*/
public function sumar($val1, $val2)
{
return $val1 + $val2;
}
/**
* Restar
*
* @param int $val1 Primer argumento de la resta
* @param int $val2 Segundo argumento de la resta
* @return int Resultado de restar los argumentos
*/
public function restar($val1, $val2)
{
return $val1 + $val2;
}
}
?>
A continuación, vamos a crear el fichero WSDL para nuestro servicio. Para hacerlo,
vamos a usar la librería implementada por djkaty
(https://katyscode.wordpress.com/2006/07/27/automatic-wsdl-generation-in-php-
5/), el WSDLGeneration, que genera la el fichero WSDL a partir de la clase y de los
comentarios que hemos incluido.
<?php
//Incluimos las librerías de Katy
require_once("./katy/classes/WsdlDefinition.php");
require_once("./katy/classes/WsdlWriter.php");
//Fijamos el NameSpace
$def->setNameSpace("http://csw.unir.net");
//Escribimos
print $wsdl->classToWsdl();
?>
Es importante destacar que, una vez generado el WSDL del servicio, no hay que volver a
generarlo más, por lo que este código sólo lo utilizaremos una vez. En el enlace al blog de
Katy y en el propio código hemos incluido información para que puedas entender qué se
hace en cada paso.
Para que no tengas ningún problema al usar este WSDL, tienes que copiar el código
fuente de la página una vez ejecutado el script y pegarlo en un fichero con extensión wsdl.
Fíjate que el texto empiece en la primera columna de la primera fila, dará error si no está
así.
Como este servicio es sencillo, vamos a mostrar el archivo que se ha generado para que
podamos comprobar el aspecto de un fichero WSDL.
Fíjate en la estructura de las etiquetas y en los valores que contienen, que son los mismos
que hemos declarado en nuestro código y que hemos incluido en la documentación.
<?php
require_once('classService.php');
$miServicio2 = new SoapServer('classService.wsdl');
$miServicio2->setClass('ClassService');
$miServicio2->handle();
?>
Como podemos comprobar, ahora no tenemos que incluir las funciones al servicio, ya
que queda implícito al incluir la clase que hemos implementado. De esta forma, con el
método setClass hemos incorporado las dos operaciones: sumar y restar. Esta es la única
parte del código que es diferente, ya que se finaliza inicializando el servicio, tal como en
el ejemplo anterior.
Ya solo nos queda implementar un cliente que use este servicio web. De nuevo, tenemos
que destacar las diferencias de usar el fichero WSDL; ahora no tenemos que hacer una
búsqueda de las operaciones del servicio, sino que podemos consultarlos desde código.
Veamos un ejemplo (client2.php):
<html>
<head> Pruebas servicio con WSDL </head>
<body>
<?php
$res=$client2->restar(3, 2);
echo "El resultado de restar 3-2 es:".$res;
?>
</body>
</html>
El código para probar nuestro servicio web es sencillo y similar al cliente anterior. Lo
único que hemos incluido es la operación que nos permite ver las operaciones del servicio
web. Sin embargo, lo que en código solo supone una línea, a efectos prácticos es muy
relevante ya que nos permite, desde el punto de vista del servidor, dar a conocer nuestros
servicios, las operaciones que tienen y cómo funcionan esas operaciones y desde el punto
de vista del cliente, nos permite localizar los servicios y ser capaces de usarlos de forma
sencilla.
Para poder usar un servicio web de otra persona, lo único que necesitas es crear el cliente
e incluir el WSDL correspondiente. En el siguiente ejemplo vamos a utilizar un servicio
web que devuelve el tipo de cambio entre dos monedas. Para localizarlo, solo hemos
tenido que ir a Google.com y buscar de la siguiente forma: web services examples. Del
resultado ofrecido, hemos seleccionado uno sencillo.
<?php
$client = new
SoapClient("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL");
Para profundizar un poco más en la forma de comunicación del cliente con el servidor,
ya sea para un servicio local o para uno que hemos descubierto, vamos a mostrar un
ejemplo generado con la herramienta SoapUI
(http://www.soapui.org/downloads/soapui/open-source.html). Esta herramienta es
open source, por lo que puedes descargarla y probar tus desarrollos. A continuación,
vamos a mostrar la información de los ficheros de petición y respuesta para el
ejemplo anterior, generados con SoapUI.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://www.webserviceX.NET/">
<soapenv:Header/>
<soapenv:Body>
<web:ConversionRate>
<web:FromCurrency>EUR</web:FromCurrency>
<web:ToCurrency>USD</web:ToCurrency>
</web:ConversionRate>
</soapenv:Body>
</soapenv:Envelope>
En este ejemplo podemos ver el mensaje SOAP generado para solicitar el cambio de
moneda de euros (EUR) a dólares americanos (USD). Desde un punto de vista funcional,
parece que la única información relevante en ese largo mensaje son seis letras: EUR y
USD. Sin embargo, el resto de la información permite dotar de significado al mensaje y
mantener la interoperabilidad entre distintas tecnologías. En concreto, los mensajes
SOAP tienen la siguiente estructura:
Para finalizar el ejemplo, mostraremos también el código generado para la respuesta del
servicio web:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ConversionRateResponse xmlns="http://www.webserviceX.NET/">
<ConversionRateResult>1.0945</ConversionRateResult>
</ConversionRateResponse>
</soap:Body>
</soap:Envelope>
Como vemos, la información para el usuario es, de nuevo, una parte muy pequeña del
mensaje: 1,0945. Sin embargo, el resto de la información del mensaje permite que
podamos trabajar de forma transparente entre distintas plataformas y lenguajes de
programación. De hecho, no sabemos en qué lenguaje puede estar implementado el
servicio web que estamos utilizando.
De esta forma, REST proporciona accesos independientes a los recursos. Esto tiene
ventajas e inconvenientes, como es habitual. La ventaja es que no necesita memoria para
almacenar información de estado, lo cual amplía significativamente el número de
peticiones que puede atender, la desventaja es que, si se requiere información de estado
o, en general, cualquier tipo de información, es necesario mandarla en cada petición.
REST tiene otras características que lo distinguen de otros tipos de arquitecturas. Por
ejemplo, REST utiliza los métodos HTTP, lo cual permite que un cliente HTTP pueda
interactuar con un servidor HTTP sin realizar ninguna configuración especial. Además,
esto permite hacer una asociación directa entre los métodos y las operaciones básicas de
manejo de datos (CRUD: Create, Read, Update, Delete), de la siguiente forma:
Una aplicación REST se compone de recursos, cada uno de los cuales se identifica
mediante una URI (Uniform Resource Identifier). Otra característica de los servicios web
REST es la forma en que utiliza las URI. Puesto que la URI de un servicio será la
forma de accederlo, éstas deben ser sencillas e intuitivas. Para conseguirlo, se utilizan
URI con formato de path, es decir, como si fuera una URL de Internet
(http://www.ejemplo.es/clientes?nombre=pepe).
Algunas recomendaciones para construir este tipo de identificadores proponen que todas
las letras sean en minúscula o que se eviten los espacios, poniendo en su lugar guiones o
guiones bajos. Como es habitual, esta identificación hace referencia al recurso, no al
estado del mismo, por lo que en peticiones diferente podremos obtener respuestas
diferentes.
Por otra parte, estos recursos pueden estar interconectados, por lo que la representación
de un estado puede incluir enlaces a unos recursos. Además, esta representación
podría realizarse en distintos lenguajes: XML, CSV (para datos sencillos) o JSON.
Para implementar un servicio web REST, por tanto, hay que traducir las URIs de los
recursos a llamadas a los scripts apropiados. La forma de hacerlo será identificar los
archivos y directorios y, a partir de ellos, lo demás serán identificadores de recursos. De
esta forma, una vez identificado el recurso, podemos obtener los parámetros y construir
una petición con la información obtenida.
Pero, en la práctica, ¿cuáles son las diferencias entre REST y SOAP? En primer
lugar, hablaremos de la forma en que se realizan las peticiones. Como vimos en el
apartado anterior, una petición SOAP es un fichero XML con información semántica que
incluye los datos que queremos enviar al servidor. Sin embargo, las peticiones en REST
serán de la siguiente forma (utilizando el método GET):
http://www.ejemplo.com/operaciones/suma?val1=3&val2=2.
Si te fijas con detenimiento, verás que hemos escrito suma en lugar de sumar, tal como
hacíamos en la operación del servicio web en SOAP. No es un error, en REST es habitual
denominar los recursos con nombre en lugar de hacerlo con verbos.
Por otra parte, REST es un formato más ligero, consume menos recursos y es más fácil
de construir y adoptar. Además, hemos comentado que el servidor no tiene estado, por
lo que son los clientes lo que tienen que gestionar esta información. Y la información
semántica es más informal que en SOAP, está orientada al usuario, por lo que el uso de
los recursos puede presentar alguna dificultad al principio.
Referencias bibliográficas
García-Sánchez, P., López, M. A., Castillo, P. A., González, J., y García Arenas María I.
(2011). Web 2.0: Arquitectura Orientada a Servicios en Java. Revista de Experiencias
Docentes en Ingeniería de Computadores, vol. 1.
Lo + recomendado
No dejes de leer…
En este enlace se introduce la forma de crear un servicio web genérico, que el autor ha
documentado en referencia a la gestión de usuarios, aunque podría servirte como
esqueleto para el desarrollo de cualquier otro servicio web. Lo más interesante de este
ejemplo es el uso de WSDL Generator para generar el fichero WSDL.
No dejes de ver…
Puedes acceder al vídeo a través del aula virtual o desde el siguiente enlace:
https://www.youtube.com/watch?v=3fUR2mNKZpM&index=1&list=PL68AB27B3444
C7A99
+ Información
A fondo
JSON tutorial
Accede al documento a través del aula virtual o desde las siguientes direcciones:
Fuente en inglés (w3schools):
http://www.w3schools.com/json/default.asp
Como hemos comentado, no es habitual usar RESTful con PHP. No obstante, hay algunas
librería que se han desarrollado para que sea posible. Para que puedas ver el
funcionamiento de REST sobre PHP, te dejamos el siguiente enlace, que implementa
funcionalidad para gestionar usuarios en una base de datos.
Enlaces relacionados
Pear
Existen frameworks de trabajo para PHP. Uno de los más utilizados actualmente el Pear,
que contiene librerías para realizar distintas operaciones habituales y, todas ellas, son de
calidad. Esto ocurre porque tiene una comunidad activa que mantiene el código y
actualiza la información de la página constantemente.
Accede a la página web a través del aula virtual o desde la siguiente dirección:
http://pear.php.net/
SOAP
Toda la información relacionada con las clases SoapServer y SoapCliente, incluyendo sus
métodos y especificaciones, así como ejemplos de uso, la puedes encontrar en el web de
PHP en español, en concreto, en el enlace que te indicamos a continuación.
Accede a la página web a través del aula virtual o desde la siguiente dirección:
http://php.net/manual/es/book.soap.php
Introducción a XML
Accede a la página web a través del aula virtual o desde la siguiente dirección:
http://www.desarrolloweb.com/manuales/18/
Bibliografía
Recursos externos
SoapUI
SoapUI es una herramienta open source que te permite ver el contenido de los mensajes
que se intercambian entre el cliente y el servidor, pudiendo hacer distintas pruebas de
forma muy intuitiva y viendo cómo se construyen los ficheros de solicitud y respuesta.
http://www.soapui.org/downloads/soapui/open-source.html
Test
10. La principal diferencia entre un servicio web SOAP y uno REST es:
A. Que REST no guarda información de estado.
B. Que SOAP no guarda información de estado.
C. Que pertenece a una arquitectura distinta.