10

リダイレクトスクリプトのベンチマークテストを書いています。

AppStoreにリダイレクトする特定のURLを照会するようにプログラムをwisgします。しかし、AppStoreページをダウンロードしたくありません。リダイレクトURLまたはエラーをログに記録したいだけです。

2番目のリダイレクトクエリなしでURLをクエリするように指示するにはどうすればよいですか?


アップデート

どちらの答えも正しいですが、次のようになります。

私は両方の解決策を試しました。私はベンチマークを行っています。1つまたは複数のgoプロセスを10〜500のgoルーチンで実行します。ループでURLを照会します。私のサーバーもgoで書かれています。毎秒のリクエスト数を報告します。

  • 最初の解決策:http.DefaultTransport.RoundTrip-動作が遅く、エラーが発生します。最初の4秒は正常に機能します。300〜500クエリを実行すると、パフォーマンスは1秒あたり80クエリに低下します。

次に、1秒あたり0〜5のクエリに低下し、クエリスクリプトは次のようなエラーを取得し始めます

dial tcp IP:80: A connection attempt failed because the connected 
party did not properly respond after a period of time, or established 
connection failed because connected host has failed to respond.

閉じた接続を再利用していると思います。

  • 2番目の解決策:CheckRedirect field一定のパフォーマンスで動作します。接続を再利用するのか、リクエストごとに新しい接続を開くのかはわかりません。clientループ内のすべてのリクエストに対して作成します。それは実際の生活でどのように動作するかです(すべての要求は新しい接続です)。各クエリの後に接続が閉じられ、再利用されないようにする方法はありますか?

そのため、私の質問に答える2番目のソリューションをマークします。しかし、私の調査では、各クエリが新しい接続であることが非常に重要です。2番目のソリューションでどのように確認できますか?

4

2 に答える 2

20

http.Clientの代わりにhttp.Transportを使用する必要があります。トランスポートは下位レベルであり、リダイレクトに従いません。

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil)
// ...
resp, err := http.DefaultTransport.RoundTrip(req)
于 2013-01-20T00:46:52.680 に答える
14

完全を期すために、リダイレクトに従わずにを使用できます。関数であるフィールドがあります。リダイレクトを実行する前に呼び出されます。http.Clienthttp.ClientCheckRedirect

この関数がエラーを返す場合、リダイレクトに従わず(Goのソースコードの関数を参照httpClient.Do(...)doFollowingRedirects()代わりにエラーを返します(具体的なタイプはでurl.Errorあり、そのURLフィールドはリダイレクト先URL、別名Locationヘッダー値になります) 、このコードを参照してください)。

この使用法の具体例については、私のgocrawlライブラリを参照してください。

于 2013-01-20T17:01:53.577 に答える