Intereting Posts
Recyclerview Изменение элементов во время прокрутки Определить язык IME для клавиатуры на Android Возможно ли программное обеспечение Google отслеживать URL-адрес реферера URL-адреса Google Maps в мобильном браузере, который открывает собственное приложение? Автоматически принимать все лицензии SDK Получить эскиз Uri / путь к изображению, сохраненный в SD-карте + Android Android Parse: не удается обновить локального пользователя Переключение на определенный фрагмент дает странное java.lang.NullPointerException Как изменить цвет заголовка панели действий в коде Индексирование приложений с Ampersand в Deep Link не работает Android checkMarkGravity атрибут CheckedTextView (api 21) Использование класса приложений Android для сохранения данных Android: Анимация Смотреть позицию Multi Выберите <select> на мобильных устройствах Как установить переменную в соответствии с ароматами градиента Android: обнаружит, когда запущено другое действие (или ваша деятельность теряет фокус)

Клиент Android REST, образец?

Даже если этот поток принял ответ, не стесняйтесь предлагать другие идеи, вы используете или как


Я встречал эти статьи:

  • Служба Restful API
  • API-интерфейс Java REST для Android

И это привело меня к этому видеообъявлению Google I / O 2010 о клиентских приложениях REST

  • http://www.youtube.com/watch?v=xHXn3Kg2IQE&feature=player_embedded

С тех пор я создаю компонент REST как статический компонент в классе контроллера приложений.

С этого момента, я думаю, я должен изменить шаблон. Кто-то отметил, что приложение Google IOSched – отличный образец того, как писать клиенты REST на Android. Кто-то еще сказал, что эти способы слишком сложны.

Итак, может ли кто-нибудь показать нам, что является лучшей практикой? Короче и просто.
Приложение IOSched слишком сложное для примера использования.

Solutions Collecting From Web of "Клиент Android REST, образец?"

РЕДАКТИРОВАТЬ:

Первоначальный ответ более чем на полтораста лет во время этого редактирования. Хотя концепции, представленные в первоначальном ответе, по-прежнему сохраняются, как указывают другие ответы, теперь есть библиотеки, которые облегчают задачу для вас. Что еще более важно, некоторые из этих библиотек обрабатывают изменения конфигурации устройства для вас.

Исходный ответ приведен ниже для справки. Но, пожалуйста, также найдите время, чтобы изучить некоторые из клиентских библиотек Rest для Android, чтобы узнать, соответствуют ли они вашим прецедентам. Ниже приведен список некоторых из библиотек, которые я оценил. Он ни в коем случае не должен быть исчерпывающим списком.

  • Волейбол (это от Google)
  • RESTDroid
  • RoboSpice
  • модифицировать

Оригинальный ответ:

Представление моего подхода к использованию клиентов REST на Android. Я не утверждаю, что это лучше всего 🙂 Кроме того, обратите внимание, что это то, что я придумал в ответ на мое требование. Возможно, вам понадобится больше слоев / добавьте больше сложностей, если это требует ваш вариант использования. Например, у меня нет локального хранилища; Потому что мое приложение может терпеть потерю нескольких ответов REST.

Мой подход использует только AsyncTask s под обложками. В моем случае я «вызываю» эти задачи из экземпляра Activity ; Но для полного учета таких случаев, как поворот экрана, вы можете называть их из Service или такого.

Я сознательно выбрал моего клиента REST как API. Это означает, что приложение, использующее мой клиент REST, даже не должно знать о фактических URL-адресах REST и используемом формате данных.

Клиент будет иметь 2 слоя:

  1. Верхний слой. Цель этого слоя – предоставить методы, которые отражают функциональность REST API. Например, у вас может быть один Java-метод, соответствующий каждому URL-адресу в вашем REST API (или даже два – один для GET и один для POST).
    Это точка входа в клиентский API REST. Это слой, который приложение будет использовать нормально. Это может быть синглтон, но не обязательно.
    Ответ вызова REST обрабатывается этим слоем в POJO и возвращается в приложение.

  2. Это уровень AsyncTask более AsyncTask уровня, который использует методы HTTP-клиента, чтобы фактически выйти и сделать этот вызов REST.

Кроме того, я решил использовать механизм обратного вызова для передачи результата AsyncTask s обратно в приложение.

Достаточно текста. Посмотрим теперь на какой-то код. Давайте рассмотрим гипотетический URL-адрес API REST – http://myhypotheticalapi.com/user/profile.

Верхний слой может выглядеть следующим образом:

  /** * Entry point into the API. */ public class HypotheticalApi{ public static HypotheticalApi getInstance(){ //Choose an appropriate creation strategy. } /** * Request a User Profile from the REST server. * @param userName The user name for which the profile is to be requested. * @param callback Callback to execute when the profile is available. */ public void getUserProfile(String userName, final GetResponseCallback callback){ String restUrl = Utils.constructRestUrlForProfile(userName); new GetTask(restUrl, new RestTaskCallback (){ @Override public void onTaskComplete(String response){ Profile profile = Utils.parseResponseAsProfile(response); callback.onDataReceived(profile); } }).execute(); } /** * Submit a user profile to the server. * @param profile The profile to submit * @param callback The callback to execute when submission status is available. */ public void postUserProfile(Profile profile, final PostCallback callback){ String restUrl = Utils.constructRestUrlForProfile(profile); String requestBody = Utils.serializeProfileAsString(profile); new PostTask(restUrl, requestBody, new RestTaskCallback(){ public void onTaskComplete(String response){ callback.onPostSuccess(); } }).execute(); } } /** * Class definition for a callback to be invoked when the response data for the * GET call is available. */ public abstract class GetResponseCallback{ /** * Called when the response data for the REST call is ready. <br/> * This method is guaranteed to execute on the UI thread. * * @param profile The {@code Profile} that was received from the server. */ abstract void onDataReceived(Profile profile); /* * Additional methods like onPreGet() or onFailure() can be added with default implementations. * This is why this has been made and abstract class rather than Interface. */ } /** * * Class definition for a callback to be invoked when the response for the data * submission is available. * */ public abstract class PostCallback{ /** * Called when a POST success response is received. <br/> * This method is guaranteed to execute on the UI thread. */ public abstract void onPostSuccess(); } 

Обратите внимание, что приложение не использует JSON или XML (или любой другой формат), возвращенный API REST напрямую. Вместо этого приложение видит только Profile боба.

Затем нижний слой (слой AsyncTask) может выглядеть так:

 /** * An AsyncTask implementation for performing GETs on the Hypothetical REST APIs. */ public class GetTask extends AsyncTask<String, String, String>{ private String mRestUrl; private RestTaskCallback mCallback; /** * Creates a new instance of GetTask with the specified URL and callback. * * @param restUrl The URL for the REST API. * @param callback The callback to be invoked when the HTTP request * completes. * */ public GetTask(String restUrl, RestTaskCallback callback){ this.mRestUrl = restUrl; this.mCallback = callback; } @Override protected String doInBackground(String... params) { String response = null; //Use HTTP Client APIs to make the call. //Return the HTTP Response body here. return response; } @Override protected void onPostExecute(String result) { mCallback.onTaskComplete(result); super.onPostExecute(result); } } /** * An AsyncTask implementation for performing POSTs on the Hypothetical REST APIs. */ public class PostTask extends AsyncTask<String, String, String>{ private String mRestUrl; private RestTaskCallback mCallback; private String mRequestBody; /** * Creates a new instance of PostTask with the specified URL, callback, and * request body. * * @param restUrl The URL for the REST API. * @param callback The callback to be invoked when the HTTP request * completes. * @param requestBody The body of the POST request. * */ public PostTask(String restUrl, String requestBody, RestTaskCallback callback){ this.mRestUrl = restUrl; this.mRequestBody = requestBody; this.mCallback = callback; } @Override protected String doInBackground(String... arg0) { //Use HTTP client API's to do the POST //Return response. } @Override protected void onPostExecute(String result) { mCallback.onTaskComplete(result); super.onPostExecute(result); } } /** * Class definition for a callback to be invoked when the HTTP request * representing the REST API Call completes. */ public abstract class RestTaskCallback{ /** * Called when the HTTP request completes. * * @param result The result of the HTTP request. */ public abstract void onTaskComplete(String result); } 

Вот как приложение может использовать API (в Activity или Service ):

 HypotheticalApi myApi = HypotheticalApi.getInstance(); myApi.getUserProfile("techie.curious", new GetResponseCallback() { @Override void onDataReceived(Profile profile) { //Use the profile to display it on screen, etc. } }); Profile newProfile = new Profile(); myApi.postUserProfile(newProfile, new PostCallback() { @Override public void onPostSuccess() { //Display Success } }); 

Я надеюсь, что комментариев достаточно, чтобы объяснить дизайн; Но я был бы рад предоставить дополнительную информацию.

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

Единственная эталонная реализация, которую я знаю (просьба прокомментировать, если вы знаете больше), доступна в Datadroid (упоминается в разделе / ​​презентация Google IO). Это библиотека, которую вы можете использовать в своем приложении.

Вторая ссылка запрашивает «наилучшую» структуру REST, которая в значительной степени обсуждается в stackoverflow. Для меня важно размер приложения, за которым следует производительность реализации.

  • Обычно я использую обычную реализацию org.json, которая является частью Android с уровня API 1 и, следовательно, не увеличивает размер приложения.
  • Для меня очень интересной была информация, найденная на JSON-синтаксическом анализаторе в комментариях: по состоянию на Android 3.0 Honeycomb потоковый парсер GSON включен как android.util.JsonReader. К сожалению, комментарии больше не доступны.
  • Spring Android (который я иногда использую) поддерживает Jackson и GSON. Документация модуля Spring Android RestTemplate указывает на пример приложения .

Поэтому я придерживаюсь org.json или GSON для сложных сценариев. Для архитектуры реализации org.json я использую статический класс, который представляет примеры использования сервера (например, findPerson, getPerson). Я вызываю эту функцию из службы и использую классы утилиты, которые выполняют сопоставление (конкретный проект) и сетевой IO (мой собственный шаблон REST для простого GET или POST). Я стараюсь избегать использования рефлексии.

Никогда не используйте AsynTask для выполнения сетевого запроса или того, что необходимо сохранить. Задача Async тесно связана с вашей деятельностью, и если пользователь изменит ориентацию экрана с момента создания приложения, AsyncTask будет остановлен.

Я предлагаю вам использовать Service pattern с Intent Service и ResultReceiver. Взгляните на RESTDroid . Это библиотека, которая позволяет вам выполнять любой запрос REST асинхронно и уведомлять свой пользовательский интерфейс с помощью List Listeners, реализующих шаблон обслуживания Вергилия Добжански.

Существует еще одна библиотека с гораздо более чистым API и безопасными типами данных. https://github.com/kodart/Httpzoid

Вот простой пример использования

 Http http = HttpFactory.create(context); http.post("http://example.com/users") .data(new User("John")) .execute(); 

Или сложнее с обратными вызовами

 Http http = HttpFactory.create(context); http.post("http://example.com/users") .data(new User("John")) .handler(new ResponseHandler<Void>() { @Override public void success(Void ignore, HttpResponse response) { } @Override public void error(String message, HttpResponse response) { } @Override public void failure(NetworkError error) { } @Override public void complete() { } }).execute(); 

Он свежий, но выглядит очень многообещающим.

Там много библиотек, и я использую этот: https://github.com/nerde/rest-resource . Это было создано мной, и, как вы можете видеть в документации, это намного проще и проще, чем другие. Он не ориентирован на Android, но я использую его, и он работает очень хорошо.

Он поддерживает HTTP Basic Auth. Он выполняет грязную работу по сериализации и десериализации объектов JSON. Вам понравится, особенно если ваш API – это Rails.

Отказ от ответственности: я участвую в проекте open2mobile open source

Другой альтернативой клиенту REST является использование rest2mobile .

Этот подход несколько отличается, поскольку он использует конкретные примеры отдыха для генерации кода клиента для службы REST. Код заменяет URL-адрес REST и JSON полезными данными с помощью собственных методов Java и POJO. Он также автоматически обрабатывает соединения с сервером, асинхронные вызовы и POJO в / из конверсий JSON.

Обратите внимание, что этот инструмент поставляется в разных вариантах (cli, plugins, android / ios / js), и вы можете использовать плагин android studio для создания API непосредственно в своем приложении.

Весь код можно найти здесь на github .