Android Volley ImageLoader - Как использовать базовую HTTP-авторизацию?

Я хочу использовать Volley NetworkImageView для загрузки изображений из моего REST API, для которого требуется базовая авторизация HTTP. Поэтому мне нужно добавить заголовки в HTTP-запрос.

Я составил следующие подходы:

Переопределить Request.getHeaders() — как описано в этом вопросе. Это было бы хорошо, но проблема в том, что ImageLoader жестко запрограммировано new ImageRequest(), поэтому я не могу передать свою реализацию Request в ImageLoader, и ее нельзя легко наследовать и настроить (метод, который мне нужно переопределить, использует частные свойства).

Решение состоит в том, чтобы изменить саму библиотеку Volley (чего я хотел бы избежать).

Используйте пользовательский стек HttpClientStack — как описано здесь. Используя этот подход, я смогу перехватить HTTP-коммуникацию и добавить необходимые заголовки. Но я думаю, что это неправильный способ - я бы потерял автоматический выбор HttpClient с помощью Volley (Gingerbread против HC и IC).


Есть ли более простой способ добиться этого, чего мне не хватает?


person lopisan    schedule 04.06.2013    source источник


Ответы (2)


Я также переопределил getHeaders(). До сих пор я не нашел способ сделать это проще.

См. этот пример https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.java переопределенного запроса на включение заголовка авторизации.

Из кода Volley я не вижу никакого способа добавить пользовательские заголовки, если не переопределить объект Request.

Более того, я не понимаю, как его можно легко добавить, учитывая структуру Volley, что касается изображений, ImageRequests создаются ImageLoader.

Если бы мне пришлось изменить Volley, чтобы разрешить это, я бы сделал возможным использование пользовательского класса, расширяющего ImageRequest в ImageLoader. Однако анонимный класс ImageRequest в ImageLoader несколько усложняет задачу.

person njzk2    schedule 04.06.2013
comment
Спасибо за ваш ответ. Жаль, что более простого способа не существует. Я сделаю это так, как вы предложили - изменив ImageLoader для использования собственного класса ImageRequest (путем создания и передачи ImageLoader ImageRequestFactory). Если я прав, анонимные — это просто слушатели, переданные в ImageRequest, а не сам ImageRequest, так что это не должно быть проблемой. - person lopisan; 04.06.2013
comment
есть анонимный ImageRequest для вызова onGetImageSuccess(cacheKey, response); в onResponse (хотя я бы поместил это прямо в ImageRequest или даже в Request.) - person njzk2; 04.06.2013

Я думаю, что стеки HTTP — это то, что нужно. Автоматический выбор HttpClient не теряется, если вы выполняете свои переопределения на основе версии SDK, точно так же, как это делает Volley.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
        HurlStack stack = new HurlStack() {
            @Override
            public HttpResponse performRequest(Request<?> request, Map<String, String> headers)
                throws IOException, AuthFailureError {

                headers.putAll(MyApp.getAuthParams());

                return super.performRequest(request, headers);
            }
        };

        requestQueue = Volley.newRequestQueue(getApplicationContext(), stack);

    } else {
        HttpClientStack stack = new HttpClientStack(AndroidHttpClient.newInstance("volley/0")) {
            @Override
            public HttpResponse performRequest(Request<?> request, Map<String, String> headers)
                throws IOException, AuthFailureError {

                headers.putAll(MyApp.getAuthParams());

                return super.performRequest(request, headers);
            }
        };

        requestQueue = Volley.newRequestQueue(getApplicationContext(), stack);
    }

См. Источник залпа (строка 53).

person Rafa    schedule 25.07.2013
comment
Очень аккуратное решение. ;) - person multiholle; 08.11.2013
comment
В рамках выпуска Android M класс HttpResponse удален из SDK. - person Bytecode; 02.06.2016