Go でリダイレクトなしで URL をクエリする
リダイレクト スクリプトのベンチマーク テストでは、自動リダイレクトを開始せずに URL をクエリする必要があります。これには、リダイレクト URL または関連するエラーをログに記録しながら、プログラムがリダイレクトされたコンテンツをダウンロードしないようにする必要があります。
解決策 1: http.DefaultTransport.RoundTrip を使用する
1 つのアプローチhttp.Request 内の http.DefaultTransport.RoundTrip() 関数を利用することです。 http.Client とは異なり、トランスポートは自動的にリダイレクトに従いません:
req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil) // ... resp, err := http.DefaultTransport.RoundTrip(req)
ただし、このソリューションでは、高負荷のシナリオではパフォーマンスの問題やエラーが発生する可能性があります。
解決策 2: 設定CheckRedirect を False
に設定する代わりに、http.Client の CheckRedirect フィールドを変更することもできます。自動リダイレクトを無効にするには:
client := &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, } // ... resp, err := client.Get("http://example.com/redirectToAppStore")
このメソッドは一貫したパフォーマンスを保証しますが、各クエリ後の接続の終了を保証するものではありません。
接続の終了を確実にする
接続を強制的に閉じるには、それぞれに対して新しい HTTP クライアントを作成できます。 request:
for i := 0; i < n; i++ { client := &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, } resp, err := client.Get("http://example.com/redirectToAppStore") // ... }
このアプローチにより、各クエリで新しい接続が使用されるようになり、接続の再利用によるパフォーマンスの問題が防止されます。
以上がリダイレクトをたどらずにGoでURLをクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。