Учитывая требования других отделов для нашего REST API, они хотели бы использовать POST
не только для CREATE, но и для UPDATE ИЛИ CREATE. Я знаю, что в RESTful API PUT
может или должно быть использовано для этого, но поскольку клиенты должны обновлять информацию, которая используется для создания URI, мы не можем это использовать. Это изменит URI и сделает PUT
не идемпотент больше... (старый URI не будет существовать после первого PUT
).
tl; dr мы не можем использовать PUT
В спецификации HTTP/1.1 POST определяется как
Метод POST используется для запроса, чтобы исходный сервер принял объект, заключенный в запрос в качестве нового подчиненного ресурса идентифицированный Request-URI
но также
Действие, выполняемое методом POST, может не привести к ресурсу которые могут быть идентифицированы с помощью URI.
Чтобы остаться RESTful, я бы объяснил функциональность обновления как удаление старого элемента, а затем создание нового, что было бы приемлемой функциональностью для POST
, я бы сказал.
Мы вернем #201
, когда создание было успешным, и #200
, когда это было просто обновление.
В нашем API "возможно" обращаться к правильному элементу без URI (например, для его обновления с помощью POST
), потому что все части первичного ключа сборки URI находятся в теле ресурса, поэтому API знает, какой элемент клиент хочет получить доступ.
Пример
(Это всего лишь пример поведения для POST
, а не для структуры данных ресурса. Конечно, использование PUT
было бы совершенно правильным для /cars/
)
POST /cars/ HTTP/1.1
<car>
<id>7</id>
<status>broken</status>
</car>
ответ: #201
и затем
POST /cars/ HTTP/1.1
<car>
<id>7</id>
<status>fine</status>
</car>
ответ: #200
теперь a GET
на /cars/7
вернет следующее:
<car>
<id>7</id>
<status>fine</status>
</car>