Какой правильный метод в REST API для добавления элемента в коллекцию - POST или PUT - PullRequest
0 голосов
/ 07 марта 2020

В приложении users есть предпочтения - любимые авторы. Пользователь может изменить этот список. Авторы находятся в коллекции authors объекта User:

@Entity
public class User {
    @Id

     ....
    @ElementCollection
    private List<String> authors=new ArrayList<>();
}

Пользователь может редактировать свой профиль и изменять этот список, добавляя или удаляя автора. С одной стороны, добавление или удаление авторов означает просто редактирование профиля, поэтому в настоящее время я использую метод PUT:

@PutMapping("/api/profile/author/add")
@PutMapping("/api/profile/author/remove")

Но я не уверен, что это правильно. Другой вариант - использовать методы POST и DELETE, когда пользователь добавляет и удаляет элементы:

@PostMapping("/api/profile/author/add")
@DeleteMapping("/api/profile/author/remove")

Так что же является правильным вариантом и в чем причина?

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Если вы отметите RF C 7231, раздел 4.3.4 PUT , вы увидите, что

4.3.4. PUT

Метод PUT запрашивает, чтобы состояние целевого ресурса было создано или заменено на состояние, определяемое представлением, заключенным в полезную нагрузку сообщения запроса.

В простом В терминах, PUT - это когда вы создаете ресурс по URL или полностью его заменяете (простой пример загрузки файла).
В вашем случае автор не является сущностью сам по себе (я вижу, что это просто String и список @ElementCollection). Это означает, что когда вы добавляете автора, вы изменяете сущность User. то есть вы не создаете или заменяете «Пользователь». Поэтому PUT не подходит для добавления автора.
PUT также не для удаления объекта. Вы должны рассмотреть DELETE для этого.

Теперь RF C 7231 В разделе 4.3.4 POST говорится следующее:

4.3.3. POST

Метод POST запрашивает, чтобы целевой ресурс обработал представление
, заключенное в запросе, согласно семантике
собственной спецификации ресурса. Например, POST используется для следующих функций
(среди прочих):

  • Предоставление блока данных, такого как поля, введенные в форму HTML, для обработки данных process;
  • Публикация сообщения на доске объявлений, в группе новостей, списке рассылки, блоге или подобной группе статей;
  • Создание нового ресурса, который еще не был идентифицирован исходным сервером; и
  • Добавление данных к существующему представлению (ям) ресурса

Опять же, простыми словами, POST может быть запросом к инициировать действие на сервере. Последние два в приведенном выше списке примеров относятся к вашему делу - вы добавляете или создаете автора. Это означает, что POST подходит для добавления автора.

Вывод:
Используйте POST и DELETE для добавления и удаления авторов.

В примечании к справке вы, вероятно, должны избавиться от add и remove в конце URL. Пусть методы HTTP POST и DELETE различают действия. Так и должно быть

@PostMapping("/api/profile/author")
@DeleteMapping("/api/profile/author")
1 голос
/ 07 марта 2020

PUT - это метод запроса с семантикой удаленной авторизации; вы обычно ожидаете, что целевой ресурс будет тем, что вы редактируете.

Другими словами, @PutMapping обычно использует тот же URI (или шаблон URI), что и @ GetMapping.

GET /profile

// Make local edits to the document

PUT /profile

Если список избранных авторов является отдельным ресурсом, это тоже хорошо. Шаблон будет таким же:

GET /profile/authors

// Make local edits

PUT /profile/authors

Дело в том, что я могу использовать любой редактор с поддержкой HTTP для внесения изменений в удаленный документ. сообщения не указаны c для "списка избранных авторов"; Что касается машин, это просто еще один документ.

Использование POST вместо PUT - это отлично - когда начиналась всемирная паутина, все небезопасные сообщения были POST, и это было катастрофически успешный. Можно использовать POST .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...