Наброшу и сюда тоже, пожалуй.
Сегодня снова была беседа на тему смешивания транспортного уровня и логического.
В смысле я тут периодически вижу горение, когда сервис возвращает 200, а внутри {"error": "go fuck yourself"}. И с моей точки зрения это вообще выглядит абсолютно нормально, потому что HTTP слой работает, сервер в норме, запрос дошёл, ответ вернулся. А вот то, что в запросе была написана херня, это вообще ни разу не проблема сервиса.
Но в комментах к каждому такому треду обязательно найдётся эксперт, который скажет, что нельзя возвращать двухсотый код при ошибке.
А я вот реально не понимаю этой проблемы. Скажем, у нас внутренние сервисы (типа гитхаба) по той же логике работают.
Если сервис начал пятисотить — надо срочно жаловаться овнеру сервиса.
Ну для четырёхсотых — возможны варианты. Скажем, я регулярно наступаю на 429, но тут я сам виноват, да.
А вот @skobkin говорит, что принято возвращать ОШИБКУ, если что-то пошло не так.
Но я вот сейчас пилю сервис на axum, и там когда что-то реально ИДЁТ НЕ ТАК, типа сервер возвращает 404, то падение происходит на уровне middleware, и ты это обрабатываешь реально как exception. Ну то есть проблема уровня «Хозяин, там сломалась труба, по которой ходили запросы!». А если ты просто запросил что-то не то, и тебе вернулась ошибка, то ты получаешь самый обыкновенный Result, и обрабатываешь его, как Result: там может быть ответ, а может быть ошибка, но это именно логическая ошибка, не ошибка транспортного слоя.
Для меня реально немного диковато выглядит вот этот прикол с тем, что сервер тебе возвращает 401, если ты запросил то, что тебе запрещает бизнес-логика, а не попробовал отправить запрос в эндпоинт чужого сервиса.
@rayslava
Если тебе сервер вернул 401 на запрет бизнес-логики, то это странно. Потому что это код про аутентификацию. А если уж говорить про то как нередко делают, то "запретила логика" - это авторизация. И тогда это скорее 403 если уж маппить на HTTP.