Skip to content

Commit eec9846

Browse files
authored
Merge pull request #81 from jeresoftx/docs/5-rest-http-especificacion
docs: especificar REST y semántica HTTP
2 parents 06ae346 + 569868a commit eec9846

1 file changed

Lines changed: 134 additions & 3 deletions

File tree

docs/02-rest-y-http.md

Lines changed: 134 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,138 @@
11
# REST y semántica HTTP
22

3-
**Estado:** planned
3+
**Estado:** draft
44

5-
Este capítulo estudiará recursos, métodos, códigos de estado e idempotencia.
5+
## Introducción
66

7-
No está marcado como `reviewed` ni `published`.
7+
HTTP no es una tubería neutral para mover JSON. Sus métodos, códigos de estado,
8+
cabeceras y reglas de caché forman parte del contrato que un consumidor usa
9+
para decidir si puede reintentar, mostrar un resultado, corregir una entrada o
10+
esperar una transición.
11+
12+
REST aprovecha esa semántica para modelar capacidades alrededor de recursos.
13+
No convierte cualquier URL en REST por usar `GET` y `POST`: exige que los
14+
nombres, métodos y respuestas conserven significado observable para quien
15+
integra.
16+
17+
## Concepto
18+
19+
Un recurso es una representación identificable de algo que importa al dominio:
20+
un pedido, una factura, una colección de productos o una operación en curso.
21+
La URI identifica el recurso o la colección; el método HTTP expresa la clase
22+
de interacción; la respuesta comunica el resultado dentro del protocolo.
23+
24+
El diseño nace de la capacidad del consumidor, no de la estructura de una
25+
tabla. Por ejemplo, `GET /pedidos/42` expresa la consulta de un pedido. El
26+
consumidor puede interpretar `200`, `404` y las cabeceras de caché sin conocer
27+
el servicio, repositorio o consulta que produjo la respuesta.
28+
29+
Las piezas mínimas de esta semántica son:
30+
31+
- **recurso:** entidad o colección con significado de dominio;
32+
- **método:** intención protocolaria, como leer, crear o reemplazar;
33+
- **estado:** resultado observable de la interacción;
34+
- **representación:** datos y metadatos que cruzan la frontera;
35+
- **propiedad de reintento:** qué ocurre si una solicitud llega más de una vez.
36+
37+
## Problema
38+
39+
Cuando HTTP se trata como una envoltura de RPC, aparecen rutas con verbos
40+
internos, métodos que cambian estado al leer y respuestas que siempre devuelven
41+
`200` aunque el consumidor no pueda actuar correctamente. El costo no es solo
42+
estético: clientes, proxies, cachés, herramientas de observabilidad y personas
43+
que integran pierden señales que el protocolo ya ofrece.
44+
45+
El caso más delicado ocurre ante fallas parciales. Si el cliente no sabe si una
46+
solicitud llegó al servidor, necesita entender si puede reintentarse. Sin una
47+
semántica clara, puede duplicar un pago, crear dos pedidos o abandonar una
48+
operación que sí se completó.
49+
50+
La solución tampoco es memorizar una tabla de códigos. Un `404` correcto con
51+
un recurso mal elegido sigue siendo un contrato débil. El problema se resuelve
52+
cuando recurso, método, estado y reintento cuentan la misma historia.
53+
54+
## Alternativas
55+
56+
La primera alternativa es ignorar HTTP y exponer acciones como
57+
`POST /crearPedido` o `POST /cancelarPedido`. Puede ser directa para el equipo
58+
que conoce la implementación, pero obliga al consumidor a aprender un
59+
vocabulario paralelo y deja ambiguas propiedades como seguridad, caché e
60+
idempotencia.
61+
62+
La segunda es aplicar reglas REST de forma mecánica. Por ejemplo, usar `PUT`
63+
siempre que exista un identificador o devolver `204` para cualquier éxito. Esto
64+
parece uniforme, pero puede ocultar la diferencia entre crear, reemplazar,
65+
aceptar trabajo asíncrono o devolver una representación útil.
66+
67+
La tercera es elegir el estilo por la operación real: nombrar el recurso,
68+
seleccionar el método por su semántica y devolver un estado que permita al
69+
consumidor decidir qué hacer. Este curso adopta esa alternativa porque preserva
70+
la capacidad de evolucionar y aprovechar el protocolo sin fingir que HTTP
71+
resuelve todas las necesidades de dominio.
72+
73+
## Semántica de métodos
74+
75+
`GET` recupera una representación y debe ser seguro: observarlo no debe causar
76+
un cambio de negocio. `POST` solicita procesamiento bajo la colección o un
77+
recurso; puede crear una entidad, iniciar una operación o delegar una acción
78+
que no encaja como reemplazo. `PUT` coloca una representación completa en una
79+
URI conocida y debe ser idempotente. `PATCH` describe una modificación parcial
80+
y necesita definir con precisión qué ocurre al repetirla. `DELETE` solicita la
81+
eliminación o retirada de una representación y también debe definir la
82+
semántica de repeticiones.
83+
84+
Idempotencia no significa que la primera y segunda respuesta sean idénticas.
85+
Significa que repetir la misma solicitud con la misma intención deja el
86+
recurso en un estado equivalente. Esta propiedad permite que un consumidor
87+
reintente después de una falla de red sin convertir la incertidumbre en un
88+
efecto duplicado.
89+
90+
## Semántica de estados
91+
92+
Los códigos de estado no reemplazan un cuerpo de error útil, pero dan la
93+
primera clasificación protocolaria. `200` representa una respuesta exitosa
94+
con contenido; `201` comunica creación e idealmente identifica el recurso;
95+
`202` acepta trabajo que todavía no terminó; `204` confirma éxito sin cuerpo.
96+
97+
En el lado de los errores, `400` señala una solicitud que no puede
98+
interpretarse, `401` una falta de autenticación, `403` una autorización
99+
insuficiente, `404` un recurso no disponible para ese contrato, `409` un
100+
conflicto con el estado actual y `422` una solicitud entendida pero inválida
101+
según reglas de dominio. La elección exige explicar qué puede hacer el
102+
consumidor después, no solo clasificar la falla.
103+
104+
## Invariantes
105+
106+
- Una URI nombra un recurso o una colección, no una función interna.
107+
- Un método conserva su semántica de seguridad e idempotencia declarada.
108+
- Un estado HTTP permite la primera decisión del consumidor sobre el resultado.
109+
- Un error de dominio incluye información accionable además del código HTTP.
110+
- Un reintento no debe duplicar un efecto cuando la operación se declara
111+
idempotente.
112+
- Una respuesta asíncrona declara cómo observar el resultado posterior.
113+
- Caché, concurrencia y permisos se vuelven parte del contrato cuando afectan
114+
el comportamiento observable.
115+
116+
## Preguntas de diseño
117+
118+
1. ¿Qué recurso necesita observar o modificar el consumidor?
119+
2. ¿El método elegido expresa lectura, creación, reemplazo o modificación
120+
parcial de manera honesta?
121+
3. ¿Puede el consumidor reintentar después de una falla de red? ¿Por qué?
122+
4. ¿Qué estado y qué cuerpo le permiten distinguir una corrección de una
123+
espera o un abandono?
124+
5. ¿Qué parte de la representación es estable y qué parte puede evolucionar?
125+
126+
## Siguiente paso
127+
128+
El modelo Rust del capítulo representará una solicitud HTTP como intención,
129+
propiedad de reintento y resultado observable. No implementará un servidor:
130+
hará visible cuándo una combinación de método y estado contradice el contrato
131+
que pretende comunicar.
132+
133+
## Decisiones registradas
134+
135+
- REST se enseña como semántica de recursos sobre HTTP, no como una convención
136+
de rutas con JSON.
137+
- La idempotencia se explica desde el efecto observable de reintentos.
138+
- El capítulo permanece en `draft`; no está revisado ni publicado.

0 commit comments

Comments
 (0)