Tabla de Contenidos

03 - El protocolo HTTP

La web funciona sobre HTTP (*HyperText Transfer Protocol*), un protocolo de aplicación cliente-servidor sobre TCP: el cliente envía una petición con formato definido y el servidor responde con una respuesta con otro formato igualmente definido. Todo servidor web de este módulo se dedica, en el fondo, a leer peticiones y escribir respuestas con ese formato.

1. Petición

GET /books/42 HTTP/1.1
Host: localhost:8080
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

Un POST que crea un libro incluye cuerpo:

POST /books HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Content-Length: 47

{"title":"Código limpio","author":"R. Martin"}

2. Métodos

El método expresa la intención del cliente sobre el recurso que identifica la ruta:

Método Intención
GET Leer el recurso; no modifica nada
POST Crear un recurso (o ejecutar una operación)
PUT Reemplazar un recurso existente
DELETE Eliminar un recurso

3. Cabeceras

Cabecera Qué indica
Host Servidor y puerto solicitados (obligatoria en HTTP/1.1)
Accept Formatos que el cliente entiende
Content-Type Formato del cuerpo (en petición y respuesta)
Content-Length Tamaño del cuerpo en bytes
Authorization Credenciales: con tokens, Bearer <token>

4. Respuesta

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 33

{"id":42,"title":"Código limpio"}

El código de estado resume el resultado; su primera cifra indica la familia:

Código Significado
200 OK: petición atendida
201 Recurso creado
204 Éxito sin cuerpo
301 Redirección permanente
400 Petición mal formada
401 No autenticado: falta el token o no es válido
403 Autenticado, pero sin permiso
404 No encontrado
405 Método no admitido en esa ruta
500 Error interno del servidor
Familias: 2xx éxito, 3xx redirección, 4xx error del cliente, 5xx error del servidor. La elección del código forma parte del contrato de la API.

5. Observar el protocolo con curl

curl envía la petición y muestra la respuesta; con -v (*verbose*) muestra ambas tal cual cruzan la red:

$ curl -v http://localhost:8080/books/42
> GET /books/42 HTTP/1.1
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 33
<
{"id":42,"title":"Código limpio"}

6. Intercambio

ClienteServidor HTTPClienteServidor HTTPClienteServidor HTTPGET /books/42200 OK (JSON)POST /books (JSON)201 Created

HTTP no tiene estado: el servidor no recuerda al cliente entre peticiones. La autenticación con tokens se apoya en esto: cada petición trae su token en la cabecera Authorization. No se usan sesiones ni cookies.