2013-02-02 176 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不支持袜子代理 –