web-dev-qa-db-ja.com

OkHttp3リダイレクトURLを取得するにはどうすればよいですか?

リクエストの最終URLを取得する方法はありますか?自分でリダイレクトとこれへのリダイレクトを無効にできることは知っていますが、読み込んでいる現在のURLを取得する方法はありますか?たとえば、a.comをリクエストしてb.comにリダイレクトされた場合、URL b.comの名前を取得する方法はありますか?

12
Gatonito

応答オブジェクトは、それを取得するために使用された要求と応答のチェーンを提供します。

最終的なURLを取得するには、Responserequest() を呼び出して最終的なRequestを呼び出し、 url() あなたが望む。

priorResponse() を呼び出し、各Responseに関連付けられているRequestを確認することで、応答チェーン全体をたどることができます。

22
Jake Wharton

OkHttp.BuilderにはNetworkInterceptorが用意されています。例を次に示します。

        OkHttpClient httpClient = new OkHttpClient.Builder()
            .addNetworkInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    System.out.println("url: " + chain.request().url());
                    return chain.proceed(chain.request());
                }
            })
            .build();
    System.out.println(httpClient.newCall(new Request.Builder().url("http://google.com").build()).execute());

OkHttp3 wiki:インターセプター

2
Colin Chen

応答ヘッダーから「場所」を使用できます(トピック https://stackoverflow.com/a/41539846/984362 を参照)。例:

{
{
    okHttpClient = new OkHttpClient.Builder()
        .addNetworkInterceptor(new LoggingInterceptor())
        .build();
}

private class LoggingInterceptor implements Interceptor {
    @Override public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);

        utils.log("LoggingInterceptor", "isRedirect=" + response.isRedirect());
        utils.log("LoggingInterceptor", "responseCode=" + response.code());
        utils.log("LoggingInterceptor", "redirectUri=" + response.header("Location"));

        return response;
    }
}
0
user9843623