Переменная http.DefaultTransport
Переменная http.DefaultTransport содержит объект типа http.Transport,
который используется по умолчанию для всех HTTP-запросов, выполняемых функциями
пакета net/http (такими как http.Get, http.Post и другими).
Эта переменная позволяет настраивать глобальные параметры сетевого взаимодействия,
включая таймауты, прокси, максимальное количество соединений и другие важные параметры.
Синтаксис
var 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 секунд:
package 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)
}
Результат выполнения кода:
"Status code: 200"
Настройка максимального количества соединений
Изменим параметры транспорта для ограничения максимального количества простаивающих соединений:
package 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)
}
Результат выполнения кода:
"Status code: 200"
Настройка прокси-сервера
Изменим транспорт для использования прокси-сервера:
package 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)
}
Результат выполнения кода:
"Status code: 200"
Смотрите также
-
функцию
http.Client,
которая представляет HTTP-клиент с настраиваемым транспортом -
функцию
http.Transport,
которая реализует интерфейс RoundTripper для HTTP-запросов -
функцию
http.RoundTripper,
которая определяет интерфейс для выполнения HTTP-запросов -
функцию
http.DefaultClient,
которая используется по умолчанию для HTTP-запросов