REST: правильный код ответа HTTP для игнорируемого сообщения POST - PullRequest
14 голосов
/ 12 ноября 2008

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

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 12 ноября 2008

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

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

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

3 голосов
/ 13 ноября 2008

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

1 голос
/ 12 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...