2013-02-02 174 views
29

我試圖設置HTTP客戶端,以便它使用代理,但是我不太明白如何去做。該文檔有多個引用「代理」,但沒有任何功能似乎允許定義代理。我需要的是這樣的:爲HTTP客戶端設置代理

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

任何想法如何在Go中做到這一點?

回答

70

lukad是正確的,你可以設置HTTP_PROXY環境變量,如果你這樣做圍棋將默認使用它。

擊:

export HTTP_PROXY="http://proxyIp:proxyPort" 

轉到:

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)} 
+0

事實上,我需要同時發送幾個請求,每個請求使用不同的代理,所以你的第二個解決方案可能是我需要的。然而,它似乎並沒有工作,我得到這個錯誤的所有代理:'獲取http://stackoverflow.com:http:錯誤連接到代理87.236.233.92:8080:GetServByName:請求的名稱是有效,但沒有找到所需類型的數據。「任何想法是什麼意思? –

+0

我得到了我對這個問題的答案 - http://stackoverflow.com/q/14669958/561309 –

+0

僅供參考:'url'在[net/url](https://golang.org/pkg/net/url /) –

6

如果設置了Go,將使用環境變量HTTP_PROXY中定義的代理。否則,它將不使用代理。

你可以做這樣的:

os.Setenv("HTTP_PROXY", "http://someip:someport") 
resp, err := http.Get("http://example.com") 
if err != nil { 
    panic(err) 
} 
+1

僅供參考 - 「恐慌」後的「返回」[是多餘的](http://blog.golang.org/defer-panic-and-recover)。 –

2

願你也可以試試這個:

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 
0

另一種可選擇的方式,你也可以使用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() 
+0

gorequest不支持襪子代理 –