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

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

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

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

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

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

Статус HTTP 302 называется «Найдено».

mkoeller 12.11.2008 17:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
1
7 712
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Ответ принят как подходящий

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

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

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

Если клиенты могут знать тег объекта для содержимого на сервере до того, как они PUT, то использование заголовков If-Match и ответа 412 Precondition Failed существует именно для описанной вами ситуации.

Другие вопросы по теме