Нужен пример проекта Android REST Client, в котором реализован шаблон реализации Virgil Dobjanschi REST - PullRequest
81 голосов
/ 09 февраля 2011

Я хочу построить клиент 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 в рабочем потоке действия.Вместо этого я должен использовать Service API.

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

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

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

Не могли бы вы сообщить мне!

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

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

Клаус

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

Ответы [ 8 ]

50 голосов
/ 04 октября 2011

OverView

Edit:

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

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

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

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


Создание приложения с учетной записью и AccountManager

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

Создайте ContentProvider (если это соответствует вашим потребностям)

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

Поставщик контента | Метод ОТДЫХА

query ----------------> GET

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

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

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

ServiceHelper Layering

Этот парень обычно запускает (а) сервис (ы), которые выполняют HESTP (не обязательно протокол, но это наиболее распространенный) метод 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, чтобы, когда сервис завершил свою работу, уведомил мою активность, которая зарегистрировала эту трансляцию, и снова запросил. Я считаю, что этот последний шаг не на Virgill Conference, но я уверен, что это хороший путь.

RESTМетод класса

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

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

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

Процессор

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

Пример приложения? Конечно!

Также, если вас интересует тестовое приложение, которое вы смотрите на Eli-G , это может быть не лучший пример, но оно следует подходу Service REST, оно построено с ServiceHelper, Processor, ContentProvider, Загрузчик и Трансляция.

17 голосов
/ 24 января 2012

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

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

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

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

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

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

11 голосов
/ 01 января 2012

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

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

Пожалуйста, прокомментируйте, если вы знаете больше реализаций.

7 голосов
/ 01 октября 2012

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

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

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

Мы действительно ищем отзывы сообщества.

4 голосов
/ 14 апреля 2014

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

Модернизация превращает ваш 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?

3 голосов
/ 29 июля 2012

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

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

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

3 голосов
/ 09 февраля 2011

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

0 голосов
/ 28 января 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...