#http #spring-mvc #post #crud #rest
Вопрос:
Я знаю, что ПАТЧ должен обновить существующий ресурс, а СООБЩЕНИЕ должно создать новый ресурс. Однако моя текущая конечная точка должна обновляться и создаваться одновременно.
Например: Покупатель платит Продавцу деньги за покупку товара, поэтому баланс его счета должен измениться, и также должна быть создана новая платежная транзакция.
Я подумываю о возврате объекта транзакции в теле ответа. Какой метод я должен использовать?
Ответ №1:
Обычно PUT
это правильный метод как для создания, так и для обновления.
POST
следует использовать, если клиент не может определить целевой URI, но если клиент может определить целевой URI, PUT
это лучший метод.
Например, PUT /article/hello-world
должен вернуться 201
созданный, если эта статья еще не существовала, и 204/200, если она существовала и ее заменили.
Однако у меня есть некоторые оговорки в отношении вашего конкретного случая. В вашем примере это звучит так:
- Вы создаете новую транзакцию
- Это должно повлиять на сальдо существующих счетов
Также, скорее всего, клиент не решит, каким будет целевой URI.
В этом случае я бы в основном просто подумал об этой операции с точки зрения транзакции. Если вы хотите сообщить, что транзакция повлияла на другие ресурсы, вы можете использовать Link
для этого заголовок.
Примеры
Запрос
POST /transactions HTTP/1.1 Content-Type: application/json { "from": "/accounts/123", "to": "/accounts/456", "quantity": "55.00" }
Ответ:
HTTP/1.1 201 Created Location: /transactions/555513412 Link: lt;/account/123gt;; rel="invalidates" Link: lt;/account/456gt;; rel="invalidates"
Обратите внимание, что связь «аннулирует» имеет статус черновика, но это отличная идея, и я много раз использовал ее в наших API