Http 对每个请求使用不同的代理

Http 对每个请求使用不同的代理,http,go,proxy,Http,Go,Proxy,据我所知,为请求设置代理的唯一方法是将其分配给客户端,然后将其用于请求。然而,我也明白我应该为我的请求重用客户端。在使用同一个客户端时,是否有任何方法为每个请求单独分配代理?或者有什么方法可以有效地使用不同的代理为每个请求收集请求 创建http.Client并不昂贵——它只是一个可以为每个请求进行的结构分配 您应该自己创建http.Client和transport对象,并直接在那里设置代理 proxyUrl, err := url.Parse("http://127.0.0.1:123") if

据我所知,为请求设置代理的唯一方法是将其分配给客户端,然后将其用于请求。然而,我也明白我应该为我的请求重用客户端。在使用同一个客户端时,是否有任何方法为每个请求单独分配代理?或者有什么方法可以有效地使用不同的代理为每个请求收集请求

创建http.Client并不昂贵——它只是一个可以为每个请求进行的结构分配

您应该自己创建http.Client和transport对象,并直接在那里设置代理

proxyUrl, err := url.Parse("http://127.0.0.1:123")
if err != nil {
    panic(err)
}
myClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
myClient.Get("http://www.google.com/")
Tere是另一种可以始终使用同一客户机和不同代理的可能性:

第一个示例中的http.ProxyURL调用是函数:

// ProxyURL returns a proxy function (for use in a Transport)
// that always returns the same URL.
func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error) {
    return func(*Request) (*url.URL, error) {
        return fixedURL, nil
    }
}
您可以扩展它,并根据请求中的信息选择代理,或者实现其他一些逻辑

UPD:下面是如何在一个客户端上使用ProxyUrl的实现。但是,对不断变化的环境的过度关注与创建客户机的开销是相当的。我将使用第一个场景

//我们必须编写自己的Get(或其他)请求,并添加一些信息,说明这是一个代理请求。您可以通过请求的上下文来完成

func GetWithProxy(c *http.Client,proxyUrl *url.URL, url string) (resp *http.Response, err error) {
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return nil, err
    }

    if proxyUrl != nil {
        req = req.WithContext(context.WithValue(context.Background(),"proxy",proxyUrl))
    }

    return c.Do(req)
}
//组织可以使用此信息的客户端:

proxyUrl, err := url.Parse("http://127.0.0.1:123")
if err != nil {
    panic(err)
}

myClient := &http.Client{Transport: &http.Transport{Proxy: func(req *http.Request) (*url.URL, error) {
    currentProxy,_ := req.Context().Value("proxy").(*url.URL)
    return currentProxy, nil
}}}
使用它:

GetWithProxy(myClient,nil,"http://www.google.com/")
GetWithProxy(myClient,proxyUrl,"http://www.google.com/")

您尝试设置了哪些代理?尝试在传输中分配代理,然后在初始化客户端时将其包括在内。然后,代理将在该客户端发出的请求中使用。我不知道还有什么其他方法可以实现它,所以你是说为我的每个请求创建一个新的客户机实际上不会太昂贵,对吗?很高兴听到这个消息。我也会考虑扩展你给出的方法,谢谢:)@JordanAllen:Yes-client它的just struct有4个字段。传输是一个接口——http。传输比客户端本身更重要——如果你想的话,你可以为每个代理预先准备好它,但实际上它不值得。令人惊讶的答案。谢谢你,给了我很多选择,并帮助我理解我的选择。谢谢你!永远不要为每个请求创建
http.Transport
(尽管我不知道这是否是您推荐的)。不重用传输将泄漏打开的连接。@JimB:你说得对-传输可以保持连接打开。