私が理解している限り、リクエストに対してプロキシを設定できる唯一の方法は、それをクライアントに割り当てて、それをリクエストに使用することです。しかし、私は私の要求に対してクライアントを再利用すべきであることも理解しています。同じクライアントを使用している間に、リクエストごとにプロキシを個別に割り当てる方法はありますか?あるいは、リクエストごとに異なるプロキシを使用して効率的にリクエストを収集する方法はありますか?各リクエストで異なるプロキシを使用する
答えて
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/")
あなたは、実際には、私が作ったリクエストごとに新しいクライアントを作成するにはあまりにも高価ではないと言っていますか?よかったね。あなたが与えてくれたメソッドを拡張してみましょう。 –
@JordanAllen:はい - クライアントは4つのフィールドを持つ構造体です。トランスポートはインターフェイスです - http.Transportはクライアント自体よりもabitです - もしあなたが各プロキシのために事前に準備することができますが、実際にはそれは価値がありません。 – Oleg
驚くべき答え。ありがとう、私に多くのオプションと私のオプションを理解するのに役立つ多くのものを与えられました。感謝します! –
- 1. 各タブ/ウィンドウに異なるプロキシを使用する方法
- 2. ProxySelector:各URLの異なるプロキシ
- 3. URLがPythonで異なるプロキシをリクエストしています
- 4. リクエストが動作していないプロキシを使用する
- 5. 異なるホストヘッダーを使用するASMX Javascriptプロキシ
- 6. 各ページで異なるフッタースタイルを使用するRuby on Rails
- 7. EclipseでHTTPリクエストにプロキシを使用する
- 8. OCSPリクエストでプロキシを使用する方法
- 9. WireMockレスポンスを記録するために異なるホストに異なるリクエストをプロキシする
- 10. プロキシを使用したhttpsリクエスト
- 11. Xamarin SignalR - 異なるフラグメント/アクティビティで同じ接続プロキシを使用する
- 12. 各ユニットテストのWCFサービスに異なるエンドポイントを使用する
- 13. AWSリクエストをプロキシするツール
- 14. 異なるHTTPメソッドを使用してリクエストを送信する
- 15. プロキシを使用してリクエストURIを抽出する
- 16. プロキシを使用してakka-httpリクエストをルーティングする
- 17. 各リクエストごとに異なるデータを表示
- 18. sc-serverでHTTPSリクエストをプロキシする
- 19. node.jsでHTTPリクエストをプロキシする値
- 20. クロスドメインPOSTプロキシを使用しないAjaxリクエスト
- 21. ウェブページが異なるリクエストで異なるステータスコードを返します
- 22. 異なるブラウザで異なる結果を返すGETリクエスト
- 23. Polymerの各要素で異なるツールバーを使用する方法
- 24. 各インデックスで異なるクラスのng-repeatを使用するには
- 25. httpsプロキシでのリクエスト
- 26. PHPでソケットでプロキシを使用する
- 27. JQuery Crossdomain XMLリクエスト(プロキシなし)
- 28. 異なるプロキシで複数のWebブラウザーコントロールを実行する
- 29. 使用するプロキシsquidポートに応じて異なるリダイレクタを使用しますか?
- 30. 異なるページで異なるサーブレットを使用する
あなたがプロキシを設定しようとしていますか? –
は、トランスポート内にプロキシを割り当てようとした後、クライアントを初期化するときにプロキシを含めることを試みました。プロキシは、そのクライアントによって発行された要求内で使用されます。私はそれを達成するための他の方法を認識していません –