为HTTP客户端设置代理

时间:2013-02-02 11:40:31

标签: http proxy request go

我正在尝试设置HTTP客户端,以便它使用代理,但我不太明白如何做到这一点。该文档有多个“代理”引用,但似乎没有任何函数可以定义代理。我需要的是这样的事情:

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

知道如何在Go中执行此操作吗?

5 个答案:

答案 0 :(得分:93)

lukad是正确的,您可以设置HTTP_PROXY环境变量,如果您这样做,Go将默认使用它。

击:

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

答案 1 :(得分:9)

Go将使用环境变量HTTP_PROXY中定义的代理(如果已设置)。否则它将不使用代理。

你可以这样做:

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

答案 2 :(得分:4)

你也可以试试这个:

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

答案 3 :(得分:1)

如果您运行以下命令:

HTTP_PROXY=89.x.y.z path_to_program

然后仅为该命令设置HTTP_PROXY设置,如果您不想为整个Shell会话设置它,则很有用。 注意:没有;在设置和路径之间;如果放了分号,它将为该shell设置(但不导出)HTTP_PROXY

答案 4 :(得分: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()
相关问题