Тип http.Transport
Тип http.Transport реализует интерфейс http.RoundTripper и управляет выполнением
HTTP-запросов. Он настраивает пул соединений, таймауты, прокси-серверы,
параметры TLS и другие низкоуровневые детали. По умолчанию http.Transport
используется в http.DefaultClient, но его можно заменить на кастомизированный
экземпляр для более гибкой настройки.
Создание и настройка
package 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 позволяет задавать различные таймауты для управления
временем ожидания соединений, чтения и записи данных:
package 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, в которое передается функция определения прокси для
каждого запроса:
package 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, например, отключить проверку сертификатов (не рекомендуется для продакшена) или указать клиентские сертификаты:
package main
import (
"crypto/tls"
"net/http"
)
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}
client := &http.Client{
Transport: tr,
}
}
Пример использования с запросом
Давайте выполним GET-запрос с использованием кастомного транспорта и выведем статус ответа:
package 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)
}
Результат выполнения кода:
"Status: 200 OK"
Смотрите также
-
тип
http.Client,
который использует транспорт для выполнения запросов -
интерфейс
http.RoundTripper,
который реализует транспорт -
переменную
http.DefaultTransport,
которая используется по умолчанию -
тип
http.Server,
который настраивает серверную сторону HTTP