Настройка прокси для HTTP-клиента
Я пытаюсь настроить HTTP-клиент так, чтобы он использовал прокси-сервер, однако я не могу понять, как это сделать. В документации имеется несколько ссылок на "прокси", но ни одна из функций, похоже, не позволяет определить прокси. Мне нужно что-то вроде этого:
client := &http.Client{}
client.SetProxy("someip:someport") // pseudo code
resp, err := client.Get("http://example.com") // do request through proxy
Любая идея, как это сделать в Go?
Ответы
Ответ 1
lukad верен, вы можете установить переменную среды HTTP_PROXY
, если вы это сделаете, то Go будет использовать ее по умолчанию.
Bash:
export HTTP_PROXY="http://proxyIp:proxyPort"
Go:
os.Setenv("HTTP_PROXY", "http://proxyIp:proxyPort")
Вы также можете создать свой собственный http.Client, который ДОЛЖЕН использовать прокси-сервер независимо от конфигурации среды:
proxyUrl, err := url.Parse("http://proxyIp:proxyPort")
myClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
Это полезно, если вы не можете зависеть от конфигурации среды или не хотите ее изменять.
Вы также можете изменить транспорт по умолчанию, используемый пакетом "net/http
". Это повлияет на всю вашу программу (включая HTTP-клиент по умолчанию).
proxyUrl, err := url.Parse("http://proxyIp:proxyPort")
http.DefaultTransport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
Ответ 2
Go будет использовать прокси, определенные в переменной окружения HTTP_PROXY
, если он установлен. В противном случае он не будет использовать прокси.
Вы можете сделать это следующим образом:
os.Setenv("HTTP_PROXY", "http://someip:someport")
resp, err := http.Get("http://example.com")
if err != nil {
panic(err)
}
Ответ 3
Можно также попробовать следующее:
url_i := url.URL{}
url_proxy, _ := url_i.Parse(proxy_addr)
transport := http.Transport{}
transport.Proxy = http.ProxyURL(url_proxy)// set proxy
transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //set ssl
client := &http.Client{}
client.Transport = transport
resp, err := client.Get("http://example.com") // do request through proxy
Ответ 4
Для альтернативного способа вы также можете использовать GoRequest, в котором есть функция, позволяющая легко установить прокси для любого отдельного запроса.
request := gorequest.New()
resp, body, errs:= request.Proxy("http://proxy:999").Get("http://example.com").End()
resp2, body2, errs2 := request.Proxy("http://proxy2:999").Get("http://example2.com").End()
Или вы можете установить для всего сразу.
request := gorequest.New().Proxy("http://proxy:999")
resp, body, errs:= request.Get("http://example.com").End()
resp2, body2, errs2 := request.Get("http://example2.com").End()
Ответ 5
решить проблему после добавления "http://"? транспорт не поддерживает одновременную отправку нескольких запросов с разными URL прокси