Модифицировать получить параметр из URL перенаправления
Я использую Retrofit.
У меня есть конечная точка, которая перенаправляет на другую конечную точку. Последний (конечная точка, на которой я в конечном итоге) имеет параметр в своем URL, который мне нужен. Каков наилучший способ получить значение этого параметра?
Я даже не могу понять, как получить URL, на который я перенаправлен, используя Retrofit.
3 ответа
Ответ OkHttp предоставит вам запрос на уровне проводника ( https://square.github.io/okhttp/3.x/okhttp/okhttp3/Response.html). Это будет запрос, который инициировал ответ от перенаправления. Запрос выдаст вам свой HttpUrl, а HttpUrl может дать вам ключи и значения его параметров, пути и т. Д.
В Retrofit 2 просто используйте retrofit2.Response.raw(), чтобы получить okhttp3.Response и следуйте приведенным выше инструкциям.
Решением для этого было бы использовать перехватчик, например
private Interceptor interceptor = new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
okhttp3.Response response = chain.proceed(chain.request());
locationHistory.add(response.header("Location"));
return response;
}
};
Добавьте перехватчик в ваш HttpClient и добавьте его в Retrofit(используя 2.0 для этого примера)
public void request(String url) {
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.followRedirects(true);
client.addNetworkInterceptor(interceptor);
OkHttpClient httpClient = client.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build();
}
Теперь у вас есть полный доступ ко всей истории перенаправления.
Я использую модернизацию. И я могу получить URL перенаправления следующим образом:
private boolean handleRedirectUrl(RetrofitError cause) {
if (cause != null && cause.getResponse() != null) {
List<Header> headers = cause.getResponse().getHeaders();
for (Header header : headers) {
//KEY_HEADER_REDIRECT_LOCATION = "Location"
if (KEY_HEADER_REDIRECT_LOCATION.equals(header.getName())) {
String redirectUrl = header.getValue();
return true;
}
}
}
return false;
}
Надеюсь, это может кому-то помочь.