Ошибка в бизнес логике. Например: запрашиваем пользователя с логином: qwerty. Сервер его не нашел и отправил: {success:false, status: пользователь не найден}.
@GET("user")
fun loadToken(@Query("user") user: String): Single(User)
Retrofit ждет User. Приходит ответ выше. Что делать в таком случае?
В некоторых случаях считается что если есть сетевая ошибка(нет интернета), то это любой код кроме 200, а если ошибка на каком-то из кластеров к примеру, то все равно статус 200 и дальше уже в боди приходит расшифровка вида {error: true, cluster: 's42dsf', message: '404, govno not found'} из публичных api вк такой подход насколько помню использует
Shadrindmitry, в этом случае надо обрабатывать пришедший результирующий json.
Читаешь поле success, а там либо true, либо false.
К ошибкам транспортного уровня это не имеет никакого отношения
Примеры:
Если юзер не авторизован, то надо возвращать код статуса 401, а не 200.
Если URL API неверный, то надо возвращать 404, а не 200.
Если введён неверный логин/пароль, то возвращать 200, а в теле ответа JSON вида, например:
{"status":"error","descrioption":"Wrong login or password"}
и т.д.