Context en llamadas HTTP y de base de datos
Propagación del context por toda la cadena de llamadas
Context en llamadas HTTP y de base de datos es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
Cliente HTTP con contexto
Pase un contexto a una solicitud HTTP saliente mediante req.WithContext(ctx). La solicitud se cancela si el contexto se cancela antes de que llegue la respuesta.
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
if errors.Is(err, context.DeadlineExceeded) {
// timeout
}
}http.NewRequestWithContext
Prefiera http.NewRequestWithContext (Go 1.13+) en lugar de crear una solicitud y llamar después a WithContext: es más claro y evita una asignación intermedia.
Cancelación de una solicitud HTTP
Cree un contexto cancelable con WithCancel, páselo a la solicitud y llame a cancel cuando termine o se produzca un error. El cliente interrumpe la conexión TCP.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)database/sql con contexto
Todos los métodos de database/sql tienen variantes *Context: QueryContext, ExecContext y PrepareContext. Estas cancelan la consulta cuando el contexto termina.
rows, err := db.QueryContext(ctx, "SELECT id FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()Comprobación del contexto antes de la consulta
Compruebe el contexto antes de iniciar una consulta larga para interrumpirla de inmediato si la solicitud ya se canceló.
if err := ctx.Err(); err != nil {
return err // context already done
}
rows, err := db.QueryContext(ctx, ...)Contexto y agrupación de conexiones
Cuando se cancela un contexto durante una consulta, database/sql marca la conexión como defectuosa si el controlador lo admite, lo que evita que una conexión dañada vuelva a la agrupación.
gRPC y el contexto
gRPC usa el contexto para propagar el plazo límite. El cliente establece un plazo límite en el contexto; el servidor lo comprueba en cada recepción del flujo. Los metadatos también se pasan mediante el contexto.
resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: id})Contexto de la solicitud entrante
El servidor HTTP asocia un contexto a cada solicitud entrante mediante r.Context(). Este contexto se cancela cuando el cliente se desconecta.
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
result, err := db.QueryContext(ctx, query)
}Contexto en cadenas de middleware
El middleware enriquece el contexto de la solicitud con plazos límite, datos de autenticación o ID de traza y, después, pasa la solicitud enriquecida al siguiente controlador.
Propagación del contexto mediante llamadas a servicios
En una arquitectura de microservicios, el ID de traza del contexto de la solicitud entrante debe inyectarse en todas las cabeceras HTTP y RPC salientes para que el seguimiento distribuido funcione de extremo a extremo.
Pruebas con contexto
En las pruebas, use context.Background() o context.WithTimeout para evitar que se filtren goroutines entre casos de prueba.
Comprobación rápida
¿Qué función crea una solicitud HTTP con un contexto asociado?
Resumen: contexto en HTTP y DB
Puntos clave:
- Use http.NewRequestWithContext para las llamadas HTTP salientes
- Los métodos *Context de database/sql cancelan las consultas cuando termina el contexto
- Use r.Context() en las solicitudes entrantes; se cancela cuando el cliente se desconecta
- Propague el contexto (y el ID de traza) en todas las llamadas posteriores
Preguntas frecuentes
¿La lección «Context en llamadas HTTP y de base de datos» es gratis?
Sí — el texto completo de «Context en llamadas HTTP y de base de datos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Context en llamadas HTTP y de base de datos»?
Propagación del context por toda la cadena de llamadas Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Context en llamadas HTTP y de base de datos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué existe context.Context
- WithCancel y WithTimeout
- WithDeadline y WithValue
- Context en llamadas HTTP y de base de datos