Нужен пример проекта Android REST Client, в котором реализован шаблон реализации Virgil Dobjanschi REST
Я хочу построить клиент 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 (после публикации), которые ведут меня в нужном мне направлении (сводя к минимуму сложный "шаблон Dobjanschi"):
8 ответов
OverView
Редактировать:
Любой интерес также рассмотреть возможность взглянуть на RESTful Android, это может дать вам лучший взгляд на это.
Из того, как я пытался реализовать модель Добжански, я узнал, что не все написано на камне, и он лишь дает вам представление о том, что делать, это может меняться от приложения к приложению, но формула такова:
Следуйте этим идеям + Добавьте свое собственное = Счастливое приложение для Android
Модель в некоторых приложениях может отличаться от требований, которым некоторые могут не нуждаться в Учетной записи для SyncAdapter, другие могут использовать C2DM, эта, которую я недавно работал, может кому-то помочь:
Создайте приложение, в котором есть Account и AccountManager.
Это позволит вам использовать SyncAdapter для синхронизации ваших данных. Это уже обсуждалось при создании собственного SyncAdapter.
Создайте ContentProvider (если он соответствует вашим потребностям)
Эта абстракция позволяет вам не только обращаться к базе данных, но и обращаться к ServiceHelper для выполнения вызовов REST, поскольку у него есть метод отображения один на один с REST Arch.
Контент-провайдер | Метод ОТДЫХА
запрос ----------------> 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 большую часть времени) и переходит к REST Method с параметрами, передаваемыми от помощника, для чего он хорош? хорошо помните, что Сервис хорош для запуска вещей в фоновом режиме.
Также внедрите BroadCastReceiver, чтобы, когда сервис завершил свою работу, уведомил мою активность, которая зарегистрировала эту трансляцию, и снова запросил. Я верю, что этот последний шаг не на конференции Virgill, но я уверен, что это хороший путь.
REST Method class
Принимает параметры, ресурс WS ( http://myservice.com/service/path) добавляет параметры, все готовит, выполняет вызов и сохраняет ответ.
Если требуется авторизация, вы можете запросить ее в AccountManager. Если вызов службы не удался из-за аутентификации, вы можете сделать недействительным авторизационный токен и повторно получить новый токен.
Наконец, REST Method дает мне либо XML, либо JSON, независимо от того, создаю ли я процессор на основе сопоставителя и передаю ответ.
Процессор
Он отвечает за анализ ответа и вставку его локально.
Образец заявки? Конечно!
Также, если вас интересует тестовое приложение, которое вы смотрите на Eli-G, оно может быть не лучшим примером, но оно следует подходу Service REST, оно построено с использованием ServiceHelper, Processor, ContentProvider, Loader и Broadcast.
Программирование В 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.
"Разработка клиентских REST-приложений для Android" Вирджила Добьянски вызвала много дискуссий, поскольку исходный код не был представлен во время сеанса или был предоставлен впоследствии.
- Ссылочная реализация доступна по http://datadroid.foxykeep.com/ (сеанс Google IO упоминается в разделе / presentation). Это библиотека, которую вы можете использовать в своем собственном приложении.
- Android Priority Job Queue был вдохновлен выступлением Добьянски и звучит очень многообещающе для меня.
Пожалуйста, прокомментируйте, если вы знаете больше реализаций.
Мы разработали библиотеку, которая решает эту проблему: RoboSpice.
В библиотеке используется "сервисный подход", описанный Вирджилом Добянским и Нилом Гудманном, но мы предлагаем комплексное решение "все в одном", которое:
- выполняет асинхронно (в фоновом режиме AndroidService) сетевые запросы, которые будут возвращать POJO (например: REST-запросы)
- кэширует результаты (в Json, Xml, плоских текстовых файлах или двоичных файлах)
- уведомляет ваши действия (или любой другой контекст) о результате запроса сети, если они все еще живы
- не уведомляет ваши действия о результате, если они больше не живы
- уведомляет ваши действия в их теме пользовательского интерфейса
- использует простую, но надежную модель обработки исключений
- поддерживает несколько ContentServices для агрегирования различных результатов веб-сервисов
- поддерживает многопоточность выполнения запросов
- строго типизирован!
- является открытым исходным кодом;)
- и проверено
Мы на самом деле ищем отзывы от сообщества.
Модернизация может быть очень полезна здесь, она создает адаптер для вас из очень простой конфигурации, такой как:
Модернизация превращает ваш 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
вы получаете от дооснащения не является производным от BaseAdapter
Вы должны сделать обертку для него как-то так: вопрос SO Почему мой ListView пуст после вызова setListAdapter внутри ListFragment?
Это немного поздно, но вот статья, которая объясняет первый шаблон из выступления:
http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p
Что мне нравится в первом шаблоне, так это то, что интерфейс к остальным методам является простым классом, а контент-провайдеру остается просто предоставлять доступ к базе данных.
Вам следует проверить исходный код официального приложения Google I/O 2010, для начала, в частности, SyncService и различные классы в подпакете io.
Хорошие новости, ребята. Реализация сервисного помощника доступна здесь: https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper Это проект с открытым исходным кодом (Apache 2). Я в начале проекта. Я выполнил проект, в котором я определил шаблон для выполнения, но я еще не извлек код для создания чистой библиотеки. Это будет сделано в ближайшее время.