Contexto em chamadas HTTP e de banco de dados
Propague o contexto por toda a cadeia de chamadas
Contexto em chamadas HTTP e de banco de dados é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
Cliente HTTP com contexto
Passe um contexto para uma requisição HTTP de saída usando req.WithContext(ctx). A requisição será cancelada se o contexto for cancelado antes da chegada da resposta.
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
Prefira http.NewRequestWithContext (Go 1.13 ou posterior) a criar uma requisição e depois chamar WithContext — essa opção é mais limpa e evita uma alocação intermediária.
Cancelando uma requisição HTTP
Crie um contexto cancelável com WithCancel, passe-o para a requisição e chame cancel quando terminar ou quando ocorrer um erro. O cliente interrompe a conexão TCP.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)database/sql com contexto
Todos os métodos de database/sql têm variantes *Context: QueryContext, ExecContext e PrepareContext. Elas cancelam a consulta quando o contexto é concluído.
rows, err := db.QueryContext(ctx, "SELECT id FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()Verificando o contexto antes da consulta
Verifique o contexto antes de iniciar uma consulta longa para interrompê-la imediatamente se a requisição já tiver sido cancelada.
if err := ctx.Err(); err != nil {
return err // context already done
}
rows, err := db.QueryContext(ctx, ...)Contexto e agrupamento de conexões
Quando um contexto é cancelado durante uma consulta, database/sql marca a conexão como inválida se o controlador oferecer suporte a isso, impedindo que uma conexão corrompida retorne ao agrupamento.
gRPC e contexto
gRPC utiliza o contexto para propagar o prazo limite. O cliente define um prazo limite no contexto; o servidor o verifica a cada recebimento no fluxo. Os metadados também são passados pelo contexto.
resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: id})Contexto da requisição recebida
O servidor HTTP associa um contexto a cada requisição recebida por meio de r.Context(). Esse contexto é cancelado quando o cliente se desconecta.
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
result, err := db.QueryContext(ctx, query)
}Contexto em cadeias de camadas intermediárias
A camada intermediária enriquece o contexto da requisição com prazos limite, dados de autenticação ou identificadores de rastreamento e então passa a requisição enriquecida ao próximo manipulador.
Propagando o contexto pelas chamadas de serviço
Em uma arquitetura de microsserviços, o identificador de rastreamento do contexto da requisição recebida deve ser injetado em todos os cabeçalhos HTTP e RPC de saída para que o rastreamento distribuído funcione de ponta a ponta.
Testando com contexto
Nos testes, utilize context.Background() ou context.WithTimeout para evitar o vazamento de gorrotinas entre os casos de teste.
Verificação rápida
Qual função cria uma requisição HTTP com um contexto associado?
Resumo: contexto em HTTP e banco de dados
Pontos principais:
- Utilize http.NewRequestWithContext para chamadas HTTP de saída
- Os métodos *Context de database/sql cancelam as consultas quando o contexto é concluído
- Use r.Context() nas requisições recebidas; ele é cancelado quando o cliente se desconecta
- Propague o contexto (e o identificador de rastreamento) por todas as chamadas aos serviços subsequentes
Perguntas Frequentes
A aula “Contexto em chamadas HTTP e de banco de dados” é grátis?
Sim — o texto completo de “Contexto em chamadas HTTP e de banco de dados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “Contexto em chamadas HTTP e de banco de dados”?
Propague o contexto por toda a cadeia de chamadas Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Contexto em chamadas HTTP e de banco de dados”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que context.Context existe
- WithCancel e WithTimeout
- WithDeadline e WithValue
- Contexto em chamadas HTTP e de banco de dados