0Pricing
Go Academy · Aula

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

  1. Por que context.Context existe
  2. WithCancel e WithTimeout
  3. WithDeadline e WithValue
  4. Contexto em chamadas HTTP e de banco de dados
← Voltar para Go Academy