Skip to content

viernes

Profundización en el Protocolo HTTP

1. Fundamentos de HTTP

Historia y evolución

VersiónAñoCaracterística PrincipalProtocolo
HTTP/0.91991Solo soporta respuestas en HTML sin encabezadosTCP
HTTP/1.01996Introducción de encabezados, conexiones por solicitudTCP
HTTP/1.11997Conexiones persistentes, chunked transfer encodingTCP
HTTP/22015Multiplexación de streams, compresión de encabezados (HPACK)TCP
HTTP/32020Reducción de latencia con QUIC, evita el problema de retransmisión de paquetes de TCPUDP

Estructura básica

Petición (Request)

GET /api/cursos HTTP/1.1
Host: www.uninorte.edu.co
Accept: application/json
Authorization: Bearer token123
User-Agent: Mozilla/5.0
Cache-Control: no-cache

Respuesta (Response)

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 80
Date: 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:
grafico de un diagrama CRUD

MétodoDescripciónIdempotenteSeguroCódigos comunes
GETObtener recursos (Read)200, 304, 404
POSTCrear recurso (Create)201, 400, 409
PUTReemplazar recurso (Update)200, 204, 404
PATCHActualización parcial (Update)200, 204, 406
DELETEEliminar 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 Content

3. 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ón
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
# Tipo de contenido
Content-Type: application/json; charset=utf-8
# Control de caché
Cache-Control: max-age=3600, public

Có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

views.py
from django.http import JsonResponse
from 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:

urls.py
from django.urls import path
from .views import CursoAPI, CursoDetalleAPI
urlpatterns = [
path('cursos/', CursoAPI.as_view()),
path('cursos/<int:curso_id>/', CursoDetalleAPI.as_view()),
]

Pruebas con Postman:

  1. GET Todos los cursos:
    GET http://localhost:8000/cursos/
    Headers: Accept: application/json

  2. POST Nuevo curso:

    POST http://localhost:8000/cursos/
    Content-Type: application/json
    {"nombre": "DevOps"}
  3. DELETE Curso:

`DELETE http://localhost:8000/cursos/3/`

Enlace a la clase grabada y a la transcripción.

Onedrive