Требуется образец проекта клиента REST для Android, который реализует шаблон реализации REST Вирджила Добьянски

82

Я хочу создать REST-клиент на телефоне Android.

Сервер REST предоставляет несколько ресурсов, например (GET)

http://foo.bar/customer      List of all customer
http://foo.bar/customer/4711    The customer with id 4711
http://foo.bar/customer/vip     List of all VIP customer

http://foo.bar/company           List of all companys
http://foo.bar/company/4711     The company with the ID 4711
http://foo.bar/company/vip      List of all VIP companys

Я (думаю) я знаю, как разговаривать с REST-сервером и получать нужную мне информацию. Я бы реализовал класс клиента REST с таким API

public List<Customer> getCustomers();
public Customer getCustomer(final String id);
public List<Customer> getVipCustomer();

public List<Company> getCompanies();
public Customer getCompany(final String id);
public List<Customer> getVipCompanies();

Ссылаясь на презентацию « Разработка клиентских приложений REST для Android » от Вирджила Добьянски, я узнал, что обрабатывать REST-запрос в рабочем потоке Activity - не лучшая идея. Вместо этого я должен использовать Service API.

Мне нравится идея иметь Singleton ServiceHelper, который связывается с (локальной) службой, но я боюсь, что я неправильно понял концепцию службы.

На данный момент я не понимаю, как сообщить результат вызова REST (выполненный асинхронно в службе) обратно в действие вызывающего абонента. Мне также интересно, нужна ли мне ОДНА служба, которая обрабатывает все запросы REST (с разными типами возврата), или мне нужна выделенная служба для каждого запроса REST.

Вероятно, у меня есть много других проблем с пониманием, поэтому лучше всего для меня будет образец приложения, отвечающего моим потребностям. В моем случае использования нет ничего необычного, и я надеюсь, что там есть пример приложения.

Пожалуйста, дайте мне знать!

Также полезны любые другие предложения, которые указывают мне правильное направление реализации (Android API-Demo не соответствует моему варианту использования).

Заранее спасибо.

Клаус

РЕДАКТИРОВАТЬ : похожие темы, найденные на SO (после публикации этого), которые ведут меня в нужном мне направлении (минимизируя сложный «шаблон Добьянски»):

FrVaBe
источник
1
Claszen, Вы получили какое-либо мнение об одной службе для всех запросов и выделенных службах для каждого запроса? Если да, пожалуйста, поделитесь. Сценарий в моем случае: у меня много запросов REST [около 20] для использования в моем приложении. Я наблюдал за ценной сессией в Google I / O, упомянутой выше. Мой вопрос в том, какой подход лучше. Чтобы одна служба обрабатывала все запросы в одной службе? или иметь специальный сервис для каждого запроса? У меня есть некоторые запросы, которые следует запускать последовательно, а некоторые можно запускать одновременно. Какие-либо предложения ?
@ user778869 Наконец я использовал по одному IntentService и ResultReceiver для каждого («верхнего уровня») ресурса REST (например, «компания», «клиент»). Я обнаружил, что это своего рода «естественная» структура, и она хорошо работает. Это может привести к дублированию кода, но предотвратит слишком интенсивное использование управляющих структур, если бы это было сделано в одной службе.
FrVaBe 04
Это может быть очень полезно для людей, изучающих реализацию клиента Android REST. Презентация Добьянски переведена в PDF-файл: drive.google.com/file/d/0B2dn_3573C3RdlVpU2JBWXdSb3c/…
Кей Зед

Ответы:

50

OverView

Редактировать:

Всем, кто интересуется, также подумайте о том, чтобы взглянуть на RESTful android, это может дать вам лучшее представление о нем.

Что я узнал из опыта реализации модели Добьянски, так это то, что не все высечено на камне, и он только дает вам обзор того, что делать, это может измениться от приложения к приложению, но формула такова:

Следуйте этим идеям + добавьте свое собственное = Happy Android приложение

Модель в некоторых приложениях может отличаться от требований, некоторым может не потребоваться учетная запись для SyncAdapter, другие могут использовать C2DM, этот, с которым я недавно работал, может кому-то помочь:


Создайте приложение, в котором есть Account и AccountManager.

Это позволит вам использовать SyncAdapter для синхронизации ваших данных. Это обсуждалось в разделе "Создание собственного SyncAdapter".

Создайте ContentProvider (если он вам подходит)

Эта абстракция позволяет вам не только получить доступ к базе данных, но и перейти к ServiceHelper для выполнения вызовов REST, поскольку у нее есть индивидуальный метод сопоставления с REST Arch.

Контент-провайдер | REST метод

запрос ----------------> ПОЛУЧИТЬ

вставить ----------------> PUT

обновление ----------------> POST

удалить ----------------> УДАЛИТЬ

Уровни ServiceHelper

Этот парень в основном запускает (а) сервис (ы), который выполняет Http (не обязательно протокол, но это наиболее распространенный) REST-метод с параметрами, которые вы передали из ContentProvider. Я передал целое число совпадения, полученное из UriMatcher в поставщике контента, поэтому я знаю, к какому ресурсу REST получить доступ, т.е.

class ServiceHelper{

    public static void execute(Context context,int match,String parameters){
//find the service resource (/path/to/remote/service with the match
//start service with parameters 
    }

}

Сервис

Выполняется (я использую IntentService большую часть времени) и переходит в RESTMethod с параметрами, переданными от помощника, для чего это нужно? хорошо помните, что Служба хороша для работы в фоновом режиме.

Также реализуйте BroadCastReceiver, чтобы, когда служба завершила свою работу, уведомить мою активность, которая снова зарегистрировала эту широковещательную рассылку и запрос. Я считаю, что этот последний шаг не на Вирджиллской конференции, но я уверен, что это хороший вариант.

RESTMethod класс

Принимает параметры, ресурс WS ( http://myservice.com/service/path ) добавляет параметры, все готовит, выполняет вызов и сохраняет ответ.

Если требуется токен аутентификации, вы можете запросить его у AccountManager. Если вызов службы завершился неудачно из-за аутентификации, вы можете аннулировать токен аутентификации и повторно выполнить аутентификацию, чтобы получить новый токен.

Наконец, RESTMethod дает мне либо XML, либо JSON, независимо от того, создаю ли я процессор на основе сопоставителя и передаю ответ.

Процессор

Он отвечает за разбор ответа и его локальную вставку.

Образец приложения? Конечно!

Также, если вам интересно тестовое приложение, вы посмотрите на Eli-G , это может быть не лучший пример, но он соответствует подходу Service REST, он построен с помощью ServiceHelper, Processor, ContentProvider, Loader и Broadcast.

Некронет
источник
Спасибо за Ваш ответ. Наконец, я использовал по одному IntentService и ResultReceiver для каждого («верхнего уровня») ресурса REST (например, «компания», «клиент»). Модель Добжанского оказалась для меня слишком тяжелой.
FrVaBe 04
ну, используя IntentService и ResultReseiver, вы, вероятно, используете первый сценарий описания, который является моделью, управляемой службами, хотя он использует Binder вместо ResultReceiver для связи, но это хорошо, как я сказал, не высечено на камне !.
Necronet
Некоторое время назад я задал этот вопрос и нашел подходящее для меня решение. У меня не было возможности проверить все ссылки на образцы приложений, но, поскольку это самый актуальный ответ, я приму его. Тем не менее, я рекомендую проверить и все остальные ответы.
FrVaBe
Отличное предложение, проверьте все ответы, у всех у них много хороших ресурсов и идей !! как Джереми с книгой по программированию Android Йони с исходным кодом iosched.
Necronet
@Necronet Привет, только что наткнулся на ваш многообещающий образец приложения - однако у меня проблемы с его созданием. Не могли бы вы сказать нам, для какой версии ActionBarSherlock он должен быть создан (кажется, он не работает с последней версией ABS 4.1)? Кроме того, из вашего сообщения я действительно не выяснил, к какому паттерну (A, B или C) моделей Добьянски вы стремились (я знаю, вы, вероятно, закончили с некоторыми вариациями, но я полагаю, вы в основном сосредоточились на одной из шаблоны - я полагаю шаблон Б?) Спасибо!
vaiomike
17

В «Программировании Android» есть целая глава (13. Изучение поставщиков контента), посвященная «Варианту Б: использование ContentProvider API» из выступления Вирджила по вводу-выводу Google.

Мы не единственные, кто видит преимущества такого подхода. На конференции Google I / O в мае 2010 года Вирджил Добьянски из Google представил доклад, в котором изложил следующие три шаблона использования поставщиков контента для интеграции веб-сервисов RESTful в приложения Android ...

В этой главе мы подробно рассмотрим второй шаблон на нашем втором видео-примере Finch; эта стратегия принесет ряд важных преимуществ для ваших приложений. Из-за элегантности, с которой этот подход интегрирует сетевые операции в Android MVC, мы дали ему прозвище «Network MVC».

В будущей версии Programming Android могут быть рассмотрены два других подхода, а также представлены более подробные документы из этой презентации Google. После того, как вы прочитаете эту главу, мы предлагаем вам просмотреть доклад Google.

Настоятельно рекомендуется.

Программирование под Android Зигурдом Медниексом, Лэрдом Дорнином, Дж. Блейком Мейке и Масуми Накамурой. Авторские права 2011 O'Reilly Media, Inc., 978-1-449-38969-7.

Джереми Хаберман
источник
11

«Разработка клиентских приложений Android REST» Вирджила Добьянски вызвала много споров, поскольку исходный код не был представлен во время сеанса и не был предоставлен впоследствии.

  • Эталонная реализация доступна по адресу http://datadroid.foxykeep.com (сеанс ввода-вывода Google упоминается в разделе / ​​presentation). Это библиотека, которую вы можете использовать в своем собственном приложении.
  • Android Priority Job Queue был вдохновлен докладом Добжански и звучит для меня многообещающе.

Прокомментируйте, если вам известны другие реализации.

ChrLipp
источник
Спасибо, что поделились этой, вероятно, полезной ссылкой (в данный момент у меня нет возможности взглянуть глубже)
FrVaBe
Это похоже на решение. Спасибо !
Винсент Кантин,
7

Мы разработали библиотеку, которая решает эту проблему: RoboSpice .

В библиотеке используется «сервисный подход», описанный Вирджилом Добьянски и Нилом Гудманном , но мы предлагаем комплексное решение, которое:

  • выполняет асинхронно (в фоновом режиме AndroidService) сетевые запросы, которые возвращают POJO (например, запросы REST)
  • кэширует результаты (в Json или Xml, в плоских текстовых файлах или в двоичных файлах)
  • уведомляет ваши действия (или любой другой контекст) о результате сетевого запроса, если они все еще живы
  • не уведомляет ваши действия о результате, если их больше нет в живых
  • уведомляет о ваших действиях в их потоке пользовательского интерфейса
  • использует простую, но надежную модель обработки исключений
  • поддерживает несколько ContentServices для агрегирования результатов различных веб-сервисов
  • поддерживает многопоточность выполнения запросов
  • строго типизирован!
  • с открытым исходным кодом;)
  • и проверено

На самом деле мы ждем отзывов от сообщества.

Snicolas
источник
4

Модернизация может быть здесь очень полезной, она создает для вас адаптер из очень простой конфигурации, например:

Retrofit превращает ваш REST API в интерфейс Java.

public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user);
}

Класс RestAdapter создает реализацию интерфейса GitHubService.

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();

GitHubService service = restAdapter.create (GitHubService.class); Каждый вызов созданной GitHubService отправляет HTTP-запрос на удаленный веб-сервер.

List<Repo> repos = service.listRepos("octocat");

для получения дополнительной информации посетите официальный сайт: http://square.github.io/retrofit/

Примечание : адаптер, который RestAdapterвы получаете от Retrofit, не является производным от BaseAdapterвас, вы должны сделать для него оболочку как-то вроде этого вопроса SO. Почему мой ListView пуст после вызова setListAdapter внутри ListFragment?

MhdSyrwan
источник
Можете ли вы опубликовать полный пример вызова службы отдыха, например api.icndb.com/jokes/random
exequielc 01
3

Это немного поздно, но вот статья, которая объясняет первый паттерн из выступления:

http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p

Что мне нравится в первом шаблоне, так это то, что интерфейс для остальных методов представляет собой простой класс, а поставщику контента остается просто предоставлять доступ к базе данных.

Nzjoel
источник
3

Для начала вы должны проверить исходный код официального приложения Google I / O 2010 , особенно SyncService и различные классы в подпакете io .

Йони Самлан
источник
+1 Не совсем мой вариант использования, но в любом случае хороший и полезный пример приложения для Android. Благодаря!
FrVaBe
0

Хорошие новости, ребята. Реализация сервисного помощника доступна здесь: https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper. Это проект с открытым исходным кодом (Apache 2). Я в самом начале проекта. Я выполнил проект, в котором я определил шаблон, который нужно сделать, но я еще не извлек код, чтобы создать чистую библиотеку. Скоро это будет сделано.

Матиас Сеги Android2ee
источник