Код-ревью 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.
Что должен найти ревьюер
- Производительностьстрока 2Новый OkHttpClient и Retrofit на каждый вызов api(): нет переиспользования пула соединений; создавать один раз и внедрять через DI
- Безопасностьстрока 4Логирование тел в release раскрывает токены и личные данные; только в debug или с redactHeader
- Безопасностьстрока 7http вместо https: cleartext запрещён с Android 9 и небезопасен
- Ошибкастрока 7baseUrl без слеша на конце: Retrofit бросит IllegalArgumentException
- Ошибкастрока 9Json без ignoreUnknownKeys: новое поле в ответе сломает парсинг у старых версий
- Ошибкастрока 18catch (e: Exception) глотает CancellationException и прячет все ошибки за пустым списком; UI не отличит ошибку от пустых данных
Разбор
Сетевые объекты должны быть синглтонами в DI: клиент с пулом соединений создаётся один раз. Логирование тел только в debug. Адрес с HTTPS и слешем в конце. JSON с ignoreUnknownKeys. Ошибки нужно различать (IOException, HttpException) и передавать наверх как результат, а не превращать в пустой список; CancellationException пробрасывать.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.