Documentos de Académico
Documentos de Profesional
Documentos de Cultura
En esta entrada voy a resumir los conceptos ms importantes que he tratado en mis
ponencias sobre REST.
Qu es REST?
REST, REpresentational State Transfer, es un tipo de arquitectura de desarrollo web que se
apoya totalmente en el estndar HTTP.
REST nos permite crear servicios y aplicaciones que pueden ser usadas por cualquier
dispositivo o cliente que entienda HTTP, por lo que es increblemente ms simple y
convencional que otras alternativas que se han usado en los ltimos diez aos como SOAP
y XML-RPC.
REST se defini en el 2000 por Roy Fielding, coautor principal tambin de la
especificacin HTTP. Podramos considerar REST como un framework para construir
aplicaciones web respetando HTTP.
Por lo tanto REST es el tipo de arquitectura ms natural y estndar para crear APIs para
servicios orientados a Internet.
Existen tres niveles de calidad a la hora de aplicar REST en el desarrollo de una aplicacin
web y ms concretamente una API que se recogen en un modelo llamado Richardson
Maturity Model en honor al tipo que lo estableci, Leonard Richardson padre de la
arquitectura orientada a recursos. Estos niveles son:
1. Uso correcto de URIs
2. Uso correcto de HTTP.
3. Implementar Hypermedia.
Adems de estas tres reglas, nunca se debe guardar estado en el servidor, toda la
informacin que se requiere para mostrar la informacin que se solicita debe estar en la
consulta por parte del cliente.
Al no guardar estado, REST nos da mucho juego, ya que podemos escalar mejor sin tener
que preocuparnos de temas como el almacenamiento de variables de sesin e incluso,
podemos jugar con distintas tecnologas para servir determinadas partes o recursos de una
misma API.
Cuando desarrollamos una web o una aplicacin web, las URLs nos permiten acceder a
cada uno de las pginas, secciones o documentos del sitio web.
Cada pgina, informacin en una seccin, archivo, cuando hablamos de REST, los
nombramos como recursos.
El recurso por lo tanto es la informacin a la que queremos acceder o que queremos
modificar o borrar, independientemente de su formato.
Las URL, Uniform Resource Locator , son un tipo de URI, Uniform Resource Identifier,
que adems de permitir identificar de forma nica el recurso, nos permite localizarlo para
poder acceder a l o compartir su ubicacin.
Una URL se estructura de la siguiente forma:
{protocolo}://{dominio o hostname}[:puerto (opcional)]/{ruta del
recurso}?{consulta de filtrado}
Los nombres de URI no deben implicar una accin, por lo tanto debe evitarse usar
verbos en ellos.
Deben ser nicas, no debemos tener ms de una URI para identificar un mismo
recurso.
Por ejemplo, la URI /facturas/234.pdf no sera una URI correcta, ya que estamos
indicando la extensin pdf en la misma.
Para el recurso factura con el identificador 234, la siguiente URI sera la correcta,
independientemente de que vayamos a consultarla en formato pdf, epub, txt, xml o
json: /facturas/234
Las URIs deben mantener una jerarqua lgica
Por ejemplo, la URI /facturas/234/cliente/007 no sera una URI correcta, ya que no sigue
una jerarqua lgica.
Para el recurso factura con el identificador 234 del cliente 007, la siguiente URI sera la
correcta: /clientes/007/facturas/234
Filtrados y otras operaciones.
Para filtrar, ordenar, paginar o buscar informacin en un recurso, debemos hacer una
consulta sobre la URI, utilizando parmetros HTTP en lugar de incluirlos en la misma.
Por ejemplo, la URI /facturas/orden/desc/fecha-desde/2007/pagina/2 sera incorrecta ya
que el recurso de listado de facturas sera el mismo pero utilizaramos una URI distinta para
filtrarlo, ordenarlo o paginarlo.
La URI correcta en este caso sera:
/facturas?fecha-desde=2007&orden=DESC&pagina=2
Nivel 2: HTTP
Conocer bien HTTP no es opcional para un desarrollador web al que le importe su trabajo.
Aunque el RFC es sencillo de leer, si ests interesado en aprender bien las bases de este
protocolo es muy recomendable la gua de OReilly sobre el mismo.
Para desarrollar APIs REST los aspectos claves que hay que dominar y tener claros son:
Mtodos HTTP
Cdigos de estado
Mtodos.
Como hemos visto en el anterior nivel, a la hora de crear URIs no debemos poner verbos
que impliquen accin, aunque queramos manipular el recurso.
Para manipular los recursos, HTTP nos dota de los siguientes mtodos con los cuales
debemos operar:
1
2
3
4
5
6
7
8
9
10
11
12
13
Peticin
========
PUT /facturas/123
Respuesta
=========
Status Code 200
Content:
{
success: false,
code:
734,
error:
"datos insuficientes"
}
En este ejemplo se devuelve un cdigo de estado 200, que significa que la peticin se ha
realizado correctamente, sin embargo, estamos devolviendo en el cuerpo de la respuesta un
error y no el recurso solicitado en la URL.
Este es un error comn que tiene varios inconvenientes:
No es REST ni es estndar.
El cliente que acceda a este API debe conocer el funcionamiento especial y cmo
tratar los errores de la misma, por lo que requiere un esfuerzo adicional importante
para trabajar con nosotros.
HTTP tiene un abanico muy amplio que cubre todas las posibles indicaciones que vamos a
tener que aadir en nuestras respuestas cuando las operaciones han ido bien o mal.
Es imperativo conocerlos y saber cundo utilizarlos, independientemente de que desarrolles
siguiendo REST.
El siguiente ejemplo sera correcto de la siguiente forma:
1
2
3
4
5
6
7
8
9 {
10
Peticin
========
PUT /facturas/123
Respuesta
=========
Status Code 400
Content:
message: "se debe especificar un id de cliente para la factura"
11
En este caso, el cliente solicita la factura en epub comprimido con ZIP y de no tenerlo, en
pdf o json por orden de preferencia. El servidor le devuelve finalmente la factura en pdf.
Nivel 3: Hypermedia.
A pesar de lo que nos pueda inducir a pensar el trmino retrofuturista Hypermedia, el
concepto y la finalidad que busca describir es bastante sencillo: conectar mediante
vnculos las aplicaciones clientes con las APIs, permitiendo a dichos clientes
despreocuparse por conocer de antemano del cmo acceder a los recursos.
Con Hypermedia bsicamente aadimos informacin extra al recurso sobre su conexin a
otros recursos relacionados con l.
Aqu tenemos un ejemplo:
1
2
3
4
5
<pedido>
<id>666</id>
<estado>Procesado</estado>
<links>
<link rel="factura">
6
7
8
9
http://example.com/api/pedido/666/factura
</link>
</links>
</pedido>
En este ejemplo vemos cmo indicar en un xml que representa un pedido, el enlace al
recurso de la factura relacionada con el mismo.
Sin embargo, necesitamos que el cliente que accede a nuestra API entienda que esa
informacin no es propia del recurso, sino que es informacin aadida que puede utilizar
para enlazar el pedido con la factura.
Para ello conseguir esto, debemos utilizar las cabeceras Accept y Content-Type, para que
tanto el cliente como la API, sepan que estn hablando hypermedia.
Por ejemplo:
1
Peticin
2
========
3 GET /pedido/666
4 Accept: application/nuestra_api+xml, text/xml
5
6
Respuesta
7
=========
8
Status Code: 200
9
Content-Type: application/nuestra_api+xml
10 Content:
11
12
<pedido>
13
<id>666</id>
14
<estado>Procesado</estado>
15
<links>
16
<link rel="factura">
17
http://example.com/api/pedido/666/factura
18
</link>
19
</links>
20
</pedido>
futuro dichas URLs cambian (cosa que no debera pasar). Tambin es til para automatizar
procesos entre APIs sin que haya interaccin humana.
Conclusin
Como hemos visto, los principios bsicos para construir APIs REST se basan en conocer
sobre todo HTTP, algo que no es opcional para un desarrollador web.