【问题标题】:PUT or POST when making idempotnet request for specific use-case对特定用例发出幂等请求时的 PUT 或 POST
【发布时间】:2013-09-04 19:01:50
【问题描述】:

我正在为 Web 应用程序设计 REST API。

我在设计 API 时的原则是:

  • 使用客户端用例视角而不是数据模型视角。动机:从 DB 架构中抽象出来。
  • 每个斜线代表新的用例/操作。

假设在应用程序中,我们有用户、产品、位置、产品新闻。用例是用户从某个位置关注产品新闻。如果位置为空,则用户会关注每个位置的产品新闻。
产品和位置列表众所周知。

将用户添加为特定产品位置组合的关注者的正确方法是什么?

我最终得到以下网址:

/product/follow?product=<product_name>[&location=<location name>]

productlocation 名称位于查询部分,因为将来扩展更加灵活。

  • PUT 的参数:当然,这个请求是幂等的 - 多次发送它不会像发送一次一样产生任何其他变化。
  • POST 的参数:我们不指定 URL,在该 URL 下设置资源。

就我个人而言,我更接近 PUT,因为根据 API 的 用例 原则(我认为这是正确的),无能 规则接缝是最对应的。

【问题讨论】:

  • URI 中的“操作”=> 不是 REST。就这么简单。

标签: api http rest restful-url


【解决方案1】:

首先确定资源。我会这么说

/products/<product_name>/followers

是关注product_name 的所有用户的列表。您可以使用查询参数进行过滤:

/products/<product_name>/followers?location=<location_name>

是从location_name 关注product_name 的所有用户的列表。

针对此类资源的GET 请求会返回用户列表的表示(JSON、XML、...)。

POSTPUT

针对此类资源的POST 请求添加新用户。此类POST 请求的请求正文包含详细信息。

POST /products/<product_name>/followers
Content-Type: application/json

{
  "user": "some user",
  "location: "some location"
}

服务器会响应:

201 Created
Location: /products/<product_name>/followers/some%20user

如果客户端知道URI,它可以使用PUT:

PUT /products/<product_name>/followers/some%20user
Content-Type: application/json

{
  "location: "some location"
}

服务器会再次响应:

201 Created
Location: /products/<product_name>/followers/some%20user

总结

如果客户端能够准确知道 URI,您可以使用PUT。 URL 只能被服务器知道,使用POST

【讨论】:

  • 这是否意味着PUT应该附加最终URL而不是显示其幂等性?
  • 我不太明白你的评论。 PUT 通常用于创建/修改已知资源。 POST 通常用于通过附加到集合来创建。因此,PUT 是幂等的,而 POST 不是。
  • 我通常会说客户端不应该负责自己计算 URI。客户端最好将POST 用户详细信息发送到“关注者”集合并让服务器返回新的 URI。这样,服务器保留控制权。但当然,POST 不是幂等的,所以如果用户两次发送相同的关注请求,则会创建两个资源,除非服务器以其他方式处理它(例如拒绝第二个请求)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2018-05-31
  • 2021-07-15
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多