在针对特定用例进行idempotnet请求时进行PUT或POST

时间:2013-09-04 19:01:50

标签: api http rest restful-url

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

我在设计API时的原则是:

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

让我们说在应用程序中我们有用户,产品,位置,产品新闻。用例用户来自某个位置的产品新闻。如果位置为空,则用户从每个位置跟踪有关产品的新闻 产品和位置清单是众所周知的。

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

我最终得到以下网址:

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

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

  • PUT 的论据:当然这个请求是幂等的 - 多次发送请求不会发送任何其他更改。
  • POST 的参数:我们没有指定设置资源的URL。

就个人而言,我更接近 PUT ,因为通过API的用例原则(我认为是正确的)无效规则接缝是最相应的接缝。

1 个答案:

答案 0 :(得分:1)

首先确定资源。我会说那个

/products/<product_name>/followers

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

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

是来自product_name的{​​{1}}后的所有用户的列表。

针对此类资源的location_name请求会返回用户列表的表示形式(JSON,XML,...)。

GETPOST

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

POST

服务器将回复:

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

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

如果客户端知道URI,则可以使用201 Created Location: /products/<product_name>/followers/some%20user

PUT

服务器将再次响应:

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

{
  "location: "some location"
}

<强>摘要

如果客户端能够准确知道URI,则可以使用201 Created Location: /products/<product_name>/followers/some%20user 。该URL只能由服务器知道,使用PUT