Попробуйте себя в топовых IT-профессиях и соберите первое портфолио. Бесплатный курс Попробуйте себя в топовых IT-профессиях и соберите первое портфолио. Бесплатный курс Учиться
Код
#статьи

Retrofit: что это за библиотека и как с ней работать

Ускоряем работу Android-приложений с сервером.

Иллюстрация: Оля Ежак для Skillbox Media

Современные Android-приложения постоянно обмениваются данными с сервером: показывают новости, списки пользователей, комментарии и многое другое. Чтобы запросить или отправить данные, приложения посылают серверу сообщения — HTTP-запросы. Для реализации этих функций при создании приложения можно использовать стандартные средства, предусмотренные Android Studio. Но есть это часто неудобно и требует много лишнего кода.

Здесь на сцену выходит Retrofit — библиотека, которая сильно упрощает работу с подобными задачами. Она позволяет буквально в несколько строк создавать модули, которые умеют отправлять запросы на сервер и получать от него ответы. Давайте разберёмся, как это сделать.

В этой статье мы:

В качестве сервера для теста мы будем использовать JSONPlaceholder — это бесплатный онлайн-сервис, который предоставляет тестовые данные через REST API. Он создан специально для того, чтобы разработчики могли тренироваться и отлаживать приложения без необходимости создавать собственный сервер или базу данных.

Также в качестве языка программирования мы используем Kotlin, который официально поддерживается Google и рекомендован для разработки Android-приложений. При этом Retrofit поддерживает и Java.

Создаём проект и подключаем Retrofit

Запустите Android Studio и в главном окне нажмите на кнопку New Project. Если вы не знаете, что такое Android Studio и не работали с ней раньше, то сперва прочитайте эту статью. В ней — простое и понятное руководство для новичков.

Скриншот: Android Studio / Skillbox Media

После запуска на экране появится окно создания проекта. В нём выберите Phone and Tablet слева и шаблон Empty Activity. Затем нажмите Next.

Скриншот: Android Studio / Skillbox Media

Укажите имя проекта и в качестве языка программирования (Build configuration language) выберите Kotlin. Затем нажмите Finish.

Скриншот: Android Studio / Skillbox Media

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

В Android для подключения библиотек используют систему Gradle, которая автоматически скачивает и устанавливает нужные библиотеки к вашему проекту. Вам не нужно ничего искать вручную — просто добавьте нужные строки в файл build.gradle.kts вашего модуля (обычно это app/build.gradle.kts).

Перед началом установки Retrofit убедитесь, что у вас выбран режим отображения структуры Project. Так вы сможете видеть все файлы проекта.

Скриншот: Android Studio / Skillbox Media

В директории проекта найдите файл build.gradle.kts, щёлкните по нему два раза левой кнопкой мыши, чтобы открыть. Найдите в нём раздел dependencies и добавьте туда следующий код:

implementation ("com.squareup.retrofit2:retrofit:2.9.0") // Подключаем саму библиотеку Retrofit
implementation ("com.squareup.retrofit2:converter-gson:2.9.0") // Подключаем конвертер для работы с JSON

Обязательно нажмите на кнопку Sync Now справа вверху, чтобы Android Studio приступил к установке Retrofit. Должно получиться вот так:

Скриншот: Android Studio / Skillbox Media

Проектируем модель данных

Модель данных, или data class, нужна для того, чтобы Retrofit автоматически преобразовывал ответ от сервера, который приходит в формате JSON, в объекты Kotlin. Без неё Retrofit не будет знать, как правильно интерпретировать полученные данные и во что их превращать. Всё это вам придётся делать вручную, что усложнит код и увеличит вероятность появления ошибок.

Чтобы получить данные с сервера правильно, нужно, чтобы элементы из модели данных имели такие же названия, какие указаны в JSON-файле, приходящем с сервера. То есть, когда мы отправляем запрос на https://jsonplaceholder.typicode.com/posts/1, сервер возвращает JSON-объект, который выглядит вот так:

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit..."
}

В нём:

  • userId — ID пользователя, который написал пост (число);
  • id — ID самого поста (число);
  • title — заголовок поста (строка);
  • body — текст поста (строка).

Чтобы преобразовать эти данные в объект Kotlin правильно, создайте новый Kotlin-файл Post.kt в папке app/src/main/java/имя_пакета/ и вставьте в него следующий код:

data class Post(
    val userId: Int,
    val id: Int,
    val title: String,
    val body: String
)
Скриншот: Android Studio / Skillbox Media

Это поможет соотнести названия полей из JSON-файла с типами данных переменных проекта. В результате Retrofit сможет без проблем интерпретировать информацию, полученную с сервера.

Создаём интерфейс общения с API

Интерфейс API — это набор правил, которые объясняют приложению:

  • какие запросы можно отправить на сервер. Например, получить список постов или создать новый пост;
  • какие параметры нужны для каждого запроса — ID поста или текст сообщения;
  • какой ответ вернёт сервер.

С помощью интерфейса API мы описываем, какие действия может выполнять наше приложение через интернет. Это похоже на меню в ресторане. Заглядывая в него, вы заранее знаете, что можно заказать и что вы получите.

Для создания интерфейса API перейдите в каталог с файлом Post.kt и создайте в нём ещё один файл — ApiService.kt. Вставьте в него следующий код:

import retrofit2.Call
import retrofit2.http.*

// Описываем, какие запросы мы хотим отправлять
interface ApiService {

    // Получить все посты (GET)
    @GET("posts")
    fun getPosts(): Call<List<Post>>

    // Отправить новый пост (POST)
    @POST("posts")
    fun createPost(@Body post: Post): Call<Post>

    // Полностью обновить пост (PUT)
    @PUT("posts/{id}")
    fun updatePost(@Path("id") id: Int, @Body post: Post): Call<Post>

    // Частично обновить пост (PATCH)
    @PATCH("posts/{id}")
    fun patchPost(@Path("id") id: Int, @Body post: Map<String, Any>): Call<Post>

    // Удалить пост (DELETE)
    @DELETE("posts/{id}")
    fun deletePost(@Path("id") id: Int): Call<Void>
}

В начале этого кода мы импортируем два интерфейса. Вот для чего они нужны:

  • import retrofit2.Call — подключает тип Call, который представляет собой отложенный HTTP-запрос. Это как бы обещание запроса, которое мы можем выполнить, когда захотим.
  • import retrofit2.http.* — подключает аннотации для описания HTTP-запросов (@GET, @POST, @PUT и другие).
Скриншот: Android Studio / Skillbox Media

Инициализируем Retrofit

Инициализация Retrofit — это процесс настройки библиотеки. Этот шаг необходим для того, чтобы запросы GET, POST, PUT, DELETE и другие выполнялись корректно, а данные из ответа сервера преобразовывались в удобные для использования объекты Kotlin.

В момент инициализации вы:

  • Настраиваете базовый URL API, например https://jsonplaceholder.typicode.com/, чтобы приложение знало, на какой сервер отправлять запросы.
  • Добавляете JSON-конвертер, чтобы Retrofit автоматически преобразовывал JSON-ответы от сервера в объекты Kotlin.
  • Создаёте объект Retrofit с URL и конвертером, который будет отвечать за выполнение всех запросов, а также за обработку и преобразование ответов.

Для инициализации создайте всё в той же папке файл RetrofitClient.kt со следующим содержимым:

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

// Настроим Retrofit один раз на всё приложение
object RetrofitClient {

    private val retrofit = Retrofit.Builder()
        .baseUrl("https://jsonplaceholder.typicode.com/") // Базовый адрес API
        .addConverterFactory(GsonConverterFactory.create()) // Автоконвертация JSON в Kotlin-объекты
        .build()

    val apiService: ApiService = retrofit.create(ApiService::class.java)
}

В интерфейсе Android Studio должно получиться так:

Скриншот: Android Studio / Skillbox Media

Редактируем MainActivity и тестируем приложение

Чтобы приложение работало без ошибок, нужно отредактировать главный скрипт — MainActivity.kt. Для этого откройте его (он лежит в каталоге, в котором мы создавали файлы) и в самое начало добавьте импорты:

import android.widget.LinearLayout  // Используем LinearLayout для размещения дочерних элементов (например, TextView или Button)
import android.widget.TextView  // Используем TextView для отображения текста на экране
import android.app.Activity  // Используем Activity вместо AppCompatActivity
import android.util.Log  // Логирование сообщений для отладки
import retrofit2.Call  // Используем Call для выполнения запросов к серверу
import retrofit2.Callback  // Используем Callback для обработки асинхронных запросов
import retrofit2.Response  // Используем Response для обработки ответа от сервера
import retrofit2.Retrofit  // Используем Retrofit для работы с API
import retrofit2.converter.gson.GsonConverterFactory  // Используем GsonConverterFactory для преобразования JSON в объекты Kotlin

Весь код, расположенный ниже, стираем и взамен пишем следующее:

class MainActivity : Activity() {  // Наследуем от Activity, это основной класс для взаимодействия с пользовательским интерфейсом в Android

    override fun onCreate(savedInstanceState: Bundle?) {  // Метод, который вызывается при создании Activity
        super.onCreate(savedInstanceState)  // Вызов родительского метода для того, чтобы инициализировать Activity

        // Создаём линейный макет, который будет содержать дочерние элементы
        val layout = LinearLayout(this)  // Инициализация LinearLayout, передаём контекст
        layout.orientation = LinearLayout.VERTICAL // Устанавливаем вертикальное расположение элементов в макете

        // Создаём TextView, чтобы отобразить текст на экране
        val textView = TextView(this)  // Инициализация TextView с контекстом текущей Activity
        textView.text = "Hello, Retrofit!" // Устанавливаем текст, который будет отображаться в TextView
        layout.addView(textView) // Добавляем созданный TextView в макет

        // Устанавливаем созданный layout как основной контент для Activity
        setContentView(layout)  // Устанавливаем layout, чтобы он отображался в Activity

        // Запускаем асинхронный запрос, чтобы проверить работу Retrofit

В Android Studio это будет выглядеть так:

Скриншот: Android Studio / Skillbox Media

Осталась мелочь, но очень важная. Чтобы всё заработало, приложению нужно разрешение на выход в интернет. Для этого откройте файл app/src/main/AndroidManifest.xml и в него, до блока application, добавьте строку.

<uses-permission android:name="android.permission.INTERNET" />
Скриншот: Android Studio / Skillbox Media

Слева вверху нажмите на кнопку меню (три полоски) и в пункте File выберите Save All.

Скриншот: Android Studio / Skillbox Media

Теперь нажмите на кнопку запуска приложения. Она находится справа вверху.

Скриншот: Android Studio / Skillbox Media

Подождите, пока запустится виртуальная машина Android, в которой и откроется приложение, — экран эмулятора станет белым. Теперь слева внизу найдите кнопку Logcat, нажмите на неё, чтобы открыть консоль логов. В ней вы увидите результаты запросов от Retrofit, полученные с JSONPlaceholder.

Скриншот: Android Studio / Skillbox Media

Подводим итоги

В этой статье мы показали, как подключить библиотеку Retrofit к Android-приложению, чтобы упростить работу с HTTP-запросами. Пошагово разобрали, как настроить Retrofit, создать модели данных, описать интерфейсы API и настроить обработку запросов. В результате получили тестовое приложение, которое эффективно и без лишних усилий взаимодействует с сервером.

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

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!



Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Курс с трудоустройством: «Профессия Разработчик» Узнать о курсе
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована