viernes
Profundización en el Protocolo HTTP
1. Fundamentos de HTTP
Historia y evolución
| Versión | Año | Característica Principal | Protocolo |
|---|---|---|---|
| HTTP/0.9 | 1991 | Solo soporta respuestas en HTML sin encabezados | TCP |
| HTTP/1.0 | 1996 | Introducción de encabezados, conexiones por solicitud | TCP |
| HTTP/1.1 | 1997 | Conexiones persistentes, chunked transfer encoding | TCP |
| HTTP/2 | 2015 | Multiplexación de streams, compresión de encabezados (HPACK) | TCP |
| HTTP/3 | 2020 | Reducción de latencia con QUIC, evita el problema de retransmisión de paquetes de TCP | UDP |
Estructura básica
Petición (Request)
GET /api/cursos HTTP/1.1Host: www.uninorte.edu.coAccept: application/jsonAuthorization: Bearer token123User-Agent: Mozilla/5.0Cache-Control: no-cacheRespuesta (Response)
HTTP/1.1 200 OKContent-Type: application/jsonContent-Length: 80Date: Fri, 24 May 2024 10:00:00 GMT
{ "data": [ {"id": 1, "nombre": "Backend"}, {"id": 2, "nombre": "Frontend"} ]}2. Métodos HTTP
Diagrama de operaciones CRUD:

| Método | Descripción | Idempotente | Seguro | Códigos comunes |
|---|---|---|---|---|
GET | Obtener recursos (Read) | ✅ | ✅ | 200, 304, 404 |
POST | Crear recurso (Create) | ❌ | ❌ | 201, 400, 409 |
PUT | Reemplazar recurso (Update) | ✅ | ❌ | 200, 204, 404 |
PATCH | Actualización parcial (Update) | ❌ | ❌ | 200, 204, 406 |
DELETE | Eliminar recurso (Delete) | ✅ | ❌ | 204, 404, 410 |
Ejemplo de flujo:
sequenceDiagram Cliente->>Servidor: GET /cursos Servidor->>Cliente: 200 OK (Lista cursos) Cliente->>Servidor: POST /cursos (JSON body) Servidor->>Cliente: 201 Created (ID: 5) Cliente->>Servidor: PUT /cursos/5 (JSON body) Servidor->>Cliente: 200 OK (Recurso actualizado) Cliente->>Servidor: DELETE /cursos/5 Servidor->>Cliente: 204 No Content3. Headers y Códigos de Estado
Los headers en HTTP permiten enviar información adicional en las peticiones y respuestas. Se usan para definir el tipo de contenido, autenticación, control de caché, entre otros.
Headers esenciales:
# AutenticaciónAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
# Tipo de contenidoContent-Type: application/json; charset=utf-8
# Control de cachéCache-Control: max-age=3600, publicCódigos de estado:
flowchart TD A[Respuesta HTTP] --> B{2xx Éxito} A --> C{3xx Redirección} A --> D{4xx Error Cliente} A --> E{5xx Error Servidor}
B --> 200(🟢 200 OK) B --> 201(🟢 201 Created) D --> 400(🔴 400 Bad Request) D --> 401(🔴 401 Unauthorized) E --> 500(🔴 500 Internal Server Error)4. Actividad Práctica: Endpoints HTTP con Django
from django.http import JsonResponsefrom django.views import View
class CursoAPI(View): """API para gestión de cursos"""
def get(self, request): """Obtener todos los cursos""" cursos = [ {"id": 1, "nombre": "Backend"}, {"id": 2, "nombre": "Frontend"} ] return JsonResponse({"data": cursos}, status=200)
def post(self, request): """Crear nuevo curso""" # Lógica para procesar POST return JsonResponse({"id": 3, "nombre": request.POST.get('nombre')}, status=201)
class CursoDetalleAPI(View): """API para operaciones específicas en cursos"""
def get(self, request, curso_id): """Obtener un curso específico""" return JsonResponse({"id": curso_id, "nombre": "Backend"}, status=200)
def delete(self, request, curso_id): """Eliminar un curso""" return JsonResponse({"message": f"Curso {curso_id} eliminado"}, status=204)Configuración de URLs:
from django.urls import pathfrom .views import CursoAPI, CursoDetalleAPI
urlpatterns = [ path('cursos/', CursoAPI.as_view()), path('cursos/<int:curso_id>/', CursoDetalleAPI.as_view()),]Pruebas con Postman:
-
GET Todos los cursos:
GET http://localhost:8000/cursos/
Headers:Accept: application/json -
POST Nuevo curso:
POST http://localhost:8000/cursos/Content-Type: application/json{"nombre": "DevOps"} -
DELETE Curso:
`DELETE http://localhost:8000/cursos/3/`