Какие сущности используешь в Retrofit
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Сущности в 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
Практические рекомендации
- Инкапсуляция: Создаю Repository-слой, который скрывает детали сетевых вызовов
- Dependency Injection: Использую Dagger/Hilt для внедрения зависимостей
- Конфигурация в одном месте: Централизованное создание Retrofit экземпляра
- Обработка ошибок: Единый механизм через Interceptor или CallAdapter
- Кэширование: Настраиваю через OkHttp Cache для оптимизации
- Логирование: Добавляю HttpLoggingInterceptor для отладки
Эти сущности в Retrofit обеспечивают чистую архитектуру, типобезопасность и удобство тестирования сетевого слоя приложения. Правильное использование этих компонентов позволяет создавать масштабируемые и поддерживаемые сетевые слои в Android-приложениях.