Использование прокси в Go позволяет маршрутизировать исходящие HTTP/HTTPS запросы через промежуточный сервер, обеспечивая анонимность, обход географических ограничений или доступ к внутренним сетям. В Go стандартная библиотека net/http предоставляет гибкие механизмы для интеграции прокси в клиентские HTTP-запросы. Основным компонентом для настройки прокси является http.Transport, который управляет созданием и управлением исходящими соединениями.
Основы работы с прокси в Go
HTTP-клиент в Go представлен структурой http.Client. Для детальной настройки поведения клиента, включая использование прокси, применяется структура http.Transport. http.Transport инкапсулирует логику для выполнения HTTP-запросов, управления пулом соединений, обработкой таймаутов и, что важно, настройкой прокси.
По умолчанию http.DefaultClient использует http.DefaultTransport, который проверяет переменные окружения для настроек прокси. Для более тонкой настройки или использования специфичных прокси необходимо создать собственный http.Client с кастомным http.Transport.
package main
import (
"fmt"
"io"
"net/http"
"time"
)
func main() {
// Создание HTTP клиента по умолчанию (использует DefaultTransport, который проверяет переменные окружения)
client := &http.Client{
Timeout: 10 * time.Second,
}
resp, err := client.Get("http://example.com")
if err != nil {
fmt.Printf("Ошибка при запросе: %v\n", err)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Printf("Статус: %s\n", resp.Status)
fmt.Printf("Тело (частично): %s...\n", body[:100])
}
Настройка прокси через переменные окружения
Go HTTP-клиент автоматически использует настройки прокси, заданные в переменных окружения HTTP_PROXY, HTTPS_PROXY и NO_PROXY. http.DefaultTransport и, соответственно, http.DefaultClient по умолчанию проверяют эти переменные.
HTTP_PROXY/http_proxy: URL прокси для HTTP-запросов.HTTPS_PROXY/https_proxy: URL прокси для HTTPS-запросов.NO_PROXY/no_proxy: Список хостов, для которых прокси не должен использоваться (разделяются запятыми).
Для явного использования или проверки этих настроек можно применить функцию http.ProxyFromEnvironment.
```go
package main
import (
"fmt"
"io"
"net/http"
"os"
"time"
)
func main() {
// Установка переменных окружения для примера (в реальном приложении задаются вне программы)
os.Setenv("