REST: правильный код ответа HTTP для POST, который игнорируется

У нас есть REST API, для которого клиенты обычно используют POST и PUT. Когда они это делают, иногда они получают данные POST, что не приводит к изменениям в нашей системе. POST и PUT являются хорошо сформированными, но данные, которые они отправляют, идентичны данным в нашей базе данных. Когда это произойдет, я только что узнал, что мы возвращаем статус HTTP HTTP. К сожалению, это означает, что "плохой запрос", как "запрос не может быть понят сервером из-за искаженного синтаксиса".

Ясно, что это не так, но мне сказали, что мы будем использовать это, потому что нет другого подходящего кода статуса. Выбор, который мы рассмотрели:

  • 304 Не изменено. Это, к сожалению, только для запросов GET.
  • 204 Нет содержимого. Кажется, близко, но запрещает сущность-тело.

Другие варианты кажутся одинаково плохими. Мы можем пойти с 200 OK и иметь соответствующую информацию в документе XML, который мы возвращаем, но это не кажется очень "RESTish". Как вообще этот мир REST справляется с этим?

(Исправлен не модифицированный код ответа. Спасибо Mkoeller)

Ответ 1

Я думаю, что вполне нормально вернуть 200 OK в этом случае, данные были правильно обработаны, и сервер сделал то, что должен был. Поскольку сервер правильно обработал данные, он должен вернуть код состояния OK. Тот факт, что он игнорировал его внутри, является или должен быть неактуальным.

То, что сервер сделал с данными, не должен сообщаться клиентам, им должно быть рассказано, что случилось с запросом (обработано нормально, произошла ошибка и т.п.).

И если, по какой-то странной причине (я не могу думать, что это действительно так, кстати), она представляет интерес для клиентов, у вас есть ответ, чтобы сказать им об этом.

Ответ 2

Если клиенты могут узнать тег сущности для содержимого на сервере перед их выполнением, то использование именно таких заголовков и ответ на ошибку 412 Presodition Failed существует именно в той ситуации, которую вы описываете.

Ответ 3

С точки зрения клиента статус сервера тот же, если содержимое запроса было одинаковым на сервере или нет, не так ли? Поскольку сервер после этого корректно передает отправленный контент, почему сервер должен реагировать с каким-либо статусом ошибки? С другой стороны, почему клиент должен беспокоиться о том, что содержимое запроса было таким же, как уже известно серверу? Он был успешно перенесен на сервер, поэтому основная часть работы выполнена. Как клиент должен реагировать, если для этой ситуации существует другой код ответа?

Заключение: Ваша ситуация с содержимым запроса, равным существующему контенту, не является особым случаем. Вы должны ответить с тем же кодом статуса ответа. Это может быть 200, 302 или 303.