Переменная http.DefaultTransport

Переменная http.DefaultTransport содержит объект типа http.Transport, который используется по умолчанию для всех HTTP-запросов, выполняемых функциями пакета net/http (такими как http.Get, http.Post и другими). Эта переменная позволяет настраивать глобальные параметры сетевого взаимодействия, включая таймауты, прокси, максимальное количество соединений и другие важные параметры.

Синтаксис

govar DefaultTransport RoundTripper = &Transport{
  Proxy: ProxyFromEnvironment,
  DialContext: (&net.Dialer{
    Timeout:   30 * time.Second,
    KeepAlive: 30 * time.Second,
  }).DialContext,
  ForceAttemptHTTP2:   true,
  MaxIdleConns:      100,
  IdleConnTimeout:     90 * time.Second,
  TLSHandshakeTimeout:   10 * time.Second,
  ExpectContinueTimeout: 1 * time.Second,
}

Переменная экспортируется как интерфейс http.RoundTripper, но фактически содержит указатель на структуру http.Transport с предустановленными значениями.

Базовый пример с настройкой таймаута

В этом примере мы изменяем глобальные настройки транспорта, устанавливая таймаут соединения в 5 секунд:

gopackage main

import (
  "fmt"
  "net"
  "net/http"
  "time"
)

func main() {
  transport := http.DefaultTransport.(*http.Transport).Clone()
  transport.DialContext = (&net.Dialer{
    Timeout:   5 * time.Second,
    KeepAlive: 30 * time.Second,
  }).DialContext
  http.DefaultTransport = transport

  client := &http.Client{
    Transport: http.DefaultTransport,
  }
  resp, err := client.Get("https://example.com")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer resp.Body.Close()
  fmt.Println("Status code:", resp.StatusCode)
}

Результат выполнения кода:

go"Status code: 200"

Настройка максимального количества соединений

Изменим параметры транспорта для ограничения максимального количества простаивающих соединений:

gopackage main

import (
  "fmt"
  "net/http"
)

func main() {
  transport := http.DefaultTransport.(*http.Transport).Clone()
  transport.MaxIdleConns = 50
  transport.MaxIdleConnsPerHost = 10
  http.DefaultTransport = transport

  client := &http.Client{
    Transport: http.DefaultTransport,
  }
  resp, err := client.Get("https://example.com")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer resp.Body.Close()
  fmt.Println("Status code:", resp.StatusCode)
}

Результат выполнения кода:

go"Status code: 200"

Настройка прокси-сервера

Изменим транспорт для использования прокси-сервера:

gopackage main

import (
  "fmt"
  "net/http"
  "net/url"
)

func main() {
  proxyURL, err := url.Parse("http://proxy.example.com:8080")
  if err != nil {
    fmt.Println("Parse error:", err)
    return
  }

  transport := http.DefaultTransport.(*http.Transport).Clone()
  transport.Proxy = http.ProxyURL(proxyURL)
  http.DefaultTransport = transport

  client := &http.Client{
    Transport: http.DefaultTransport,
  }
  resp, err := client.Get("https://example.com")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer resp.Body.Close()
  fmt.Println("Status code:", resp.StatusCode)
}

Результат выполнения кода:

go"Status code: 200"

Смотрите также

  • функцию http.Client,
    которая представляет HTTP-клиент с настраиваемым транспортом
  • функцию http.Transport,
    которая реализует интерфейс RoundTripper для HTTP-запросов
  • функцию http.RoundTripper,
    которая определяет интерфейс для выполнения HTTP-запросов
  • функцию http.DefaultClient,
    которая используется по умолчанию для HTTP-запросов