Учитывая требования других отделов к нашему REST API, они хотели бы использовать POST
не только для СОЗДАНИЯ, но и для ОБНОВЛЕНИЯ ИЛИ СОЗДАНИЯ. Я знаю, что в 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
теперь GET
на /cars/7
вернет следующее:
<car>
<id>7</id>
<status>fine</status>
</car>