Подтвердить что ты не робот

Настройка прокси для HTTP-клиента

Я пытаюсь настроить HTTP-клиент так, чтобы он использовал прокси-сервер, однако я не могу понять, как это сделать. В документации имеется несколько ссылок на "прокси", но ни одна из функций, похоже, не позволяет определить прокси. Мне нужно что-то вроде этого:

client := &http.Client{}
client.SetProxy("someip:someport") // pseudo code
resp, err := client.Get("http://example.com") // do request through proxy

Любая идея, как это сделать в Go?

4b9b3361

Ответ 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 прокси