У нас есть REST API, в который клиенты регулярно отправляют и отправляют данные POST и PUT. Когда они это делают, иногда они отправляют данные POST, что не приводит к изменениям в нашей системе. Сообщения POST и PUT имеют правильный формат, но отправляемые ими данные идентичны данным в нашей базе данных. Когда это происходит, я только что узнал, что мы возвращаем статус HTTP 400. К сожалению, это означает «неверный запрос», как в «запрос не может быть понят сервером из-за неправильного синтаксиса».
Ясно, что это не так, но мне сказали, что мы собираемся использовать это, поскольку другого подходящего кода состояния нет. Мы рассмотрели следующие варианты:
Другие варианты кажутся столь же плохими. Мы могли бы пойти с 200 OK и иметь соответствующую информацию в XML-документе, который мы возвращаем, но это не очень похоже на «RESTish». Как вообще с этим справляется мир REST?
(Исправленный не измененный код ответа. Спасибо, Mkoeller)





С точки зрения клиента статус сервера будет таким же, независимо от того, было ли содержимое запроса на сервере таким же или нет, верно? Поскольку впоследствии сервер точно хранит отправленный контент, почему сервер должен отвечать каким-либо статусом ошибки? С другой стороны, зачем клиенту беспокоиться, если содержание запроса было таким же, как уже было известно серверу? Он был успешно перенесен на сервер, поэтому основная часть работы сделана. Как ожидается реакция клиента, если в этой ситуации был другой код ответа?
Вывод: ваша ситуация, когда содержание запроса совпадает с существующим, не является особым случаем. Вы должны ответить тем же кодом состояния ответа. Это может быть 200, 302 или 303.
Я думаю, что в этом случае нормально вернуть 200 OK, данные были правильно обработаны и сервер сделал то, что должен. Поскольку сервер правильно обработал данные, он должен вернуть код состояния OK. Тот факт, что он игнорировал это внутренне, не имеет значения.
Не следует сообщать клиентам, что сервер сделал с данными, им следует сообщить, что произошло с запросом (обработано нормально, произошла ошибка и т. д.).
И если по какой-то странной причине (я не могу назвать ее действительной, кстати), она представляет интерес для клиентов, у вас есть ответ, чтобы сказать им об этом.
Если клиенты могут знать тег объекта для содержимого на сервере до того, как они PUT, то использование заголовков If-Match и ответа 412 Precondition Failed существует именно для описанной вами ситуации.
Статус HTTP 302 называется «Найдено».