REST. Описание концепции. Особенности реализации API. Максимально кратко.
Что такое REST?
REST - (сокр. от англ. Representational State Transfer — «передача состояния представления») архитектурный стиль взаимодействия компонентов распределённого приложения в сети по модели клиент-сервер. Был разработан в диссертации Роя Филдинга в 200 году, как альтернатива SOAP, когда запрос клиента несет в себе исчерпывающую информацио о желаемом ответе сервера и сервер не обязан сохранять сессию взаимодействия с клиентом.
Особенности архитектурного стиля:
- Каждая сущность должна иметь уникальный идентификатор – URI.
- Сущности должны быть связаны между собой.
- Для чтения и изменения данных должны использоваться стандартные методы.
- Должна быть поддержка нескольких типов ресурсов.
- Взаимодействие должно осуществляться без состояния.
Стандартные методы таковы:
- GET – получение данных без их изменения. Это наиболее популярный и легкий метод. Он только возвращает данные, а не изменяет их, поэтому на клиенте вам не нужно заботиться о том, что вы можете повредить данные.
- POST – метод, подразумевающий вставку новых записей.
- PUT – метод, подразумевающий изменение существующих записей.
- PATCH – метод, подразумевающий изменение идентификатора существующих записей.
- DELETE – метод, подразумевающий удаление записей.
Что такое REST-API?
REST API – это набор удаленных вызовов стандартных методов, возвращающих данные в определенном формате.
Где используется стиль REST в Android?
1) См. реализации различных библиотек REST-клиентов, например: Retrofit, Volley, RoboSpice… См. статью Volley vs Retrofit
Задачи, которые требуется решить при реализации REST-клиента
Перечислим, какие основные задачи придется решать при реализации REST-клиента на Android согласно паттернам Virgil Dobjanschi (Это так называемые паттерны A/B/C, которые описывают способы реализации REST-клиента под Android. Подробней о паттернах на русском можно глянуть здесь (лекция 2) или здесь):
- Управление сервисом: запуск, остановка.
- Передача результатов из сервиса в активити.
- Кэшировать результатов в sqlite.
- Фиксирование статуса данных sqlite перед и после выполнения REST-запроса.
- Запись информации о проводимых REST-операциях в sqlite.
- Парсинг полученных данных.
- Конструирование REST-запроса на основе URI и набора параметров.
- Выполнение сетевых запросов к REST-серверу.
- Чистка базы данных от устаревших данных.
- В случае неудачи REST-запроса, пытаться повторить запрос (например, экспоненциально увеличивая время между запросами).
- Возможность отложенного запуска REST-запроса через SyncAdapter.
Некоторые важные моменты для реализации REST-клиента под Android, согласно паттернам A/B/C
- Данные, полученные от REST-сервера, всегда сохраняются в sqlite. Напрямую в Activity они никогда не передаются. Вместо этого в Activity передается уведомление о том, что данные загружены в sqlite и их можно оттуда загрузить (вариант - Activity получает уведомление об обновлении данных в Content Provider через Content Observer).
- При выполнении операций insert, delete, update данные в sqlite обновляются дважды: первый раз до отправки REST-запроса, второй раз - после получения результата. Первая операций выставляет информационные флаги, сигнализирующие о типе операции, проводимой над данными, и о статусе операции.
- REST-методы следует всегда выполнять в отдельном потоке.
- Следует использовать Apache HTTP client, а не Java URL connection.
- Форматы данных в порядке предпочтения: какой-либо бинарный формат (например, AMF3), затем JSON, затем XML.
- Желательно включать gzip. GZip на Android реализован “нативно”, библиотека быстрая. В некоторых случаях можно получить коэффициент сжатия 5:1 и даже 10:1, в зависимости от количества получаемых данных. Использование GZip ускоряет загрузку данных и экономит батарею.
- Если используете Sqlite - используйте транзакции.
- Если программе требуется скачать 10-20 картинок, не стоит запускать 10-20 параллельных закачек. Запускайте 1-3, а остальные ставьте в очередь.
- Activity регистрирует binder callback (т.е. ResultReceiver), для получения ответа от сервиса. Этот callback нужно обязательно удалить при вызове onPause у Activity, иначе можно налететь на ANR.
- Длительные операции всегда следует запускать из сервиса. Сервис обязательно следует останавливать после того, как требуемые операции выполнены.
- Необходимо минимизировать сетевой трафик.
- Следует разбивать данные на страницы (конечно, если REST Api предоставляют такую возможность).
- Для некритичной по времени синхронизации данных между клиентом и сервером рекомендуется использовать SyncAdapter.
Алгоритм фомирования запроса к серверу
В общем случае, при выполнении запроса к REST-серверу, требуется выполнить ряд операций:
- сформировать URL
- задать HTTP-заголовки
- выбрать тип HTTP-запроса
- сформировать тело HTTP-запроса, т.е. преобразовать Java объект в JSON
- выполнить запрос, воспользовавшись HTTP-клиентом
- распарсить результаты запроса - преобразовать полученный JSON в Java объект