-
Notifications
You must be signed in to change notification settings - Fork 2
Android REST API Research
HappyFanik edited this page Apr 10, 2015
·
1 revision
Реализация REST-клиента под Android обладает рядом особенностей. "По полочкам" все разложил, в свое время, Virgil Dobjanschi на Google I/O 2010. В двух словах: простейший подход, который приходит в голову - запустить из Activity отдельный поток, посылать из него на сервер REST-запросы, сохранять результаты в память (а не в базу данных), - абсолютно неверен. Взамен Dobjanschi предложил (на выбор) три корректных варианта реализации REST-клиента.
- Pattern А. Использовать Service API: Activity -> Service -> Content Provider. В данном варианте Activity работает с API Android Servcie. При необходимости послать REST-запрос Activity создает Service, Service асинхронно посылает запросы к REST-серверу и сохраняет результаты в Content Provider (sqlite). Activity получает уведомление о готовности данных и считывает результаты из Content Provider (sqlite).
- Pattern B. Использовать ContentProvider API: Activity -> Content Provider -> Service. В этом случае Activity работает с API Content Provider, который выступает фасадом для сервиса. Данный подход основан на схожести Content Provider API и REST API: GET REST эквивалентен select-запросу к базе данных, POST REST эквивалентен insert, PUT REST ~ update, DELETE REST ~ delete. Результаты Activity так же загружает из sqlite.
- Pattern C. Использовать Content Provider API + SyncAdapter: Activity -> Content Provider -> Sync Adapter. Вариация подхода "B", в котором вместо сервиса используется собственный Sync Adapter. Activity дает команду Content Provider, который переадресовывает ее в Sync Adapter. Sync Adapter вызывается из Sync Manager, но не сразу, а в "удобный" для системы момент. Т.о. возможны задержки в исполнении команд.
Предложенные паттерны можно реализовать вручную, воспользовавшись библиотеками Android Asynchronous HTTP Client API или Volley (Google). Можно взять за основу готовые варианты реализации паттернов, например:
- Sample Implementation of Virgil Dobjanschi's Rest pattern - статья на CodeProject, pattern A
- Restfull-android на Github by Haberman and Armstrong of the Minnesota Android User's Group. Pattern A
- Пример реализации второго варианта - Pattern B, - есть в книге "Programming Android, 2nd Edition" by Zigurd Mednieks, Laird Dornin, G. Blake Meike and Masumi Nakamura, в главе 13 "A Content Provider as a Facade for a RESTful Web Service"
Однако, проще и удобнее будет воспользоваться одной из подходящих библиотек:
- RoboSpice - мощная, модульная, хорошо документированная библиотека, регулярно обновляется. Pattern A + много полезных доп. функций. Детальное объяснение, как устроена библиотека: A User's Perspective on RoboSpice.
- Datadroid, реализует pattern A, о чем явно написано в документации. Текущая версия 2.1.2
- RESTDroid, pattern A
- Mechanoid Ops. Mechanoid Library - это набор из четырех кодогенераторов (база данных sqlite, код для работы с длительными асинхронными запросами в отрыве от UI - Pattern A, работа с JSON, работа с Shared Preference). Текущая версия - 0.2.2 ALPHA
- RESTProvider (не совсем ясно, развивается ли библиотека: последнее обновление - 2 года назад).
- Retrofit. HTTP-запросы описываются через аннотации, синхронные и асинхронные вызовы REST-методов, данные могут передаваться в виде JSON, XML, Protobuf. Текущая версия 1.3, обновляется регулярно. С этой библиотекой на пару умеет работать RoboSpice.
- PostmanLib.
- Управление сервисом: запуск, остановка.
- Передача результатов из сервиса в активити.
- Кэшировать результатов в sqlite.
- Фиксирование статуса данных sqlite перед и после выполнения REST-запроса.
- Запись информации о проводимых REST-операциях в sqlite.
- Парсинг полученных данных.
- Конструирование REST-запроса на основе URI и набора параметров.
- Выполнение сетевых запросов к REST-серверу.
- Чистка базы данных от устаревших данных.
- В случае неудачи REST-запроса, пытаться повторить запрос (например, экспоненциально увеличивая время между запросами).
- Возможность отложенного запуска REST-запроса через SyncAdapter.