Возврат http 200 OK с ошибкой в теле ответа

мне интересно, правильно ли возвращать HTTP 200 OK когда ошибка на стороне сервера произошла с некоторой ошибкой внутри тела ответа.

пример:

  1. мы отправляем http GET
  2. что-то неожиданное произошло на стороне сервера.
  3. возвращает сервер http 200 OK код состояния с ошибкой внутри ответа (например,{"status":"some error occured"}

это правильное поведение или нет? Разве мы не должны изменить код состояния?

5 ответов


нет, это очень неправильно.

HTTP-это протокол приложения. 200 означает, что ответ содержит полезную нагрузку, представляющую состояние запрашиваемого ресурса. Сообщение об ошибке обычно не является представлением этого ресурса.

Если что-то идет не так во время обработки GET, правильный код состояния 4xx ("вы испортили") или 5xx ("я испортил").


коды состояния HTTP говорят что-то о протоколе HTTP. HTTP 200 означает, что передача в порядке на уровне HTTP (i.e запрос был технически в порядке, и сервер смог правильно ответить). См.этой странице список всех кодов и их значение.

HTTP 200 не имеет ничего общего с успехом или неудачей вашего "бизнес-кода". В вашем примере HTTP 200 приемлемого состояния, чтобы указать, что ваше сообщение об ошибке "бизнес-код" был успешно передано, при условии, что никакие технические проблемы не помешали бизнес-логике работать должным образом.

или вы могли бы пусть ваш сервер отвечает с HTTP 5xx Если на сервере возникли технические или неустранимые проблемы. Или HTTP 4xx если входящий запрос имел проблемы (например, неправильные параметры, неожиданный метод HTTP...) Опять же, все это указывает технические ошибки, в то время как HTTP 200 указано нет технические ошибки, но не дает никаких гарантий о ошибки бизнес-логики.

подводя итог: Да, действительно, отправлять сообщения об ошибках (для нетехнических проблем) в вашем http-ответе вместе с HTTP-статусом 200. Относится ли это к вашему делу, зависит от вас. Если, например, клиент запрашивает файл, которого нет, это было бы больше похоже на 404. Если на сервере есть неправильная конфигурация, которая может быть 500. Если клиент просит место в самолете, который забронирован полностью, это будет 200 и ваш "реализация" будет диктовать, как распознать / обработать это (например, блок JSON с { "booking","failed" })


даже если я хочу вернуть ошибку бизнес-логики как HTTP-код, такого нет допустимый код ошибки HTTP для этих ошибок, а не использование HTTP 200, поскольку он будет искажать фактическую ошибку.

Итак, HTTP 200 будет хорош для ошибок бизнес-логики. Но все ошибки, которые покрываются кодами ошибок HTTP, должны их использовать.

в основном HTTP 200 означает, что сервер правильно обрабатывает запрос пользователя (в случае отсутствия мест в самолете это не имеет значения поскольку запрос пользователя был правильно обработан, он может даже вернуть только количество мест, доступных в самолете, поэтому ошибок бизнес-логики вообще не будет или что бизнес-логика может быть на стороне клиента. Ошибка бизнес-логики-это абстрактное значение, но ошибка HTTP более определенная).


чтобы уточнить, вы должны использовать коды ошибок HTTP, где они соответствуют протоколу, а не использовать коды состояния HTTP для отправки бизнес-логики ошибки.

ошибки, как недостаточный баланс, такси, неверный пользователь/пароль претендовать на статус HTTP 200 с обработкой ошибок конкретного приложения в теле ответа.

посмотреть это программное обеспечение инженерный ответ:

Я бы сказал, что лучше быть явным о разделении протоколов. Пусть HTTP-сервер и веб-браузер делают свое дело, и пусть приложение делает его собственную вещь. Приложение должно иметь возможность делать запросы, и ему нужны ответы-и его логика относительно того, как запрашивать, как интерпретировать ответы, может быть более (или менее) сложной, чем перспектива HTTP.


HTTP-это протокол, обрабатывающий передачу данных через интернет.

Если эта передача прерывается по какой-либо причине коды ошибок HTTP говорят вам, почему она не может быть отправлена вам.

передаваемые данные не обрабатываются кодами ошибок HTTP. Только способ передачи.

HTTP не может сказать: "хорошо, этот ответ-gobbledigook, но вот он". он просто говорит:200 OK.

i.e : я завершил свою работу по доставке его вам, остальное зависит от вас.

Я знаю, что на это уже ответили, но я выражаю это словами, которые могу понять. извините за повторение.