Код-ревью Senior Сеть: Retrofit и OkHttp обновлено

Код-ревью сетевого слоя

Вопрос

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

object Network {
    fun api(): ArticlesApi {
        val client = OkHttpClient.Builder()
            .addInterceptor(HttpLoggingInterceptor().setLevel(Level.BODY))
            .build()
        return Retrofit.Builder()
            .baseUrl("http://api.example.com/v1")
            .client(client)
            .addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
            .build()
            .create(ArticlesApi::class.java)
    }
}

class ArticlesRepository {
    suspend fun load(): List<Article> = try {
        Network.api().list(page = 1).map { it.toDomain() }
    } catch (e: Exception) {
        emptyList()
    }
}

Коротко

Сетевые объекты должны быть синглтонами в DI: клиент с пулом соединений создаётся один раз. Логирование тел только в debug.

Что должен найти ревьюер

  1. Производительностьстрока 2
    Новый OkHttpClient и Retrofit на каждый вызов api(): нет переиспользования пула соединений; создавать один раз и внедрять через DI
  2. Безопасностьстрока 4
    Логирование тел в release раскрывает токены и личные данные; только в debug или с redactHeader
  3. Безопасностьстрока 7
    http вместо https: cleartext запрещён с Android 9 и небезопасен
  4. Ошибкастрока 7
    baseUrl без слеша на конце: Retrofit бросит IllegalArgumentException
  5. Ошибкастрока 9
    Json без ignoreUnknownKeys: новое поле в ответе сломает парсинг у старых версий
  6. Ошибкастрока 18
    catch (e: Exception) глотает CancellationException и прячет все ошибки за пустым списком; UI не отличит ошибку от пустых данных

Разбор

Сетевые объекты должны быть синглтонами в DI: клиент с пулом соединений создаётся один раз. Логирование тел только в debug. Адрес с HTTPS и слешем в конце. JSON с ignoreUnknownKeys. Ошибки нужно различать (IOException, HttpException) и передавать наверх как результат, а не превращать в пустой список; CancellationException пробрасывать.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.