60

我正在尝试设置 HTTP 客户端,以便它使用代理,但是我不太明白该怎么做。该文档对“代理”有多个引用,但似乎没有一个函数允许定义代理。我需要的是这样的:

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

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

4

6 回答 6

138

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)}
于 2013-02-02T15:52:39.007 回答
13

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

你可以这样做:

os.Setenv("HTTP_PROXY", "http://someip:someport")
resp, err := http.Get("http://example.com")
if err != nil {
    panic(err)
}
于 2013-02-02T12:39:32.187 回答
7

你也可以试试这个:

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
于 2014-01-15T08:38:19.097 回答
1

Go 内置代理的使用简要记录在DefaultTransport

// DefaultTransport .... It uses HTTP proxies
// as directed by the $HTTP_PROXY and $NO_PROXY (or $http_proxy and
// $no_proxy) environment variables.
var DefaultTransport RoundTripper = &Transport{
    Proxy: ProxyFromEnvironment,

DefaultTransport这表明从头开始创建自定义传输以利用内置ProxyFromEnvironment函数的有用性

于 2021-08-15T17:47:23.177 回答
1

如果你运行这样的东西:

HTTP_PROXY=89.x.y.z path_to_program

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

于 2020-03-16T11:50:56.943 回答
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()
于 2014-05-12T09:28:25.933 回答