← Назад к вопросам

Какие сущности используешь в Retrofit

2.3 Middle🔥 232 комментариев
#Работа с данными#Сетевое взаимодействие

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сущности в Retrofit для Android разработки

Retrofit — это типобезопасный HTTP-клиент для Android и Java, который упрощает работу с сетевыми запросами. Вот ключевые сущности, которые я использую при работе с ним:

1. Интерфейсы для определения API-эндпоинтов

Это основной строительный блок Retrofit. В интерфейсе объявляются методы, соответствующие HTTP-запросам:

interface UserApiService {
    @GET("users/{id}")
    suspend fun getUserById(@Path("id") userId: Long): User
    
    @POST("users")
    suspend fun createUser(@Body user: User): Response<User>
    
    @GET("users")
    suspend fun getUsers(@Query("page") page: Int): List<User>
}

2. Retrofit.Builder - фабрика для создания экземпляра Retrofit

Конфигурация клиента осуществляется через билдер:

val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(CoroutineCallAdapterFactory())
    .client(OkHttpClient.Builder().build())
    .build()

3. Аннотации для описания запросов

  • @GET, @POST, @PUT, @DELETE, @PATCH - методы HTTP
  • @Path - подстановка параметров в URL
  • @Query и @QueryMap - параметры строки запроса
  • @Body - тело запроса (для POST/PUT)
  • @Header и @Headers - HTTP-заголовки
  • @Field и @FieldMap - параметры формы (form-urlencoded)
  • @Multipart и @Part - для загрузки файлов

4. Конвертеры (Converter.Factory)

Обрабатывают сериализацию/десериализацию данных:

// Gson для JSON
.addConverterFactory(GsonConverterFactory.create())

// Jackson альтернатива Gson
.addConverterFactory(JacksonConverterFactory.create())

// Moshi - современная альтернатива
.addConverterFactory(MoshiConverterFactory.create())

5. Адаптеры вызовов (CallAdapter.Factory)

Расширяют возможности обработки ответов:

  • RxJavaCallAdapterFactory - для интеграции с RxJava
  • CoroutineCallAdapterFactory - для поддержки Kotlin Coroutines
  • LiveDataCallAdapterFactory - для интеграции с LiveData

6. OkHttpClient - HTTP-клиент под капотом

Retrofit использует OkHttp для выполнения сетевых запросов:

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(HttpLoggingInterceptor().apply {
        level = HttpLoggingInterceptor.Level.BODY
    })
    .addInterceptor { chain ->
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer $token")
            .build()
        chain.proceed(request)
    }
    .readTimeout(30, TimeUnit.SECONDS)
    .connectTimeout(30, TimeUnit.SECONDS)
    .build()

7. Модели данных (DTO/POJO)

Классы для представления JSON-ответов:

data class User(
    @SerializedName("id") val userId: Long,
    @SerializedName("name") val userName: String,
    @SerializedName("email") val email: String,
    @SerializedName("created_at") val createdAt: Date
)

8. Response и Call

  • Call<T> - абстракция над HTTP-запросом (в синхронном стиле)
  • Response<T> - обёртка ответа с метаданными (код статуса, заголовки)
  • suspend функции - для использования с корутинами

9. Кастомные обработчики ошибок

Создание обработчиков для единообразной обработки ошибок:

class ApiErrorHandler : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val response = chain.proceed(chain.request())
        if (!response.isSuccessful) {
            val errorBody = response.body?.string()
            throw ApiException(response.code, errorBody)
        }
        return response
    }
}

10. Динамические URL и параметры

Для сложных случаев с динамическими базовыми URL:

@GET
suspend fun getData(@Url url: String): Data

@GET("{fullPath}")
suspend fun getResource(@Path(value = "fullPath", encoded = true) path: String): Resource

Практические рекомендации

  1. Инкапсуляция: Создаю Repository-слой, который скрывает детали сетевых вызовов
  2. Dependency Injection: Использую Dagger/Hilt для внедрения зависимостей
  3. Конфигурация в одном месте: Централизованное создание Retrofit экземпляра
  4. Обработка ошибок: Единый механизм через Interceptor или CallAdapter
  5. Кэширование: Настраиваю через OkHttp Cache для оптимизации
  6. Логирование: Добавляю HttpLoggingInterceptor для отладки

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

Какие сущности используешь в Retrofit | PrepBro