リクエストの最終URLを取得する方法はありますか?自分でリダイレクトとこれへのリダイレクトを無効にできることは知っていますが、読み込んでいる現在のURLを取得する方法はありますか?たとえば、a.comをリクエストしてb.comにリダイレクトされた場合、URL b.comの名前を取得する方法はありますか?
応答オブジェクトは、それを取得するために使用された要求と応答のチェーンを提供します。
最終的なURLを取得するには、Response
で request()
を呼び出して最終的なRequest
を呼び出し、 url()
あなたが望む。
priorResponse()
を呼び出し、各Response
に関連付けられているRequest
を確認することで、応答チェーン全体をたどることができます。
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());
応答ヘッダーから「場所」を使用できます(トピック 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;
}
}