Buenas prácticas con servicios REST

En esta sección vamos a comentar una serie de buenas prácticas a llevar a cabo para que nuestros servicios web estén bien diseñados, lo que nos permitirá reducir los costes de mantenimiento y gestionar de manera más eficiente todas las operaciones.

Éstas son recomendaciones de buen uso ya que no hay un estándar que permita ajustarnos a unas reglas, por lo tanto se deben seguir de manera razonable, siempre y cuando no suponga desvirtuar nuestra api.

Como hemos visto en la sección Comenzando con los servicios REST: ¿qué es un servicio REST? los servicios REST se basan en recursos sobre los cuales podemos actuar usando los “verbos”: GET, POST, PUT, DELETE. Con esta premisa en mente debemos diseñar nuestra api REST y sus diferentes funcionalidades.

A continuación vamos a mencionar los principios básicos a la hora de construir nuestros servicios REST.

Utilizar preferentemente nombres y no verbos

Como hemos visto con anterioridad, los servicios REST se basan en recursos, por lo tanto en nuestra url, a la hora de especificar el método al que llamar deberemos hacerlo con el nombre del recurso (en plural) en vez de un verbo que indique una acción.

Con la nomenclatura por nombres y haciendo uso de las peticiones GET, POST, PUT y DELETE podremos llevar a cabo nuestra funcionalidad de manera estándar.

No debemos usar verbos como, para el caso anterior:

/getAllCars       -> Listar coches
/createNewCar     -> Crear coche
/deleteAllRedCars ->Borrar coches rojos

No obstante en el caso de que una determinada acción no vaya asociada directamente a un recurso, sí que deberemos utilizar verbos para especificar la acción a realizar por el backend. Un ejemplo de esto sería la realización de un login.

El verbo GET nunca debe alterar el estado de un recurso

Para modificar un recurso ya disponemos de los verbos POST, PUT y DELETE. No obstante en ocasiones cuando lo que queremos es hacer un cambio pequeño, como pasar un objeto de habilitado a deshabilitado, podemos estar tentados de hacer la petición GET correspondiente con un parámetro para activar o desactivar.

Esta manera de proceder no es correcta, ya que el método GET tiene como única misión acceder al recurso pero sin cambiarle el estado.

GET /alumnos/711?activo <-- Incorrecto
GET /alumnos/711/activo <-- Incorrecto

Usar siempre el plural

Debemos usar siempre el plural a la hora de referirnos a los recursos y asegurarnos que en toda nuestra api es así.

Usar subrecursos cuando hay relaciones entre entidades

Si tenemos dos entidades, asignaturas y alumnos, y ambas están relacionadas, para hacer una consulta sobre ellas debemos usar los subrecursos. Es decir, dada la siguiente url:

GET /asignaturas/711/alumnos/

Llamamos subrecurso a un recurso dentro de otro, es decir “alumnos” sería un subrecurso de “asignaturas”.

El uso de los subrecursos es para identificar relaciones en la url y mantener el enfoque basado a recursos de REST.

GET /asignaturas/711/listaAlumnos/ <-- Incorrecto

Separar las partes públicas y privadas de nuestra API

A la hora de diseñar nuestra API rest es recomendable separar la parte de la API que requiere autenticación de la parte de la API que es pública y accesible por cualquier usuario.

Para ello podemos definir dos puntos de acceso a nuestra API uno “public” y otro “private”

GET ..public/asignaturas/711/   <-- Consulta
POST ..private/asignaturas/711  <-- Modificacion

Versionar nuestra API

Para mantener el desarrollo continuo independiente del mantenimiento es recomendable que versionemos nuestra API. Este pequeño cambio nos da una gran flexibilidad si tenemos que realizar una API paralela que modifica comportamientos de la ya existente.

En este caso podemos mantener ambas API por retrocompatibilidad, o mantener la antigua un tiempo hasta que decidamos darla de baja.

Para versionar nuestra API es suficiente con poner v1.0, v1.1,v2.0 etc dentro de la URL para separar las diferentes versiones de la misma.

 ../doctorados/v1.0/trabajos
 ../doctorados/v2.0/trabajos 

Ejemplos completos

A continuación se muestran dos ejemplos completos de endpoints que reúnen todas las recomendaciones propuestas:

Ejemplo endpoint completo público:

https://miaplicacion.um.es/miaplicacion/rest/v1.0/public/recurso/subrecurso

Ejemplos endpoint completo privado:

    
https://miaplicacion.um.es/miaplicacion/rest/v1.0/private/recurso/subrecurso

Como se ha mencionado anteriormente, recurso y subrecurso son los objetos de la lógica de nuestra aplicación y deben referenciarse siempre en plural (p.ej. alumnos, asignaturas, artículos, etc…).

Usar HeaderParams para incluir información sensible

Pese a que usar los parámetros de cabecera no garantiza ninguna seguridad en la comunicación, es recomendable usarlos para intercambiar el usuario, contraseña y token de sesión entre dispositivos.

Gestionar los errores con los códigos HTTP estándar

Para mejorar la gestión de nuestra API, es necesario usar los códigos HTTP estándar ya que garantizan una homogeneidad en el tratamiento de las respuestas.

Junto con estos códigos podemos enriquecer la respuesta con un mensaje mas detallado, pero es muy importante el uso de los mismos ya que cualquier navegador es capaz de entenderlos y procesarlos.

Dentro de todos los códigos que podemos utilizar, destacaremos 9 ya que son los más comunes:

  • 200 – OK – Petición correcta
  • 201 – OK – Recurso creado correctamente
  • 204 – OK – Recurso eliminado correctamente
  • 304 – Not Modified – El cliente puede usar la caché
  • 400 – Bad Request – La petición es incorrecta o no se pudo atender. Normalmente en el payload de esta respuesta viene una descripción más detallada de lo ocurrido.
  • 401 – Unauthorized – La petición requiere que el usuario se autentique.
  • 403 – Forbidden – El acceso al recurso está restringido.
  • 404 – Not found – No se encuentra el recurso
  • 500 – Internal Server Error – Un error ha ocurrido en la parte del servidor.

Puede encontrar más información sobre el manejo de errores y sus buenas prácticas en la siguiente wiki: Manejo de errores en servicios REST

  • fdw2.0/fundeweb2.0/gt/rest/buenas_practicas.txt
  • Última modificación: 06/09/2023 10:19
  • por JUAN MIGUEL BERNAL GONZALEZ