RECURSOS DE PROGRAMACIÓN
API REST: conceptos fundamentales
Introducción práctica a recursos, endpoints, métodos HTTP, códigos de estado, parámetros y formatos de intercambio de datos.
FUNDAMENTOS
Qué es una API y qué significa REST
Una API es una interfaz que permite que dos sistemas intercambien información o ejecuten operaciones de forma estructurada.
En una API web, un cliente realiza una petición HTTP y un servidor responde con datos, normalmente en formatos como JSON.
Cliente ↓
Petición HTTP ↓
API ↓
Lógica / Datos ↓
Respuesta HTTP ↓
ClienteREST es un estilo arquitectónico para sistemas distribuidos. Una API que utiliza HTTP no es automáticamente una API REST: debe respetar una serie de principios y convenciones.
MODELO
Recursos, URI y endpoints
En REST, la información se modela normalmente como recursos. Un recurso puede representar un usuario, producto, pedido, curso o cualquier otra entidad.
Ejemplos de URI:
/usuarios
/usuarios/42
/productos
/productos/15
/pedidos/120Un endpointes una combinación de método HTTP y ruta que expone una operación.
| Método | Ruta | Objetivo |
|---|---|---|
GET | /productos | Obtener productos |
GET | /productos/15 | Obtener un producto concreto |
POST | /productos | Crear un producto |
PATCH | /productos/15 | Modificar parcialmente un producto |
DELETE | /productos/15 | Eliminar un producto |
PETICIÓN
Qué contiene una request HTTP
Una petición HTTP puede contener varios elementos.
- Método HTTP.
- URI.
- Headers.
- Parámetros.
- Cuerpo de la petición cuando sea necesario.
Ejemplo conceptual:
POST /api/productos HTTP/1.1
Host: api.ejemplo.com
Content-Type: application/json
Authorization: Bearer <token> { "nombre": "Teclado", "precio": 49.90}En este caso, el cliente solicita crear un producto y envía los datos en formato JSON.
RESPUESTA
Qué contiene una response HTTP
La respuesta del servidor incluye un código de estado, headers y, cuando corresponde, un cuerpo con datos.
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/productos/15 { "id": 15, "nombre": "Teclado", "precio": 49.90}El código 201 Createdindica que se ha creado correctamente un nuevo recurso.
OPERACIONES
Métodos HTTP más habituales
| Método | Uso habitual | Ejemplo |
|---|---|---|
GET | Consultar recursos | GET /productos |
POST | Crear un nuevo recurso | POST /productos |
PUT | Reemplazar o actualizar completamente un recurso según el diseño de la API | PUT /productos/15 |
PATCH | Realizar una actualización parcial | PATCH /productos/15 |
DELETE | Eliminar un recurso | DELETE /productos/15 |
El significado concreto de PUTy PATCHpuede depender del diseño de la API, pero conviene mantener una semántica coherente y documentada.
SEMÁNTICA HTTP
Métodos seguros e idempotentes
Comprender la semántica de los métodos HTTP ayuda a diseñar APIs más previsibles.
| Método | Seguro | Idempotente |
|---|---|---|
GET | Sí | Sí |
POST | No | No, por regla general |
PUT | No | Sí |
PATCH | No | No necesariamente |
DELETE | No | Sí |
Un método idempotente puede repetirse varias veces con el mismo efecto previsto sobre el estado del recurso que ejecutarlo una sola vez.
CÓDIGOS DE ESTADO
Interpretar la respuesta del servidor
| Código | Significado habitual | Ejemplo de uso |
|---|---|---|
200 OK | Operación correcta | Consulta completada |
201 Created | Recurso creado | POST correcto |
204 No Content | Operación correcta sin cuerpo de respuesta | DELETE o actualización sin contenido |
400 Bad Request | Petición incorrecta | Datos inválidos o mal formados |
401 Unauthorized | Falta autenticación válida | Token ausente o inválido |
403 Forbidden | Acceso no permitido | Usuario autenticado sin permisos suficientes |
404 Not Found | Recurso no encontrado | ID inexistente |
409 Conflict | Conflicto con el estado actual | Duplicado o conflicto de versión |
500 Internal Server Error | Error interno del servidor | Fallo no controlado |
El código debe describir el resultado real de la operación. Devolver siempre 200, incluso cuando existe un error, dificulta el uso y mantenimiento de la API.
REPRESENTACIÓN
JSON como formato de intercambio
JSON es uno de los formatos más utilizados para intercambiar información entre clientes y APIs web.
{ "id": 15, "nombre": "Teclado", "precio": 49.90, "stock": 8, "activo": true}JSON permite representar objetos, arrays, cadenas, números, valores booleanos y null.
No debemos confundir JSON con JavaScript: comparten una sintaxis similar para representar datos, pero JSON es un formato de intercambio independiente.
METADATOS
Headers habituales
Los headers transportan información adicional sobre la petición o la respuesta.
| Header | Uso habitual |
|---|---|
Content-Type | Indica el formato del cuerpo enviado |
Accept | Indica qué formatos acepta el cliente |
Authorization | Transporta información de autenticación |
Location | Puede indicar la URI de un recurso creado o una redirección |
Cache-Control | Define políticas de caché |
Ejemplo:
Content-Type: application/json
Accept: application/json
Authorization: Bearer <token>PARÁMETROS
Path parameters y query parameters
Path parameters
Forman parte de la propia ruta y suelen identificar un recurso concreto.
GET /productos/15Aquí 15identifica el producto solicitado.
Query parameters
Se añaden después de ?y suelen utilizarse para filtros, ordenación, paginación u opciones de consulta.
GET /productos?categoria=teclados&orden=precioLos parámetros adicionales se separan mediante &.
COLECCIONES
Filtrado, ordenación y paginación
Los endpoints que devuelven colecciones suelen necesitar mecanismos para controlar la cantidad y el orden de los datos.
Filtrado:
GET /productos?activo=trueOrdenación:
GET /productos?sort=precioPaginación:
GET /productos?page=2&limit=20No existe una única convención universal para estos parámetros. Lo importante es definir un criterio coherente y documentarlo.
DISEÑO
Diseñar rutas orientadas a recursos
Una API REST suele expresar recursos mediante sustantivos y utilizar los métodos HTTP para indicar la operación.
Patrón habitual:
GET /usuarios
GET /usuarios/42
POST /usuarios
PATCH /usuarios/42
DELETE /usuarios/42Conviene evitar rutas que dupliquen innecesariamente la acción del método:
/obtenerUsuarios
/crearUsuario
/eliminarUsuarioEsto no significa que toda operación pueda modelarse siempre como un CRUD simple, pero pensar primero en recursos suele producir una interfaz más coherente.
SEGURIDAD
Autenticación y autorización no son lo mismo
Autenticaciónresponde a la pregunta: ¿quién eres?
Autorizaciónresponde a la pregunta: ¿qué puedes hacer?
Una API puede utilizar distintos mecanismos de autenticación. Un ejemplo habitual es transmitir un token mediante el header Authorization.
Authorization: Bearer <token>El diseño de autenticación requiere medidas adicionales como HTTPS, validación de tokens, expiración, protección de credenciales y control de permisos.
Nunca deben incluirse secretos reales en ejemplos, repositorios o documentación pública.
VALIDACIÓN
Validar los datos recibidos
Una API no debería asumir que los datos enviados por un cliente son correctos.
Por ejemplo, ante una petición:
{ "nombre": "", "precio": -25}el servidor debería validar reglas como:
- campos obligatorios;
- tipos esperados;
- rangos permitidos;
- formatos;
- reglas de negocio.
Los mensajes de error deben aportar suficiente información al cliente sin exponer detalles internos sensibles.
ERRORES
Diseñar respuestas de error consistentes
Una API resulta más sencilla de consumir cuando los errores utilizan una estructura uniforme.
Por ejemplo:
{ "error": "validation_error", "message": "Los datos enviados no son válidos.", "details":{ "precio": "Debe ser mayor que cero."}}El formato concreto puede variar, pero mantener una estructura estable facilita que los clientes gestionen los errores correctamente.
EVOLUCIÓN
Versionar una API
Cuando una API cambia de forma incompatible, puede ser necesario mantener diferentes versiones durante un periodo de transición.
Una estrategia frecuente consiste en incluir la versión en la ruta:
/api/v1/productos
/api/v2/productosTambién existen otras estrategias. La elección depende del diseño y de las necesidades del servicio.
No todos los cambios requieren una nueva versión. Añadir un campo opcional puede ser compatible, mientras que eliminar o cambiar el significado de un campo puede romper clientes.
RENDIMIENTO
Caché y respuestas HTTP
HTTP dispone de mecanismos de caché que pueden reducir peticiones innecesarias y mejorar el rendimiento.
Por ejemplo:
Cache-Control: public, max-age=3600No todas las respuestas deben almacenarse en caché. Datos privados o altamente dinámicos requieren políticas adecuadas a su contexto.
PRUEBAS
Probar una API con curl
curlpermite realizar peticiones HTTP desde terminal y resulta muy útil para comprobar endpoints.
GET
curl https://api.ejemplo.com/productosPOST con JSON
curl -X POST https://api.ejemplo.com/productos \
-H "Content-Type: application/json" \
-d '{ "nombre": "Teclado", "precio": 49.90 }'Las opciones y el tratamiento de comillas pueden variar ligeramente según la terminal utilizada.
PRÁCTICA PROPUESTA
Diseñar una API de tareas
Diseña conceptualmente una API para gestionar tareas con estos campos:
{ "id": 1, "titulo": "Preparar documentación", "completada": false}Define los endpoints necesarios para:
- Consultar todas las tareas.
- Consultar una tarea por ID.
- Crear una tarea.
- Modificar su título.
- Marcarla como completada.
- Eliminarla.
Una posible propuesta sería:
| Operación | Endpoint |
|---|---|
| Listar tareas | GET /tareas |
| Consultar tarea | GET /tareas/1 |
| Crear tarea | POST /tareas |
| Modificar parcialmente | PATCH /tareas/1 |
| Eliminar | DELETE /tareas/1 |
Como ampliación, define qué códigos HTTP debería devolver cada endpoint en caso de éxito y en situaciones de error.
ERRORES HABITUALES
Problemas frecuentes al diseñar APIs
| Problema | Mejora |
|---|---|
| Usar siempre POST | Elegir el método HTTP según la operación realizada. |
| Devolver siempre 200 | Utilizar códigos de estado que representen el resultado real. |
Rutas como /crearProducto | Modelar recursos y utilizar métodos HTTP. |
| Enviar miles de registros | Aplicar paginación y filtros. |
| No validar el body | Validar tipos, campos y reglas de negocio. |
| Exponer errores internos | Devolver mensajes útiles sin revelar detalles sensibles. |
| Guardar secretos en el código cliente | Gestionar credenciales y autenticación de forma segura. |
| Cambiar contratos sin control | Evaluar compatibilidad y estrategia de versionado. |
CRITERIO PROFESIONAL
Buenas prácticas básicas
- Diseña rutas coherentes y orientadas a recursos.
- Utiliza correctamente la semántica de los métodos HTTP.
- Devuelve códigos de estado representativos.
- Mantén formatos de respuesta consistentes.
- Valida siempre los datos recibidos.
- Implementa autenticación y autorización según el riesgo del servicio.
- Utiliza HTTPS para proteger el tráfico en entornos reales.
- Evita exponer información interna en mensajes de error.
- Implementa paginación en colecciones grandes.
- Documenta parámetros, cuerpos, respuestas y errores.
- Considera compatibilidad antes de modificar el contrato de una API publicada.
REFERENCIA RÁPIDA
Conceptos esenciales
| Concepto | Idea principal |
|---|---|
| API | Interfaz para que sistemas intercambien operaciones o datos |
| REST | Estilo arquitectónico para sistemas distribuidos |
| Recurso | Entidad representada por la API |
| Endpoint | Combinación de método y ruta |
| URI | Identificador de un recurso o ruta |
| Request | Petición enviada al servidor |
| Response | Respuesta producida por el servidor |
| Header | Metadatos HTTP |
| JSON | Formato habitual de intercambio de datos |
| Path parameter | Valor incluido en la ruta |
| Query parameter | Parámetro añadido a la URI para filtrar o modificar la consulta |
| 2xx | Operaciones correctas |
| 4xx | Problemas asociados a la petición del cliente |
| 5xx | Errores del servidor |
PARA AMPLIAR
Documentación de referencia
Esta guía resume conceptos fundamentales para comprender y diseñar APIs HTTP. Para profundizar conviene consultar las especificaciones y documentación técnica.