Есть ли способ получить окончательный URL-адрес запроса? Я знаю, что я могу отключить перенаправления и сам по себе, но есть ли способ получить текущий URL-адрес, который я загружаю? Например, если я попросил a.com и получил перенаправление на b.com, есть ли способ получить имя URL-адреса b.com?
Как получить адрес перенаправления OkHttp3?
Ответ 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());
Ответ 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;
}
}