Я хочу создать 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 (после публикации этого), которые ведут меня в нужном мне направлении (минимизируя сложный «шаблон Добьянски»):
источник
Ответы:
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.
источник
В «Программировании Android» есть целая глава (13. Изучение поставщиков контента), посвященная «Варианту Б: использование ContentProvider API» из выступления Вирджила по вводу-выводу Google.
Настоятельно рекомендуется.
Программирование под Android Зигурдом Медниексом, Лэрдом Дорнином, Дж. Блейком Мейке и Масуми Накамурой. Авторские права 2011 O'Reilly Media, Inc., 978-1-449-38969-7.
источник
«Разработка клиентских приложений Android REST» Вирджила Добьянски вызвала много споров, поскольку исходный код не был представлен во время сеанса и не был предоставлен впоследствии.
Прокомментируйте, если вам известны другие реализации.
источник
Мы разработали библиотеку, которая решает эту проблему: RoboSpice .
В библиотеке используется «сервисный подход», описанный Вирджилом Добьянски и Нилом Гудманном , но мы предлагаем комплексное решение, которое:
На самом деле мы ждем отзывов от сообщества.
источник
Модернизация может быть здесь очень полезной, она создает для вас адаптер из очень простой конфигурации, например:
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?источник
Это немного поздно, но вот статья, которая объясняет первый паттерн из выступления:
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). Я в самом начале проекта. Я выполнил проект, в котором я определил шаблон, который нужно сделать, но я еще не извлек код, чтобы создать чистую библиотеку. Скоро это будет сделано.
источник