|
1 | 1 | # REST y semántica HTTP |
2 | 2 |
|
3 | | -**Estado:** planned |
| 3 | +**Estado:** draft |
4 | 4 |
|
5 | | -Este capítulo estudiará recursos, métodos, códigos de estado e idempotencia. |
| 5 | +## Introducción |
6 | 6 |
|
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