2017-11-15 10 views
1

私が理解している限り、リクエストに対してプロキシを設定できる唯一の方法は、それをクライアントに割り当てて、それをリクエストに使用することです。しかし、私は私の要求に対してクライアントを再利用すべきであることも理解しています。同じクライアントを使用している間に、リクエストごとにプロキシを個別に割り当てる方法はありますか?あるいは、リクエストごとに異なるプロキシを使用して効率的にリクエストを収集する方法はありますか?各リクエストで異なるプロキシを使用する

+0

あなたがプロキシを設定しようとしていますか? –

+0

は、トランスポート内にプロキシを割り当てようとした後、クライアントを初期化するときにプロキシを含めることを試みました。プロキシは、そのクライアントによって発行された要求内で使用されます。私はそれを達成するための他の方法を認識していません –

答えて

1

http.Clientの作成は、それほど高価ではありません。要求ごとに行うことができる単なる構造体割り当てです。

http.Clientを作成してオブジェクトを移送し、そこに直接プロキシを設定する必要があります。

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/") 

テレは異なるプロキシを常に同じクライアントを使用する他働かです:最初の例から

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:ここでは、1つのクライアントでのみ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/") 
+0

あなたは、実際には、私が作ったリクエストごとに新しいクライアントを作成するにはあまりにも高価ではないと言っていますか?よかったね。あなたが与えてくれたメソッドを拡張してみましょう。 –

+0

@JordanAllen:はい - クライアントは4つのフィールドを持つ構造体です。トランスポートはインターフェイスです - http.Transportはクライアント自体よりもabitです - もしあなたが各プロキシのために事前に準備することができますが、実際にはそれは価値がありません。 – Oleg

+0

驚くべき答え。ありがとう、私に多くのオプションと私のオプションを理解するのに役立つ多くのものを与えられました。感謝します! –

関連する問題