Un cliente HTTP que se rinde en Go
Un cliente compartido con timeout, y una petición que carga un contexto.
var client = &http.Client{Timeout: 10 * time.Second}
func fetch(ctx context.Context, url string) (int, string, error) {
request, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return 0, "", fmt.Errorf("build request: %w", err)
}
request.Header.Set("Accept", "application/json")
response, err := client.Do(request)
if err != nil {
return 0, "", fmt.Errorf("get %s: %w", url, err)
}
defer response.Body.Close()
body, err := io.ReadAll(io.LimitReader(response.Body, 1<<20))
if err != nil {
return response.StatusCode, "", fmt.Errorf("read body: %w", err)
}
return response.StatusCode, string(body), nil
}
Cómo funciona
- Nunca uses http.DefaultClient en producción: no tiene timeout.
NewRequestWithContextes lo que hace funcionar la cancelación.- Cierra el cuerpo, siempre, y drénalo si reutilizas la conexión.
Palabras clave y builtins usados aquí
defererrorfuncifintreturnstringvar
El intento, en números
- Líneas
- 21
- Caracteres a escribir
- 638
- Tokens
- 175
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 95 segundos.
Paso 5 de 5 en HTTP; paso 20 de 26 en Biblioteca estándar y estructura del proyecto.