【问题标题】:Setting up proxy for HTTP client为 HTTP 客户端设置代理
【发布时间】:2013-01-17 15:55:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: http proxy request go


    【解决方案1】:

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

    你可以这样做:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 事实上,我需要同时发送几个请求,每个请求使用不同的代理,所以你的第二个解决方案可能就是我需要的。但是,它似乎不起作用,所有代理都收到此错误:Get http://stackoverflow.com: http: error connecting to proxy 87.236.233.92:8080: GetServByName: The requested name is valid, but no data of the requested type was found. 知道这意味着什么吗?
    • 我在那里得到了这个问题的答案 - stackoverflow.com/q/14669958/561309
    • @voidlogic 设置环境变量对我不起作用。我必须将它传递给 http.Transport
    • 使用 socks5 代理也可以实现吗?
    【解决方案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
    

    【讨论】:

    • 我想你的意思是:transport := &http.Transport{}
    • 在将其粘贴到代码之前,请确保您确实需要 InsecureSkipVerify
    • 提示:你不想要 InsecureSkipVerify
    【解决方案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()
    

    【讨论】:

    • gorequest 不支持 socks 代理
    【解决方案5】:

    如果你运行这样的东西:

    HTTP_PROXY=89.x.y.z path_to_program
    

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

    【讨论】:

      【解决方案6】:

      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 函数的有用性

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 2012-05-12
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多