С какими API работал

Ответ

Мы использовали Retrofit с Kotlin Coroutines для асинхронных запросов. API описывали через интерфейсы с аннотациями, например:

interface ApiService {
    @GET("users/{id}")
    suspend fun getUser(@Path("id") userId: String): Response<User>
}

Для сериализации применяли Moshi (альтернатива Gson), так как он строже с типами и поддерживает Kotlin-фичи. Для обработки ошибок использовали sealed class:

sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
}

Также внедряли Interceptor для логирования и добавления заголовков.

Ответ 18+ 🔞

Ёпта, смотри, мы тут на проекте с Retrofit'ом баловались, на корутинах всё затачивали. Ну, в смысле, не просто так, а чтоб всё асинхронно и красиво. APIшку описывали через интерфейсы — стандартная история, но с приколами.

Вот смотри, как мы это делали, ядрёна вошь:

interface ApiService {
    @GET("users/{id}")
    suspend fun getUser(@Path("id") userId: String): Response<User>
}

Видишь этот suspend? Это чтобы корутины понимали, что тут можно спокойно подождать, не блокируя главный поток. Без этого — пизда рулю, всё бы висло.

А для сериализации взяли Moshi. Ну, Gson — это, конечно, классика, но Moshi — он строже, с типами не косячит, и под Kotlin заточен лучше. В общем, не мудя, выбрали его.

Но самое главное — обработка ошибок. Чтобы не было этого пиздеца, когда непонятно, что упало и где, мы завезли sealed class. Смотри, какая красота:

sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
}

Вот теперь в коде чистота — либо успех с данными, либо ошибка с исключением. Никаких null'ов и подозрительных try-catch в каждом втором месте. Удивление пиздец, насколько жизнь проще становится.

Ну и куда же без перехватчиков? Добавили Interceptor, чтобы логировать все запросы-ответы (для отладки — просто бомба) и автоматом вшивать нужные заголовки, типа токена авторизации. А то без этого — доверия ебать ноль, что всё полетит как надо.

В общем, связка Retrofit + Coroutines + Moshi + своя обработка ошибок — это овердохуища надёжно и удобно. Главное — не накосячить с конфигурацией Retrofit'а, а то будет тебе хиросима и нигерсраки в одном флаконе.