Conceptos básicos del diseño de API
8 ejemplos para empezar con el Diseño de API para backends de Node.js: 6 básicos y 2 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con el Diseño de API para backends de Node.js: 6 básicos y 2 intermedios.
Express 5 o Fastify 5 con análisis de cuerpo JSON y Zod instalados.
npm install express@5 zodGET /v1/orders
POST /v1/orders
GET /v1/orders/:id
PATCH /v1/orders/:id
DELETE /v1/orders/:id/v1/orders/:id/items/createOrder en las API REST públicasRelacionado: Versionado y Deprecación - prefijo
/v1
{ "data": { "id": "ord_1", "status": "pending" } }{ "error": { "code": "ORDER_NOT_FOUND", "message": "Order ord_99 not found" } }dataerror con un code estable para los clientesdata como un array más metadatos de paginaciónRelacionado: Estándares de respuesta de error - Detalles del problema
| Acción | Código |
|---|---|
| Recurso creado | 201 |
| Éxito con cuerpo | 200 |
| Éxito sin cuerpo | 204 |
| Validación fallida | 400 |
| Autenticación faltante | 401 |
| Prohibido | 403 |
| No encontrado | 404 |
| Conflicto | 409 |
200 con { error: ... } en el cuerpo422 es aceptable para la validación semántica si el equipo lo estandarizaimport { z } from "zod";
import express from "express";
const createOrderBody = z.object({
customerId: z.string().uuid(),
sku: z.string().min(1),
qty: z.number().int().positive(),
});
const app = express();
app.use(express.json());
app.post("/v1/orders", (req, res) => {
const parsed = createOrderBody.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({
error: { code: "VALIDATION_ERROR", details: parsed.error.flatten() },
});
}
res.status(201).json({ data: { id: crypto.randomUUID(), ...parsed.data } });
});PATCH /v1/orders/ord_1
{ "status": "shipped" }PATCH actualización parcial; documenta los campos permitidosPUT reemplazo completo cuando lo soportes - raro en las API B2BIdempotency-Key en los pagos POST (ver intermedio)GET /v1/orders?limit=20&cursor=eyJpZCI6Im9yZF8xMjMifQRelacionado: Paginación y Filtrado - cursor vs offset
app.use((req, res, next) => {
if (req.method === "POST" && !req.is("application/json")) {
return res.status(415).json({ error: { code: "UNSUPPORTED_MEDIA_TYPE" } });
}
next();
});application/jsonContent-Type y la firma por separadoDocumenta las rutas a medida que las implementas.
paths:
/v1/orders:
post:
summary: Create order
responses:
"201":
description: CreatedRelacionado: OpenAPI y Swagger - spec-first vs code-first
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 19 jul 2026