繁体   English   中英

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

[英]What is the correct method in REST API for adding an item to a collection - POST or PUT

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

@Entity
public class User {
    @Id

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

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

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

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

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

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

如果您查看RFC 7231 Section 4.3.4 PUT ,您会看到

4.3.4.

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

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

现在, RFC 7231 Section 4.3.4 POST说:

4.3.3. 邮政

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

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

再次,简单地说,POST 可以是在服务器上启动操作的请求。 上面示例列表中的最后两个适用于您的案例 - 您正在追加或创建作者。 这意味着 POST 适合添加作者。

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

附带说明一下,您可能应该去掉 url 末尾的addremove 让 HTTP 方法 POST 和 DELETE 区分操作。 所以应该是

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

PUT 是一种具有远程创作语义的请求方法; 您通常会期望目标资源是您正在编辑的内容。

换句话说,@PutMapping 通常会使用与 @GetMapping 相同的 URI(或 URI 模板)。

GET /profile

// Make local edits to the document

PUT /profile

如果最喜欢的作者列表是一个单独的资源,那也很好。 模式将是相同的:

GET /profile/authors

// Make local edits

PUT /profile/authors

关键是我可以使用任何HTTP 感知编辑器来更改远程文档。 这些消息并不特定于“最喜欢的作者列表”; 就机器而言,它只是另一个文件。

使用 POST 而不是 PUT很好——当万维网开始时,所有不安全的消息都是 POST,这是灾难性的成功。 可以使用 POST

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM