Даже если эта ветка приняла ответ, не стесняйтесь предлагать другие идеи, которые вы используете или любите
Я встречал эти статьи:
И это привело меня к этому видео Google I / O 2010 о клиентских приложениях REST.
С этого момента я создаю компонент REST как статический компонент в своем классе контроллера приложения.
С этого момента, я думаю, мне следует изменить схему. Кто- то заметил, что приложение Google IOSched - отличный пример того, как писать REST-клиенты на Android. Кто-то другой сказал, что этот способ слишком сложен.
Итак, может ли кто-нибудь показать нам, что является лучшим методом? Коротко и просто.
Приложение IOSched слишком сложно для примера использования.
Ответы:
РЕДАКТИРОВАТЬ 2 (октябрь 2017 г.):
Это 2017 год. Просто используйте Retrofit. Практически нет причин использовать что-то еще.
РЕДАКТИРОВАТЬ:
Первоначальному ответу на момент редактирования более полутора лет. Хотя концепции, представленные в исходном ответе, все еще сохраняются, как указывают другие ответы, теперь существуют библиотеки, которые облегчают вам эту задачу. Что еще более важно, некоторые из этих библиотек обрабатывают изменения конфигурации устройства за вас.
Исходный ответ сохраняется ниже для справки. Но, пожалуйста, также найдите время, чтобы изучить некоторые клиентские библиотеки Rest для Android, чтобы увидеть, подходят ли они вашим вариантам использования. Ниже приводится список некоторых библиотек, которые я оценил. Это ни в коем случае не претендует на исчерпывающий перечень.
Оригинальный ответ:
Представляю свой подход к клиентам REST на Android. Я не утверждаю, что это лучший вариант :) Также обратите внимание, что это то, что я придумал в ответ на мое требование. Вам может потребоваться больше слоев / добавить больше сложности, если этого требует ваш вариант использования. Например, у меня вообще нет локального хранилища; потому что мое приложение может терпеть потерю нескольких ответов REST.
Мой подход использует просто
AsyncTask
s под прикрытием. В моем случае я «вызываю» эти Задачи из своегоActivity
экземпляра; но чтобы полностью учесть такие случаи, как поворот экрана, вы можете вызвать их изService
или из чего-то подобного.Я сознательно выбрал сам мой REST-клиент в качестве API. Это означает, что приложение, которое использует мой клиент REST, даже не должно знать фактический URL-адрес REST и используемый формат данных.
У клиента будет 2 слоя:
Верхний уровень: цель этого уровня - предоставить методы, которые отражают функциональность REST API. Например, у вас может быть один метод Java, соответствующий каждому URL-адресу в вашем REST API (или даже два - один для GET и один для POST).
Это точка входа в клиентский API REST. Это слой, который приложение обычно использует. Это может быть синглтон, но не обязательно.
Ответ на вызов REST анализируется этим уровнем в POJO и возвращается в приложение.
Это уровень нижнего уровня
AsyncTask
, который использует клиентские методы HTTP для фактического выхода и выполнения этого вызова REST.Кроме того, я решил использовать механизм обратного вызова, чтобы сообщить приложению результат
AsyncTask
s.Хватит текста. Давайте теперь посмотрим код. Возьмем гипотетический URL-адрес REST API - http://myhypotheticalapi.com/user/profile
Верхний слой может выглядеть так:
Обратите внимание, что приложение не использует JSON или XML (или любой другой формат), возвращаемые REST API напрямую. Вместо этого приложение видит только компонент
Profile
.Тогда нижний уровень (слой AsyncTask) может выглядеть так:
Вот как приложение может использовать API (в
Activity
илиService
):Надеюсь, комментариев достаточно, чтобы объяснить дизайн; но я был бы рад предоставить больше информации.
источник
GetResponseCallback
более универсальным. Я предпочитаю использовать интерфейс маркера : например,interface IGetResopnse{}
обозначать все классы, которые могут быть ответами. Тогда, я иclass Profile implements IGetResponse
т.д. И, наконец, сделатьGetResponseCallback
общий сIGetResponse
как верхняя граница :public abstract class GetResponseCallback<? extends IGetResponse>
.«Разработка клиентских приложений Android REST» Вирджила Добьянски вызвала много споров, поскольку исходный код не был представлен во время сеанса и не был предоставлен впоследствии.
Единственная известная мне эталонная реализация (прокомментируйте, если вы знаете больше) доступна на Datadroid (сессия Google IO упоминается в разделе / presentation). Это библиотека, которую вы можете использовать в своем собственном приложении.
Вторая ссылка запрашивает «лучшую» структуру REST, которая подробно обсуждается в stackoverflow. Для меня важен размер приложения, за которым следует производительность реализации.
Поэтому для более сложных сценариев я использую org.json или GSON. Для архитектуры реализации org.json я использую статический класс, который представляет варианты использования сервера (например, findPerson, getPerson). Я вызываю эту функцию из службы и использую служебные классы, которые выполняют сопоставление (для конкретного проекта) и сетевой ввод-вывод (мой собственный шаблон REST для простого GET или POST). Я стараюсь избегать использования рефлексии.
источник
Никогда не используйте AsynTask для выполнения сетевого запроса или чего-то еще, что необходимо сохранить. Асинхронные задачи сильно привязаны к вашей активности, и если пользователь изменит ориентацию экрана после повторного создания приложения, AsyncTask будет остановлен.
Я предлагаю вам использовать шаблон Service с Intent Service и ResultReceiver. Взгляните на RESTDroid . Это библиотека, которая позволяет выполнять любые запросы REST асинхронно и уведомлять пользовательский интерфейс с помощью прослушивателей запросов, реализующих шаблон службы Вирджила Добьянски.
источник
Есть еще одна библиотека с гораздо более чистым API и типобезопасными данными. https://github.com/kodart/Httpzoid
Вот простой пример использования
Или более сложный с обратными вызовами
Он свежий, но выглядит очень многообещающе.
источник
Есть много библиотек, и я использую эту: https://github.com/nerde/rest-resource . Он был создан мной, и, как вы можете видеть в документации, он намного чище и проще, чем другие. Он не ориентирован на Android, но я использую его, и он работает довольно хорошо.
Он поддерживает HTTP Basic Auth. Он выполняет грязную работу по сериализации и десериализации объектов JSON. Вам это понравится, особенно если ваш API похож на Rails.
источник
Отказ от ответственности: я участвую в проекте с открытым исходным кодом rest2mobile
Другой альтернативой в качестве клиента REST является использование rest2mobile .
Подход немного отличается, поскольку он использует конкретные примеры отдыха для генерации клиентского кода для службы REST. Код заменяет REST URL и полезные данные JSON собственными java-методами и объектами POJO. Он также автоматически обрабатывает подключения к серверу, асинхронные вызовы и преобразования POJO в / из JSON.
Обратите внимание, что этот инструмент поставляется в разных вариантах (cli, плагины, поддержка android / ios / js), и вы можете использовать плагин android studio для создания API прямо в вашем приложении.
Весь код можно найти на github здесь .
источник
У нас есть открытый исходный код нашей легкой асинхронной клиентской библиотеки REST для Android, вы можете найти ее полезной, если у вас минимальные требования и вы не хотите самостоятельно обрабатывать многопоточность - это очень хорошо для базовых коммуникаций, но не для полноценного клиента REST библиотека.
Он называется libRESTfulClient и его можно найти на GitHub .
источник