如何设计查询动词信息的RESTful API(例如潜在的POST请求)?

时间:2015-10-20 17:08:33

标签: api rest http api-design

我正在学习如何设计RESTful API,而且我遇到了困境。

假设我有一个POST端点来执行操作。该操作具有与之相关的特定成本。成本取决于动作的内容,特别是POST的主体。例如,给出这两个请求:

POST /flooblinate
{"intensity": 50, "colorful": true, "blargs": [{"norg": 43}]}

POST /flooblinate
{"intensity": 100, "colorful": false, "blargs": []}

假设第一个花费500,第二个花费740.

我想创建一个方法,告诉我发布操作的成本是多少。由于我没有创建或更新任何内容,似乎GET是最合适的动词。但是,a request body with GET should not have any meaning。这意味着我必须将数据放在查询字符串中,比如通过URL编码将要传递给POST的请求主体:

GET /flooblinate/getCost?body=%7B%22intensity%22%3A+50%2C+%22colorful%22%3A+true%2C+%22blargs%22%3A+%5B%7B%22norg%22%3A+43%7D%5D%7D

这似乎不太理想,因为它是同一件事的两种数据格式。但是以下内容:

POST /flooblinate/getCost
{"intensity": 50, "colorful": true, "blargs": [{"norg": 43}]}

这似乎不太理想,因为它滥用POST动词来查询信息,而不是创建或更新某些内容。

在这里做出正确的选择是什么?有没有第三种选择?有没有办法从根本上重新考虑这个设计,这样可以避免做出这个选择的需要?

2 个答案:

答案 0 :(得分:1)

我个人不是要添加dryRyn标志。我试图避免使用布尔标志,除非他们确实需要。

我有两个想法可以涵盖这种情况:

  1. 一种是在后端站点上引入状态,例如STARTEDFINISHED。当提交给定资源操作时,它具有STARTED状态和计算成本,可通过GET方法查看。可以使用PUTPATCH方法修改此类资源,并在给定方法将其状态更改为FINISHED时提交。删除了在给定时间内没有改变状态的资源,其状态将更改为其他终端值。
  2. 第二个想法是引入一个名为eg的新端点。 /calculations。如果您需要计算给定操作的成本,您只需将相同的有效负载(通过POST)发送到此端点,然后再给出成本。然后,资源发送可以保存在服务器上以用于某些已建立的TTL,或者永久保存。
  3. 在给出的所有场景(包括你的场景)中,至少需要发出两个请求。

答案 1 :(得分:0)

这里最好的选择似乎是让端点返回需要查询的信息,并向这些端点添加 flags: { "inappropriate": true, "favorite": false, "sticky": false } 参数。因此:

GET media?where={“flags.inappropriate”: “true”}}

返回:

dryRun

然后使用POST /flooblinate?dryRun=true {"intensity": 50, "colorful": true, "blargs": [{"norg": 43}]} 发帖实际上会提交操作。