Skip to content

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, но не сразу, а в "удобный" для системы момент. Т.о. возможны задержки в исполнении команд.

Варианты реализации REST-клиентов на Android


Предложенные паттерны можно реализовать вручную, воспользовавшись библиотеками Android Asynchronous HTTP Client API или Volley (Google). Можно взять за основу готовые варианты реализации паттернов, например:

Однако, проще и удобнее будет воспользоваться одной из подходящих библиотек:

  • 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.

Задачи, которые требуется решить при реализации REST-клиента


  • Управление сервисом: запуск, остановка.
  • Передача результатов из сервиса в активити.
  • Кэшировать результатов в sqlite.
  • Фиксирование статуса данных sqlite перед и после выполнения REST-запроса.
  • Запись информации о проводимых REST-операциях в sqlite.
  • Парсинг полученных данных.
  • Конструирование REST-запроса на основе URI и набора параметров.
  • Выполнение сетевых запросов к REST-серверу.
  • Чистка базы данных от устаревших данных.
  • В случае неудачи REST-запроса, пытаться повторить запрос (например, экспоненциально увеличивая время между запросами).
  • Возможность отложенного запуска REST-запроса через SyncAdapter.