Программирование • 29 января 2024 • 5 мин чтения

Как библиотека Retrofit 2 решает сетевые трудности перевода

Библиотеки берут на себя рутину, ускоряют разработку и делают код чище. Пример такого инструмента — Retrofit. Разберём, как он помогает Android-разработчикам.

Описание Retrofit

Retrofit — это библиотека, которая упрощает работу с сетевыми запросами в приложениях на Android. Например, с этим инструментом можно настроить работу приложения с погодой. Разработчик задаёт параметры запросов, которые должны поступать на сервер и забирать данные по температуре в разных городах. Всё остальное происходит автоматически. В итоге пользователь видит актуальные данные каждый раз, когда открывает приложение.

Без библиотеки пришлось бы обрабатывать запросы к серверу вручную. Retrofit избавляет разработчиков от этой рутины в пользу более творческих задач. Например, проработки логики приложения. Вот как работает Retrofit:

Уменьшает объём кода. С Retrofit не нужно с нуля настраивать каждый сетевой запрос. Инструмент предоставляет интерфейс, в котором разработчик указывает параметры для каждого запроса, а Retrofit берёт на себя создание кода.
Поддерживает асинхронные запросы. В современных мобильных приложениях сетевые запросы выполняют асинхронно. В этом случае часть контента подгружается в фоновом режиме, но пользователь может работать с приложением, а не ждать, пока вся страница загрузится. Retrofit упрощает этот процесс с помощью колбэков. С этими функциями программа забирает результаты асинхронных операций, когда они становятся доступными, и не зависает в ожидании ответа от сервера.
Поддерживает Coroutines. Корутины — это функции или блоки кода на Kotlin, которые помогают приложению выполнять асинхронные запросы. Их можно использовать и без Retrofit 2, но в сочетании с библиотекой код асинхронного запроса получится более лаконичным и читабельным. В этом заслуга suspend-функций. Разработчик вызывает их из корутины и таким образом даёт приложению инструкцию: останавливать выполнение кода во время асинхронной операции и продолжить работу, когда придёт ответ от сервера. В этом случае можно обойтись без колбэков в коде.
Обрабатывает JSON (JavaScript Object Notation) — формат основных типов данных, которыми приложение обменивается с сервером. Например, строк, чисел, массивов, объектов. JSON поддерживает большинство языков программирования, поэтому считается универсальным форматом обмена данными.
Когда приложение отправляет запрос не сервер, данные часто приходят в формате JSON. Retrofit преобразует их в объекты, понятные приложению. Теперь оно может использовать эти объекты, чтобы, например, обновить что-то в интерфейсе. Если не использовать библиотеку, разработчику придётся выполнять роль посредника в обмене данными.

В 2015 году появилась обновлённая версия библиотеки — Retrofit 2. Она позволяет более гибко настраивать запросы и писать более чистый и понятный код. Это ценно для новичков, которые только начинают изучать разработку под Android. На курсе «Android-разработчик» Retrofit осваивают вместе с другими библиотеками и учатся выбирать подходящий под задачу инструмент.

Подключение Retrofit в проекте

Большинство Android-приложений разрабатывают на Kotlin. Самый простой способ подключить Retrofit на этом языке — с помощью системы управления зависимостями Gradle. В Android-разработке зависимости — это библиотеки, то есть куски кода, написанные другими разработчиками, которые приложение будет использовать. Gradle — стандарт в мире Android. С ним библиотеки автоматически скачиваются и обновляются.

Чтобы добавить зависимости, используем команду implementation в блоке dependencies файла build.gradle.

Чтобы Retrofit могла конвертировать данные JSON в объекты, понятные для Java, с помощью команды implementation следом добавляют библиотеку Gson

Настройка Retrofit

Чтобы выполнять сетевые запросы, нужно создать объект Retrofit с указанием базового URL и настроить правила, по которым приложение с сервером будут обмениваться данными. В разработке это называется программным интерфейсом — Application Programming Interface. Разберём каждый шаг:

1. Создание объекта Retrofit — это как наём профессионального переговорщика, который будет общаться с сервером. Чтобы он правильно выполнил запрос, нужно его проинструктировать.

Код для создания объекта Retrofit. Указываем, где находится сервер (базовый URL) и какие данные ожидаем (конфигурации)

Разбираем код:

.baseUrl ("https://api.thecatapi.com/") — эта строка указывает базовый URL. Все последующие запросы будут строиться на основе этого адреса. Когда разработчик захочет написать запрос к конкретному разделу, он определит конечную точку для него. Например, это может быть /images/search. Retrofit автоматически добавит конечную точку к базовому URL, и получится https://api.thecatapi.com//images/search.
С помощью addConverterFactory(GsonConverterFactory.create()) говорим Retrofit использовать библиотеку Gson для преобразования данных в формат JSON и обратно. В разработке это значит — добавить конфигурации.

2. Настройка интерфейса API. Программный интерфейс — это договорённость между приложением и сервером, на котором хранятся данные. Он описывает, как приложение будет взаимодействовать с сервером. В этом интерфейсе разработчик определяет методы или функции для сетевых запросов. Например, метод getData() может быть использован для запроса данных с сервера. Приложение может отправлять на сервер разные запросы: получить данные, добавить их, удалить. Чтобы уточнить тип запроса, используют аннотации — специальные пометки в коде. Например, аннотация @GET перед методом указывает, что это GET-запрос для получения информации с сервера. Аннотация @POST укажет на то, что запрос предназначен для отправки данных на сервер.

После настройки объекта Retrofit и интерфейса API можем использовать их для сетевых запросов

Пример простой реализации

Представим, что у нас есть приложение, в котором публикуют мемы с котами. Используем Retrofit, чтобы подгружать новые посты в ленте, когда пользователь заходит в приложение:

1. Открываем файл build.gradle и добавляем зависимости

Кроме самого Retrofit нам нужно подключить конвертер Gson, чтобы работать с JSON-данными

2. Создаём класс для представления данных

У каждого кота есть уникальный номер (id) и адрес, по которому можно получить его картинку (url). Создание класса Cat — это способ сказать компьютеру, что мы хотим хранить эти два вида информации. Теперь можно создавать условные коробки для каждого котика и складывать в них id и url.

В контексте класса Cat, val id: String означает, что у каждого котика есть уникальный идентификатор (id), который нельзя изменить после создания

3. Создаём интерфейс для API

Интерфейс CatApi — это наш запрос к серверу, где чётко описано, какие данные нужны и каким образом нужно их получить. Так сервер, как официант в ресторане, поймёт заказ и принесёт нужные блюда.

В интерфейсе указываем, что нужно выполнить HTTP GET-запрос по определённому пути (адресу) на сервере и выдать список (List) котиков в ответ

Разберём код подробнее:

● interface CatApi — определение интерфейса, который будет предоставлять методы для работы с API.
● @GET("v1/images/search?limit=1&category_ids=5") — аннотация Retrofit, которая указывает, что метод getCat выполняет HTTP GET-запрос по указанному пути.
● fun getCat(): Call<List<Cat>> — определение функции (метода) getCat, который возвращает объект типа Call с параметризированным типом List<Cat>.
● Call<List<Cat>> — тип возвращаемого значения, где List<Cat> означает, что мы ожидаем получить список котиков от API.

4. Создаём объект Retrofit и CatApi

Чтобы сказать объекту Retrofit, что нужно забрать с сервера, создаём объект CatApi. На шаге 3 мы создали интерфейс CatApi, который служит как контракт между приложением и сервером. Объект CatApi — это исполнитель этих правил (выполнение запроса) для использования в конкретном месте кода.

Код для создания объекта Retrofit и CatApi

Разбираем код подробнее:

.baseUrl ("https://api.thecatapi.com/") — указываем базовый URL для API. Этот URL будет использоваться для всех запросов.
.addConverterFactory (GsonConverterFactory.create()) — добавляем конвертер для работы с данными в формате JSON, используя библиотеку Gson.
val catApi: CatApi = retrofit.create(CatApi::class.java) — говорим Retrofit создать объект, который поможет приложению отправлять запросы и получать ответы от API. Например, вызывать метод getCat() для получения котиков.

5. Выполняем запрос асинхронно

Во время асинхронного запроса приложение не блокируется в ожидании ответа от сервера. Пока данные по одним картинкам подгружаются, пользователь может просматривать другие посты. Если запрос успешен, приложение обновляет интерфейс. Например, отображает заголовок поста на экране или картинку. Если запрос завершился ошибкой, приложение может уведомить об этом пользователя. Например, предложит повторить запрос или перезагрузить программу.

Этот участок кода отвечает за выполнение асинхронного запроса к серверу для получения информации о котиках и обработку полученных данных

Что используем в коде:

catApi.getCat().enqueue(object : Callback<List<Cat>> { ... }) — вызывает метод getCat() из объекта catApi, добавляет запрос в очередь для асинхронного выполнения и использует анонимный объект для обработки ответа и ошибки.
override fun onResponse(...) { ... } — переопределяем метод onResponse интерфейса Callback. Метод onResponse отвечает за обработку ответа от сервера после асинхронного запроса. Например, при успешном ответе приложение будет загружать изображение кота.
response.body()?.takeIf { it.isNotEmpty() }?.get(0)?.let { cat -> ... } — проверяем, есть ли данные. Если список не пустой, берём изображение первого кота и загружаем. Если пустой — выводим сообщение, что данных нет.
override fun onFailure(...) { ... } — переопределяем метод onFailure по такому же принципу, как onResponse.

Готово. Теперь приложение будет загружать изображения с котами. Если для отображения каких-то картинок потребуется больше времени, пользователь всё равно может листать ленту, а не ждать загрузки всей страницы.

Совет эксперта

Сергей Сорокин

Android-разработчикам при создании приложений вряд ли когда-нибудь придётся выполнять сетевые запросы без использования сторонних библиотек. И Retrofit действительно сильно облегчает им жизнь. Тем не менее понимание того, какую именно работу Retrofit выполняет за разработчика, поможет быстрее находить неисправности не только в своём коде, но и в коде разработчиков, отвечающих за API. Знание протокола HTTP и тонкостей клиент-серверного взаимодействия никогда не будет лишним. А для более гибкой работы с сетевыми запросами и возможности детально отслеживать общение приложения с сервером рекомендую подробно ознакомиться с библиотекой OkHttp и использованием Retrofit в сочетании с OkHttpClient.
Статью подготовили:
Сергей Сорокин
Яндекс Практикум
Автор курса по мобильной разработке (Android)
Яндекс Практикум
Редактор
Анастасия Павлова
Яндекс Практикум
Иллюстратор

Дайджест блога: ежемесячная подборка лучших статей от редакции

Поделиться

Успейте начать учебу в Практикуме до конца ноября со скидкой 20%

Wed Jul 31 2024 16:05:55 GMT+0300 (Moscow Standard Time)