Тип http.Transport

Тип http.Transport реализует интерфейс http.RoundTripper и управляет выполнением HTTP-запросов. Он настраивает пул соединений, таймауты, прокси-серверы, параметры TLS и другие низкоуровневые детали. По умолчанию http.Transport используется в http.DefaultClient, но его можно заменить на кастомизированный экземпляр для более гибкой настройки.

Создание и настройка

gopackage main

import (
  "net/http"
  "time"
)

func main() {
  tr := &http.Transport{
    MaxIdleConns:    100,
    MaxIdleConnsPerHost: 10,
    IdleConnTimeout:   90 * time.Second,
    DisableCompression:  false,
  }

  client := &http.Client{
    Transport: tr,
    Timeout:   10 * time.Second,
  }
}

В примере создается кастомный транспорт с настройками пула соединений и таймаутами, который затем используется в HTTP-клиенте.

Настройка таймаутов

http.Transport позволяет задавать различные таймауты для управления временем ожидания соединений, чтения и записи данных:

gopackage main

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

func main() {
  tr := &http.Transport{
    DialContext: (&net.Dialer{
      Timeout:   30 * time.Second,
      KeepAlive: 30 * time.Second,
    }).DialContext,
    TLSHandshakeTimeout:   10 * time.Second,
    ResponseHeaderTimeout: 10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
  }

  client := &http.Client{
    Transport: tr,
  }
}

Здесь настраиваются таймаут установки соединения, рукопожатия TLS, ожидания заголовков ответа и времени для ожидания ответа на заголовок Expect: 100-continue.

Настройка прокси

Транспорт поддерживает работу через прокси-серверы с помощью поля Proxy, в которое передается функция определения прокси для каждого запроса:

gopackage main

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

func main() {
  proxyURL, _ := url.Parse("http://proxy.example.com:8080")

  tr := &http.Transport{
    Proxy: http.ProxyURL(proxyURL),
  }

  client := &http.Client{
    Transport: tr,
  }
}

В этом примере все запросы, выполненные через клиент, будут направляться через прокси-сервер с адресом http://proxy.example.com:8080.

Настройка TLS

Для работы с HTTPS можно настроить параметры TLS, например, отключить проверку сертификатов (не рекомендуется для продакшена) или указать клиентские сертификаты:

gopackage main

import (
  "crypto/tls"
  "net/http"
)

func main() {
  tr := &http.Transport{
    TLSClientConfig: &tls.Config{
      InsecureSkipVerify: true,
    },
  }

  client := &http.Client{
    Transport: tr,
  }
}

Пример использования с запросом

Давайте выполним GET-запрос с использованием кастомного транспорта и выведем статус ответа:

gopackage main

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

func main() {
  tr := &http.Transport{
    MaxIdleConns:    10,
    IdleConnTimeout:   30 * time.Second,
    DisableCompression:  false,
  }

  client := &http.Client{
    Transport: tr,
    Timeout:   5 * time.Second,
  }

  resp, err := client.Get("https://example.com")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer resp.Body.Close()

  fmt.Println("Status:", resp.Status)
}

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

go"Status: 200 OK"

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

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