У меня есть REST API, который позволяет изменять ресурсы с помощью HTTP POST. Возможно, клиент может отправить запрос POST, который не приведет к изменению ресурса. Я думаю об использовании ответа 304, обычно используемого для условных ответов, чтобы указать, что запрос не имел никакого эффекта. Я не смог найти примеров этого, поэтому я решил, что попрошу здесь и посмотрю, делает ли кто-нибудь еще это или имеет мнение об этом.
Использование HTTP 304 в ответ на POST
Ответ 1
После некоторого рассмотрения я решил придерживаться обычного ответа 200 с неизменным объектом ресурса. Мое первоначальное намерение состояло в том, чтобы предоставить краткий способ указать клиенту, что ресурс не был изменен. Поскольку я думал больше об этом, я понял, что для того, чтобы делать что-нибудь полезное с ответом 304, у них уже должна была быть кешированная версия, и в этом случае было бы тривиально сравнивать версию кешированной копии с версией, возвращенной в ответ 200.
Ответ 2
У меня есть REST API, который позволяет изменять ресурсы с помощью HTTP POST. Возможно, клиент может отправить запрос POST, который не приведет к изменению ресурса.
HTTP POST в подходе RESTful подразумевает создание ресурса, а не модификацию. Для изменения вы должны использовать HTTP PUT.
Решение вашей проблемы HTTP Status 200 OK, когда что-то было изменено, и HTTP Status 204 No Content, когда не было изменений. Согласно:
Общим вариантом использования является возврат 204 в результате запроса PUT, обновление ресурса без изменения текущего содержимого страницы, отображаемой пользователю. Если ресурс создан, вместо него возвращается 201 Created. Если страница должна быть изменена на вновь обновленную страницу, вместо нее следует использовать 200.
Например:
-- Request
POST /people HTTP/1.1
Content-Type: application/json
{
"name": "John"
}
-- Response
HTTP/1.1 201 Created
Location: /people/1
-- Request
PUT /people/1 HTTP/1.1
Content-Type: application/json
{
"name": "John"
}
-- Response
HTTP/1.1 204 No Content
-- Request
PUT /people/1 HTTP/1.1
Content-Type: application/json
{
"name": "Robert"
}
-- Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"name": "Robert"
}