Creación de endpoints con DELETE

Objetivo de esta sección

  • Entender qué es el método DELETE y cuándo usarlo.
  • Crear un endpoint que permita eliminar recursos existentes.
  • Aprender a combinar Path Parameters (para identificar el recurso a eliminar) con validaciones.
  • Manejar códigos de estado adecuados y excepciones (404 Not Found).

Qué es DELETE?

DELETE es un método HTTP que se utiliza para eliminar un recurso identificado por un ID. Por lo general, se pasa el identificador en la URL (Path Parameter).

Diferencias con los métodos anteriores:

  • POST: crea un recurso nuevo.
  • PUT: actualiza un recurso existente.
  • DELETE: elimina un recurso existente.

Base de datos simulada

Vamos a seguir con el mismo ejemplo de productos que venimos usando:

from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel, Field
from typing import List

app = FastAPI(title="API de Productos con DELETE")

# --------- Modelo ----------
class Producto(BaseModel):
    codigo: int = Field(gt=0, description="Identificador único")
    descripcion: str = Field(min_length=3, max_length=100)
    precio: float = Field(gt=0, description="Precio mayor que 0")

# --------- Base simulada ----------
productos_db: List[Producto] = [
    Producto(codigo=1, descripcion="Teclado", precio=50.0),
    Producto(codigo=2, descripcion="Mouse", precio=30.0),
]

Endpoint DELETE para eliminar productos

@app.delete("/productos/{codigo}", status_code=status.HTTP_204_NO_CONTENT)
def eliminar_producto(codigo: int):
    # Buscar producto por índice
    for index, producto in enumerate(productos_db):
        if producto.codigo == codigo:
            productos_db.pop(index)  # Eliminar de la lista
            return  # No devolvemos nada porque el recurso ya no existe

    # Si no se encontró
    raise HTTPException(
        status_code=status.HTTP_404_NOT_FOUND,
        detail="Producto no encontrado"
    )

Explicación paso a paso

Decorador

@app.delete("/productos/{codigo}")
  • Define un endpoint DELETE.
  • codigo se recibe como Path Parameter para identificar el producto.

Búsqueda y eliminación

  • Se recorre la lista productos_db para buscar el producto.
  • Si existe, se elimina con pop(index).

Respuesta

  • Si el producto se elimina correctamente, devolvemos 204 No Content (operación exitosa y sin cuerpo en la respuesta).
  • Si no existe, devolvemos un 404 Not Found.
DELETE 404 Not Found en FastAPI - ejemplo

Ejemplos en Swagger UI (/docs)

1) Eliminar producto existente

DELETE /productos/1

# Respuesta:
Código HTTP: 204 No Content
(No devuelve cuerpo)

2) Eliminar producto inexistente

DELETE /productos/99

# Respuesta:
{
  "detail": "Producto no encontrado"
}

Código HTTP: 404 Not Found

Buenas prácticas con DELETE

  • Usar status code correcto: 204 No Content (eliminación exitosa) y 404 Not Found (si no existe).
  • Idempotencia: múltiples llamadas al mismo DELETE sobre el mismo recurso deben dar siempre el mismo resultado (la primera elimina, las siguientes devuelven 404).
  • No devolver datos eliminados: normalmente DELETE no devuelve el recurso borrado. Aunque a veces se usa 200 OK con el recurso eliminado, la convención más común es 204 No Content.

Ejercicios prácticos

  1. Eliminar el producto con código 2. Verifica con un GET que ya no existe.
  2. Intentar eliminar un producto inexistente (/productos/99). ¿Qué respuesta recibes?
  3. (Opcional) Modificar el endpoint para que devuelva el producto eliminado con 200 OK en lugar de solo un 204.

Conclusión

  • Con DELETE completamos el ciclo CRUD de nuestra API: GET (leer), POST (crear), PUT (actualizar) y DELETE (eliminar).
  • FastAPI y Pydantic simplifican la validación y el manejo de errores.
  • Ya podemos manejar una API de productos completa y funcional.