Должен ли я использовать ИСПРАВЛЕНИЕ или ПУБЛИКАЦИЮ для одновременного создания и обновления ресурса?

#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