Потрібен зразок проекту клієнта Android REST, який реалізує шаблон реалізації Virgil Dobjanschi 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();

Звернувшись до презентації " Розробка клієнтських програм для Android REST " від Віргілія Добянщи, я дізнався, що не є гарною ідеєю обробляти запит REST у робочій темі діяльності. Натомість я повинен використовувати службовий API.

Мені подобається ідея мати Singleton ServiceHelper, який прив'язується до (Місцевої) Служби, але я боюся, що я не зрозумів концепцію Служби правильно.

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

Напевно, у мене є багато інших проблем із розумінням, тому найкращим для мене буде зразок програми, яка відповідає моїм потребам. Мій варіант використання не є незвичним, і я сподіваюся, що там є приклад програми.

Будь ласка, дай мені знати!

Будь-які інші пропозиції, які вказують мені на правильний напрямок реалізації, також корисні (Демонстрація Android API не відповідає моєму варіанту використання).

Заздалегідь спасибі.

Клаус

РЕДАГУВАТИ : Подібні теми, знайдені на SO (після публікації цього), які ведуть мене в потрібному напрямку (мінімізуючи складний "шаблон Добянщи"):


1
Claszen, Чи отримували Ви якусь думку щодо єдиного сервісу для всіх запитів проти спеціальних служб для кожного запиту? Якщо так, будь ласка, поділіться. Сценарій у моєму випадку: у мене є багато запитів REST [близько 20] для використання в моєму додатку. Я спостерігав за цінним сеансом в Google I / O, згаданому вище. Моє питання полягає в тому, який кращий підхід. Щоб одна служба обробляла всі запити в одній службі? або мати спеціальний сервіс для кожного із запитів? У мене є деякі запити, які слід запускати послідовно, а деякі з них можна запускати одночасно. Будь-які пропозиції ?

@ user778869 Нарешті я використав по одному IntentService та ResultReceiver для кожного («верхнього рівня») REST-ресурсу (наприклад, «компанія», «клієнт»). Я виявив, що це якась „природна” структура і працює добре. Це може спричинити дублювання коду, але запобігає занадто інтенсивному використанню структур управління, якщо це робиться все в одній службі.
FrVaBe

Це може бути дуже корисно для людей, які навчаються реалізації клієнта Android REST. Презентація Добянскі перекладена в PDF: drive.google.com/file/d/0B2dn_3573C3RdlVpU2JBWXdSb3c/…
Кей Зед

Відповіді:


50

Перегляд

Редагувати:

Будь-хто, хто цікавиться, також може поглянути на RESTful android, це може дати вам кращий погляд на нього.

Те, що я дізнався з досвіду спроб реалізації Добянські моделі, це те, що не все написано в камені, і він лише дасть вам огляд того, що робити, це могло змінюватися від програми до програми, але формула:

Дотримуйтесь цих ідей + Додайте власну = Щаслива програма для Android

Модель деяких програм може відрізнятися від вимоги, деяким може не знадобитися Обліковий запис для SyncAdapter, інші можуть використовувати C2DM, ця, над якою я нещодавно працював, може комусь допомогти:


Створіть програму, яка має Account і AccountManager

Це дозволить вам використовувати SyncAdapter для синхронізації даних. Це було обговорено у розділі Створення власного SyncAdapter

Створіть ContentProvider (якщо він відповідає вашим потребам)

Ця абстракція дозволяє не тільки отримати доступ до бази даних, але й перейти до ServiceHelper для виконання REST-викликів, оскільки вона має метод зіставлення один на один з REST Arch.

Постачальник вмісту | Метод REST

запит ----------------> ОТРИМАТИ

вставити ----------------> ВСТАНОВИТИ

оновити ----------------> POST

видалити ----------------> ВИДАЛИТИ

ServiceHelper Layering

Цей хлопець в основному запустить службу (служби), яка виконуватиме 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, щоб після завершення роботи служби повідомити мою активність, яка зареєструвала цю трансляцію, і повторно зробити запит. Я вважаю, що цей останній крок не стосується конференції Virgill, але я впевнений, що це хороший шлях.

Клас RESTMethod

Бере параметри, ресурс WS ( http://myservice.com/service/path ) додає параметри, готує все, виконує виклик та зберігає відповідь.

Якщо потрібен аутентокен, ви можете отримати запит у менеджера облікових записів. Якщо виклик служби не вдався через аутентифікацію, ви можете зробити недійсним аутентокен і повторно авторизувати, щоб отримати новий маркер.

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

Процесор

Він відповідає за аналіз відповіді та вставку її локально.

Зразок програми? Звичайно!

Крім того, якщо ви цікавитесь тестовим додатком, ви дивитесь на Eli-G , це може бути не найкращим прикладом, але він дотримується підходу Service REST, він побудований за допомогою ServiceHelper, Processor, ContentProvider, Loader та Broadcast.


Дякую за вашу відповідь. Нарешті я використав по одному IntentService та ResultReceiver для кожного («верхнього рівня») REST-ресурсу (наприклад, «компанія», «клієнт»). Модель Добянщи була для мене занадто важкою.
FrVaBe

ну b, використовуючи IntentService та ResultReseiver, ви, мабуть, використовуєте перший сценарій опису, який є керованою послугами моделлю, хоча він використовує Binder замість ResultReceiver для зв'язку, але це добре, як я вже казав, не написано в камені !.
Necronet

Деякий час тому я задав питання і знайшов відповідне рішення. Я не мав можливості перевірити всі посилання на зразки додатків, але оскільки це найпопулярніша відповідь, я прийму її. Тим не менше, я рекомендую також перевірити всі інші відповіді.
FrVaBe

Відмінне наведення, перевірте всі відповіді, всі вони мають багато хороших ресурсів та ідей !! як Джеремі з програмованою книгою для Android Yoni з перезаписаним джерелом.
Necronet

@Necronet привіт, щойно натрапив на ваш перспективний зразок програми, однак у мене виникають проблеми зі створенням. Не могли б ви повідомити нам, проти якої версії ActionBarSherlock вона повинна бути побудована (здається, вона не працює з найновішою системою ABS 4.1)? Крім того, з вашого допису я насправді не дізнався, до якого зразка (А, В чи С) з моделей Доб'янчі ви прагнули (я знаю, ви, мабуть, опинилися з деякими варіаціями, але, гадаю, ви в основному зосереджувались на одному з візерунки - я припускаю, шаблон B?) Дякую!
vaiomike

17

Програмування Android має повну главу (13. Дослідження постачальників вмісту), присвячену «Варіанту B: Використовуйте API ContentProvider» з розмови Google I / O Virgil.

Ми не єдині, хто бачимо переваги такого підходу. На конференції вводу-виводу Google у травні 2010 р. Віргілій Добянскі з Google виступив з доповіддю, в якій виклав наступні три моделі використання провайдерів контенту для інтеграції веб-служб RESTful в програми для Android ...

У цьому розділі ми детально вивчимо другий шаблон на нашому другому прикладі відео Finch; ця стратегія дасть ряд важливих переваг для ваших програм. Завдяки елегантності, з якою цей підхід інтегрує мережеві операції в Android MVC, ми дали йому такий псевдонім «Мережевий MVC».

У майбутньому випуску Programming Android можна розглянути інші два підходи, а також задокументувати більше деталей цієї презентації Google. Після того, як ви закінчите читати цей розділ, пропонуємо переглянути перегляд Google.

Настійно рекомендується.

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


11

"Розробка клієнтських додатків для Android REST" Віргілія Добянскі призвела до багатьох дискусій, оскільки жоден вихідний код не був представлений під час сесії або наданий пізніше.

Будь ласка, коментуйте, якщо вам відомо більше реалізацій.


Дякуємо, що поділились цим, мабуть, корисним посиланням (не маєте можливості поглянути глибше на даний момент)
FrVaBe

Це виглядає як рішення. Дякую !
Вінсент Кантін

7

Ми розробили бібліотеку, яка розглядає цю проблему: RoboSpice .

Бібліотека використовує "підхід до обслуговування", описаний Вірджилом Добянскі та Нілом Гудманом , але ми пропонуємо повне рішення "все в одному", яке:

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

Ми насправді шукаємо зворотного зв'язку з громадою.


4

Модернізація може бути тут дуже корисною, вона створює адаптер для вас із дуже простої конфігурації, наприклад:

Модернізація перетворює ваш 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 = restAdapter.create (GitHubService.class); Кожен виклик згенерованого GitHubService робить HTTP-запит на віддалений веб-сервер.

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

для отримання додаткової інформації відвідайте офіційний сайт: http://square.github.io/retrofit/

Примітка : адаптер, який RestAdapterви отримуєте від Retrofit, не є похідним, BaseAdapterви повинні зробити для нього обгортку якось як це запитання SO Чому мій ListView порожній після виклику setListAdapter всередині ListFragment?


Чи можете ви опублікувати повний приклад виклику служби відпочинку, як api.icndb.com/jokes/random
exequielc

3

Це трохи запізно, але ось стаття, яка пояснює перший зразок з виступу:

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

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


3

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


+1 Насправді це не мій варіант використання, але в будь-якому випадку хороший і корисний приклад додатка Android. Дякую!
FrVaBe

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.