我正在学习如何设计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动词来查询信息,而不是创建或更新某些内容。
在这里做出正确的选择是什么?有没有第三种选择?有没有办法从根本上重新考虑这个设计,这样可以避免做出这个选择的需要?
答案 0 :(得分:1)
我个人不是要添加dryRyn
标志。我试图避免使用布尔标志,除非他们确实需要。
我有两个想法可以涵盖这种情况:
STARTED
,FINISHED
。当提交给定资源操作时,它具有STARTED
状态和计算成本,可通过GET
方法查看。可以使用PUT
和PATCH
方法修改此类资源,并在给定方法将其状态更改为FINISHED
时提交。删除了在给定时间内没有改变状态的资源,其状态将更改为其他终端值。/calculations
。如果您需要计算给定操作的成本,您只需将相同的有效负载(通过POST
)发送到此端点,然后再给出成本。然后,资源发送可以保存在服务器上以用于某些已建立的TTL,或者永久保存。在给出的所有场景(包括你的场景)中,至少需要发出两个请求。
答案 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}]}
发帖实际上会提交操作。