Según los gurús del estilo REST uno de sus puntos fuertes respecto a SOAP es su sencillez. Y no dudo que no sea más sencillo, pero lo que tengo claro es que requiere un relativamente gran esfuerzo implementar servicios de este tipo. ¿Por qué digo esto?. Por la inercia de llevar varios años diseñando servicios SOAP.
Si seguimos el estilo REST tendremos que volver un poco a los orígenes, a la esencia misma de HTTP. Un protocolo que se inventó para trabajar con recursos y las típicas operaciones CRUD de toda aplicación de gestión. Y eso está muy bien, el problema está en que llevamos muchos años trabajando, y pensando, de otra manera.
Digamos que a lo largo de estos años hemos utilizado el protocolo HTTP para implementar nuestras aplicaciones apartándonos del estándar. Hace ya unos años, cuando empecé con la programación con java en el servidor, al menos respetaba la diferencia entre una operación HTTP GET de un POST. Así las funcionalidades de consulta, que no cambiaban el estado de la aplicación las implementaba con un GET, mientras que aquellas que tenían como efecto un cambio en la base de datos, se hacían mediante un POST.
Volviendo a aprender a diseñar URL
Este mínimo seguimiento del estándar HTTP, se olvido por completo con el uso de los frameworks (caso de Struts por ejemplo). Directamente todo iba por POST.
Caso parecido pasó con las URL. Olvidamos muy pronto que significan «localizador universal de recurso» y las desnaturalizamos hasta construir unas URL artificiales tipo midominino.com/miAplicacion/consultarSaldo.do?cuenta=123 o incluso peor. Cosa que nos llevó años después a descubrir que no eran «amigables«.
Tal es nuestra «deformación profesional» que si ahora nos ponemos a pensar en cómo serían unas URL bien formadas, que definan recursos (para lo que fueron diseñadas) nos cuesta un gran esfuerzo. Especialmente recomendable es este artículo de http://redrata.com/restful-uri-design/
Según este blog, las URL deben ser:
- cortas
- autodescriptivas del recurso
- predecibles: viendo una debería ser muy fácil adivinar la de otro recurso
- nombres, no verbos
- la URL debe continuar funcionando mientras el recurso exista.
- y muchas más
Control de errores
Otro tanto paso con el control de errores y códigos de retorno que se devuelven al usuario. Son varias decenas los códigos de retorno que define HTTP (no hay más que ver la página de W3C) , sin embargo, nos empeñamos a usar uno únicamente, el 500.
Por poner un par de ejemplos, si estamos haciendo la consulta de una cuenta corriente, y ésta no existe, no hay que devolver un error 500 con un texto del estilo «cuenta corriente no existe». En este caso, tal como se podría esperar, hay que devolver un códo 404, que significa ni más ni menos eso, el recurso no existe.
Si en un recurso de sólo lectura, intentamos ejecutar la operación DELETE, es necesario devolver un error 501, que significa precisamente que el método no está implementado.
En resumen, sobre los códigos devueltos no debemos reinventar la rueda, debemos mirar la lista de códigos HTTP y devolver uno de ellos. Deberían ser suficientes para todos los casos.
Conclusión
Lo que percibo de todo esto es que el formato REST de servicios es más sencillo pero nos cuesta bastante pensar y diseñar servicios de este tipo porque estamos viciados por muchos años de darle la espalda al protocolo HTTP.
Tendremos que hacer un esfuerzo de desaprender antes de aprender de nuevo.
Pensando en SOA by Andrés Hevia is licensed under a Creative Commons Reconocimiento 3.0 Unported License
17/07/2012 at 15:37
Hola Andrés,
Interesante post. Tengo una duda al respecto, cuando hablas de REST, ¿te estás refiriendo a crear una API o a crear servicios RESTful?
Todavía no existe ningún estándar para la especificación de servicios RESTful, aunque existen varias soluciones al respecto, en mi opinión convierten los servicios RESTful en «SOAP-based» (ejemplo WSDL 2.0, WADL), por lo que pierden sencillez.
¡Suerte con el libro!
17/07/2012 at 15:38
Hola Andrés,
Interesante post. Tengo una duda al respecto, cuando hablas de REST, ¿te estás refiriendo a crear una API o a crear servicios RESTful?
Todavía no existe ningún estándar para la especificación de servicios RESTful, aunque existen varias soluciones al respecto, en mi opinión convierten los servicios RESTful en \”SOAP-based\” (ejemplo WSDL 2.0, WADL), por lo que pierden sencillez.
¡Suerte con el libro!
17/07/2012 at 16:18
Me refería a RESTFul. Y efectivamente si empezamos a complicarlos con WADL y cosas parecidas al final tendremos SOAP.
04/09/2012 at 00:12
estimado andres, le agradeceria si me recomienda un buen libro para implementar web services ya sea por rest o soap. estoy precisando incorporar datos de terceros en una aplicacion de ecommerce y no tengo en claro como abordarlo. principalmente ya que debo incorporar datos de varios sitios – amazon, ebay etc. – a la vez y mostrarlos. estoy trabajando en asp.net mvc . muchas gracias!
04/09/2012 at 07:29
Entiendo que todos esos terceros de los que hablas usan REST ya que es lo habitual en estos sitios.
Yo siempre he trabajado en el mundo Java, así que no puedo recomendarte nada concreto para ASP. Trataré de preguntar a algún colega.
Saludos
10/09/2012 at 16:54
muchas gracias andres!, sebastian.