REST API 中将项目添加到集合的正确方法是什么 - POST 或 PUT

Eka*_*ina 1 rest spring-mvc spring-data-jpa

应用程序中有一些users有偏好的内容 - 最喜欢的作者。用户可以更改此列表。作者位于实体authors的集合中User

@Entity
public class User {
    @Id

     ....
    @ElementCollection
    private List<String> authors=new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)

用户可以编辑他的个人资料并通过添加或删除作者来更改此列表。一方面,添加或删除作者意味着只需编辑个人资料,这就是我目前使用以下PUT方法的原因:

@PutMapping("/api/profile/author/add")
@PutMapping("/api/profile/author/remove")
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否正确。另一种变体是在用户添加和删除项目时使用POST和方法:DELETE

@PostMapping("/api/profile/author/add")
@DeleteMapping("/api/profile/author/remove")
Run Code Online (Sandbox Code Playgroud)

那么什么是正确的变体,原因是什么?

Nee*_*raj 6

如果您检查RFC 7231 第 4.3.4 PUT 节,您会看到

4.3.4. 放

PUT 方法请求创建目标资源的状态或用请求消息有效负载中包含的表示定义的状态替换目标资源的状态。

简单来说,PUT 是指您在 url 创建资源或完全替换它(文件上传是一个简单的例子)。
就您而言,作者本身并不是实体(我可以看到它只是 aString并且列表是 an @ElementCollection)。这意味着,当您添加作者时,您正在修改实体User。即,您没有 创建或替换“用户”。因此,PUT 不适合添加作者。
PUT 也不是用于删除实体。您应该考虑删除。

现在,RFC 7231 第 4.3.4 POST 节这样说:

4.3.3. 邮政

POST 方法请求目标资源
根据资源自身的特定语义处理请求中包含的表示
。例如,POST 用于以下
功能(除其他外):

  • 向数据处理过程提供数据块,例如输入 HTML 表单的字段;
  • 将消息发布到公告板、新闻组、邮件列表、博客或类似的文章组;
  • 创建尚未被源服务器识别的新资源;和
  • 将数据附加到资源的现有表示

同样,简单来说,POST 可以是在服务器上发起操作的请求。上面示例列表中的最后两个适用于您的情况 - 您正在追加或创建作者。这意味着 POST 适合添加作者。

结论:
使用POST和DELETE来添加和删除作者。

顺便说一句,您可能应该去掉url 末尾的add和。remove让 HTTP 方法 POST 和 DELETE 区分操作。所以应该是

@PostMapping("/api/profile/author")
@DeleteMapping("/api/profile/author")
Run Code Online (Sandbox Code Playgroud)