Статья опубликована в рамках: Научного журнала «Студенческий» № 2(46)
Рубрика журнала: Информационные технологии
Скачать книгу(-и): скачать журнал часть 1, скачать журнал часть 2
ИСПОЛЬЗОВАНИЕ БИБЛИОТЕКИ RETROFIT 2 ДЛЯ СЕТЕВОГО ВЗАИМОДЕЙСТВИЯ ПРИЛОЖЕНИЙ НА ОС ANDROID
В наше время у многих сайтов имеются собственные API для предоставления доступа к своим данным. Самые распространённые варианты на сегодняшний день - это JSON и XML.
Библиотека Retrofit упрощает взаимодействие с REST API сайта, беря на себя часть рутинной работы.
Библиотекой удобно пользоваться для запроса к различным веб-сервисам с командами GET, POST, PUT, DELETE. Может работать в асинхронном режиме, что избавляет от лишнего кода.
Подключается стандартно в Gradle.
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
Библиотека работает с данными JSON и XML, используя конвертеры, которые следует указывать в Gradle.
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
Для работы с Retrofit понадобятся три класса.POJO (Plain Old Java Object) или Model Class - json-ответ от сервера нужно реализовать как модель.
- Retrofit - класс для обработки результатов. Ему нужно указать базовый адрес в методе baseUrl().
- Interface - интерфейс для управления адресом, используя команды GET, POST и т.д.
Работу с Retrofit можно разбить на отдельные задачи.
Задача первая. POJO
Проанализировать JSON (или другой формат) ответ от сайта и на его основе реализовать класс POJO.
POJO удобно создавать с помощью специальных веб-сервисов, преобразуя данные JSON или XML в готовый класс.
Задача вторая. Интерфейс
Реализовать интерфейс и указать имя метода.
В интерфейсе задаются запросы для отправки на сервер. Команда комбинируется с адресом сайта и получается полный путь к необходимому ресурсу.
Запросы размещаются в классе Call с необходимым типом данных.
import retrofit2.Call;
public interface APIServ {
@POST("list")
Call<Repo> loadRep();
}
С помощью аннотаций указываются веб-команды, а затем метод. В аннотации используются два метода, один для сервера, второй - это ваш собственный метод.
@GET("get_all_cats") // команда сервера
List<Cat> getAllCat(); // ваш метод
Аннотация @Query используется для запросов с дополнительными параметрами. Допустим, у запроса есть дополнительный параметр, который выводит отсортированный список элементов: http://example.com/api/v1/products/cats?sort=desc.
@GET("products/cats?category=5&sort=desc")
Call<Cats> getAllCat();
В нашем запросе есть ещё один параметр, отвечающий за категорию, которая меняется в зависимости от логики приложения. К этому параметру можно добавить аннотацию и управлять им в коде.
@GET("products/cats?sort=desc")
Call<Cats> getAllCat(@Query("category") int categoryId);
Мы оставили ортировку как есть, а категорию перенесли в параметры метода под именем categoryId, добавив аннотацию, с которой параметр будет обращаться на сервер в составе запроса.
Call<Cats> getAllCat() = catAPIServ.getAllCat(5);
В результате, получится запрос: http://example.com/api/v1/products/cats?sort=desc&category=5.
Задача третья. Retrofit
Для синхронного запроса используйте метод Call.execute(), для асинхронного - метод Call.enqueue().
Объект для запроса к серверу создаётся в простейшем случае следующим образом:
public static final String BASE_URL = "http://api.example.com/";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
В итоге мы получили объект Retrofit, содержащий базовый URL и способность преобразовывать JSON-данные с помощью указанного конвертера Gson.
Далее в его методе create() указываем наш класс интерфейса с запросами к сайту.
UserService userService = retrofit.create(UserService.class);
После этого мы получаем объект Call и вызываем метод enqueue() (для асинхронного вызова) и создаём для него Callback. Запрос будет выполнен в отдельном потоке, а результат придет в Callback в main-потоке.
В результате библиотека Retrofit сделает запрос, получит ответ и произведёт разбор ответа, раскладывая по полочкам данные. Вам остаётся только вызывать нужные методы класса-модели для извлечения данных.
Основная часть работы происходит в onResponse(), ошибки выводятся в onFailure().
Метод onResponse() вызывается всегда, даже если запрос был неуспешным. Класс Response имеет удобный метод isSuccessful() для обработки успешных запросов.
Можно написать такую конструкцию.
// код 200
if (response.isSuccessful()) {
... //
код
для
успешного
случая
} else {
switch(response.code()) {
case 404:
//
страница
не
найдена
.
можно
использовать
ResponseBody,
см
.
ниже
break;
case 500:
// ошибка на сервере. можно использовать ResponseBody, см. ниже
break;
}
// или
// Также можете использовать ResponseBody для получения текста ошибки
ResponseBody errorBody = response.errorBody();
try {
mTextView.setText(errorBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
Чтобы отменить запрос, используйте метод Call.cancel().
Список литературы:
- Retrofit: A type-safe HTTP client for Android and Java [Электронный курс]. – Режим доступа: http://square.github.io/retrofit/ (дата обращения: 27.11.2018).
- Хабр: Изучаем Retrofit 2 [Электронный курс]. – Режим доступа: https://habr.com/post/314028/ (дата обращения: 27.11.2018).
- Baeldung: Introduction to Retrofit [Электронный курс]. – Режим доступа: https://www.baeldung.com/retrofit/ (дата обращения: 27.11.2018).
Оставить комментарий