🟡 Средний · 2 очк. Стандартная библиотека
Как задать таймаут для HTTP-клиента?
A http.Get с параметром timeout
B http.Client{Timeout: ...}
C context.WithTimeout
D Оба B и C подходят
Объяснение вопроса

Оба подхода работают, но на разных уровнях. http.Client.Timeout задает глобальный таймаут клиента, а context.WithTimeout - таймаут для конкретного запроса.

Способ 1: http.Client.Timeout

client := &http.Client{
    Timeout: 10 * time.Second, // таймаут на весь запрос
}
resp, err := client.Get("https://api.example.com/data")
// покрывает: DNS, подключение, TLS, отправку, чтение ответа

Способ 2: context.WithTimeout

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := client.Do(req)

Когда что использовать

  • Client.Timeout - дефолтный таймаут для всех запросов этого клиента
  • context.WithTimeout - когда разные запросы требуют разных таймаутов
  • Комбинация обоих - клиент задает максимум, контекст может сократить

Тонкая настройка через Transport

client := &http.Client{
    Timeout: 30 * time.Second,
    Transport: &http.Transport{
        DialContext:         (&net.Dialer{Timeout: 5 * time.Second}).DialContext,
        TLSHandshakeTimeout: 5 * time.Second,
        ResponseHeaderTimeout: 10 * time.Second,
    },
}

http.Get() использует http.DefaultClient без таймаута - в production это опасно, запрос может висеть бесконечно.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.