Модифицировать получить параметр из 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;
}

Надеюсь, это может кому-то помочь.

Другие вопросы по тегам