lunes, 5 de noviembre de 2012

Java RESTfull web service with json and jboss

SOAP vs REST. Java Web Services  

Aunque la comparativa entre servicios SOAP y RESTfull no es nueva ha adquirido un enfoque especial debido a las plataformas móviles que están en el mercado con una fuerza innegable, cuyos dos estandartes son iOS y Android.

Vamos a ver un poco de historia de ambos, las principales ventajas e inconvenientes bajo la humilde opinión del que suscribe y finalmente en sucesivos artículos veremos un ejemplo de creación de un servicio RESTfull con Java, JSON, maven y jboss 7.1.1, así como un ejemplo de clientes en Android e iOS.


SOAP

Cuando se habla de servicios web a aquellos que nos dedicamos a la consultoría 'estándar', lo primero que nos suele venir a la cabeza es SOAP (Simple Object Access Protocol). SOAP es un estándar de comunicaciones basado en XML, mediante SOAP se define un contrato (WSDL) que es implementado por el servidor y consumido por el cliente.

La tarea de definir un servicio SOAP es relativamente sencilla, una vez definido el servicio las herramientas de los servidores de aplicaciones o los frameworks de terceros se encargan de generar el contrato (WSDL) así como los archivos necesarios para los clientes. SOAP ofrece unas ventajas muy claras como son:

  • Definición de un contrato en todos los métodos que ofrece el servicio web.
  • Independencia de la capa de transporte, se puede usar SOAP sobre HTTP, SMTP, TCP, JMS, etc…
  • Independencia del lenguaje de programación usado para crear el servicio y para consumirlo, se puede crear en servicio en Java y consumirlo en .NET por ejemplo.
  • Permite la interoperabilidad de distintas plataformas.

Un poco de historia de SOAP en java

Los servicios web en java tiene su primera especificación formal en JAX-RPC 1.0 y JAX-RPC 1.1 (Java Api for XML - Remote Procedure Call). Esta especificación fué mejorada con lo que iba a ser JAX-RPC 2.0 que finalmente acabó siendo JAX-WS (Java Api for Xml - Web Services). Hay varias implementaciones de JAX-RPC como por ejemplo Axis (Apache) o JWSDP (Java Web Service Developer Pack, de Sun Microsystems). En cuanto a JAX-WS tenemos Axis2 (apache) o Metro (evolución de JWSDP, Oracle).

JAX_RPC está basado en java 4, mientras que JAX-WS está basado en Java 5 usando anotaciones y demás características introducidas en esta versión de java.

Para detalles concretos os dejo este enlace de ibm.

En la práctica, y bajo mi experiencia profesional y personal la verdad es que cumple con sus ventajas aunque con algunos 'peros':

  • Es cierto que ofrece un contrato cerrado, pero esto también ofrece unas limitaciones con ciertos objetos del lenguaje usado para crear el servicio, lo cual añade una restricción al uso del lenguaje.
  • Hacer un cambio en la signatura de algún método del servicio web implica tener que regenerar el cliente del servicio web, lo cual para los clientes reales -las personas- puede ser un verdadero trastorno, por no hablar de los inconvenientes de los fallos puntuales por la falta de comunicación de estos cambios, bien sea por no transmitirlos o porque el receptor creyó entender otra cosa… algo que sobre el papel parece ridículo, pero que es mas común de lo que se puede desear.
  • El transporte sobre XML es una ventaja porque te desvincula del transporte usado (HTTP, etc..), pero esto también puede ser un problema… usar esto por ejemplo en algo ligero como Javascript puede ser literalmente la muerte en vida… En una plataforma móvil, la cual está limitada en recursos, la carga añadida de trafico de red por el volumen del XML así como su tratamiento de recepción/envío es una carga añadida que nos puede jugar una mala pasada en picos de actividad del dispositivo…

RESTfull

Fue definido por Roy Fielding en su tesis doctoral. REST (Representational State Transfer), es un estilo de arquitectura. Las principales ventajas son:

  • No añade capas adicionales como SOAP lo cual lo hace mas ligero.
  • Usa el transporte HTTP como medio de comunicación.
  • No mantiene estado en las peticiones.
  • Puede transferir los datos a través de JSON (JavaScript Object Notation), a través de XML o de ambos.
  • Se basa en Java 5 o superior, con lo cual aporta anotaciones que facilitan mucho su codificación.
  • Define un método como una URI, en un formato que recuerda mucho al de directorios, y lo hace accesible a través de HTTP.

Historia REST en Java

Al principio, cuando Roy Fielding lo presentó en California en el año 2000, no tuvo una gran transcendencia, pero años después acabó desplazando a SOAP y se convirtió en una parte de la especificación de java, la JSR-311. La implementación de java es JAX-RS.

Sitios como Google, Facebook, Flickr, Twitter, etc… están basados en servicios de este tipo.


SOAP Vs REST

Pues ahora que hemos visto un poco de ambos ya nos podemos hacer una ligera idea de los puntos fuertes y débiles de cada uno… así que al final nuestra decisión de cual usar dependerá de que es lo que queramos hacer,  por poner dos ejemplos:

  • Si necesitamos mantener transacciones, o mantener el estado deberíamos optar por SOAP.
  • Si vamos a integrarnos con plataformas como JavaScript, Android, iOS, etc.. deberiamos optar por REST.

En el próximo articulo vamos a realizar un ejemplo práctico de la creación de un servicio web REST con Java que transmitira datos en formato JSON, para desplegarlo en JBOSS 7.1.1. Finalmente, en un tercer artículo realizaremos un cliente en Android y otro iOS que lo consuman.

No hay comentarios:

Publicar un comentario