Как получить адрес перенаправления OkHttp3?

Есть ли способ получить окончательный URL-адрес запроса? Я знаю, что я могу отключить перенаправления и сам по себе, но есть ли способ получить текущий URL-адрес, который я загружаю? Например, если я попросил a.com и получил перенаправление на b.com, есть ли способ получить имя URL-адреса b.com?

Ответ 1

Объект ответа предоставляет цепочку запросов и ответов, которые были использованы для его получения.

Чтобы получить окончательный URL-адрес, вызовите request() в Response для окончательного Request, который затем предоставляет url().

Вы можете следить за всей цепочкой ответов, вызывая priorResponse() и глядя на каждый Response связанный Request.

Ответ 2

В 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: Перехватчики

Ответ 3

Вы можете использовать "Местоположение" из заголовка ответа (см. тему fooobar.com/info/6272164/...). Пример:

{
{
    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;
    }
}