Guía práctica para crear una API REST predecible, segura y evolutiva: recursos, semántica HTTP, errores, paginación, versiones, documentación y Laravel.
Una buena API REST resulta predecible. Un desarrollador puede anticipar una ruta, comprender la respuesta sin leer el servidor y resolver errores sin adivinar. Esa calidad nace de decisiones consistentes y de un contrato claro.
Una API sólida modela recursos del negocio, respeta la semántica HTTP, ofrece JSON consistente, devuelve errores accionables, protege los datos y evoluciona sin romper clientes existentes.
Representa conceptos estables como orders, customers e invoices. Usa plurales y rutas como /orders/42/items en lugar de /getOrderItems. Mantén poca profundidad para simplificar permisos y mantenimiento.
GET /api/v1/orders
POST /api/v1/orders
GET /api/v1/orders/42
PATCH /api/v1/orders/42
DELETE /api/v1/orders/42
GET lee sin modificar estado; POST crea o inicia una operación no idempotente; PUT reemplaza; PATCH actualiza parcialmente; DELETE elimina. Seguir RFC 9110 permite que clientes, cachés y herramientas funcionen correctamente.
Usa 200 para éxito, 201 con Location al crear y 204 sin cuerpo. Diferencia 400, 401, 403, 404, 409, 422 y 429. Reserva 5xx para fallos del servidor, no para errores del cliente.
Define una convención para nombres, fechas, dinero, valores nulos y envoltorios. Usa ISO 8601 con zona horaria. No expongas columnas de base de datos accidentalmente: la respuesta es un contrato público.
{
"data": {
"id": 42,
"status": "paid",
"total": 129.90,
"currency": "USD"
}
}
Incluye un tipo o código estable, título, estado HTTP, detalle seguro, errores por campo y un identificador de solicitud. RFC 9457 Problem Details proporciona un formato estándar.
{
"type": "https://api.example.com/problems/validation",
"title": "Validation failed",
"status": 422,
"detail": "One or more fields are invalid.",
"errors": {"email": ["The email field is required."]}
}
Utiliza parámetros explícitos: ?status=paid&sort=-created_at&page=2&per_page=25. Documenta filtros y ordenaciones permitidos y fija un máximo por página. La paginación por cursor es mejor para conjuntos grandes o cambiantes.
Añadir campos opcionales suele ser compatible; renombrar, cambiar tipos o eliminar comportamiento rompe clientes. Adopta una estrategia como /api/v1, un periodo de deprecación y notas de migración.
Exige HTTPS, autentica y autoriza cada acción sobre el recurso. Valida con listas permitidas, limita el tamaño y la frecuencia de solicitudes y nunca expongas secretos ni stack traces. Registra eventos de seguridad sin credenciales ni datos personales.
Usa Cache-Control, ETag y peticiones condicionales en lecturas seguras. Acepta If-Match o una versión para evitar sobrescrituras. Las claves de idempotencia protegen reintentos de pagos y creaciones.
Mantén un contrato OpenAPI con ejemplos de éxito, validación, autenticación y rate limiting. Úsalo para documentación, SDK, validación y pruebas de contrato. Añade IDs de correlación, logs estructurados, métricas y trazas.
Laravel ofrece rutas CRUD convencionales con Route::apiResource, autenticación con Sanctum y límites mediante middleware.
use App\Http\Controllers\Api\OrderController;
use Illuminate\Support\Facades\Route;
Route::prefix('v1')
->middleware(['auth:sanctum', 'throttle:api'])
->group(function () {
Route::apiResource('orders', OrderController::class);
});Usa Form Requests para validación y autorización, Policies para permisos y API Resources para controlar JSON. Mantén el controlador centrado en HTTP y coloca la lógica compleja en servicios o acciones.
public function show(Order $order): OrderResource
{
return new OrderResource($order);
}
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'status' => $this->status,
'total' => $this->total,
'currency' => $this->currency,
];
}
Normalmente no. Usa sustantivos y métodos HTTP; un comando de negocio puede modelarse como recurso, por ejemplo POST /orders/42/cancellation.
La consistencia: una convención razonable aplicada siempre supera a endpoints ingeniosos que se comportan de forma distinta.
Todavía no hay comentarios aprobados. Las respuestas nuevas pueden esperar moderación.