我需要在我的REST API中创建一个用于执行某些计算的方法。为简单起见,假设我需要实现一个方法,该方法对于给定的对象列表将返回其长度。
它应该只计算长度并返回到客户端,因此服务器端不会修改任何资源。由于它不会修改任何资源,因此可以预期它应该是GET
请求。但是,由于列表可能很大且对象可能很复杂,我看起来需要将其作为POST
请求。但是,这将违反在REST中用于创建资源的POST
标准。
这个问题的解决方案是什么?
答案 0 :(得分:2)
务实回答:使用POST
。
小心地回答:使用POST
。您的请求包含您希望服务器临时创建的资源(或资源集)(对象列表)。如果服务器发生在成功处理POST
后立即删除该资源,那该怎么办?
答案 1 :(得分:1)
根据RESTful Web Services Cookbook,您可以将计算视为资源,只需GET
。例如:
-- Request
GET /computations?param1=2¶m2=2 HTTP/1.1
-- Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"result": 4
}
对于具有少量输入参数的快速计算来说,这听起来不错。但是如果你的计算不是那么你可以使用第二种解决方案。
将计算和结果视为资源。 POST
计算和GET
结果。例如:
首先创建一个计算
-- Request
POST /computations HTTP/1.1
Content-Type: application/json
{
"param1": 2,
"param2": 2
}
-- Response
HTTP/1.1 201 Created
Location: /computations/1
然后你可以得到这个计算
-- Request
GET /computations/1 HTTP/1.1
-- Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"param1": 2,
"param2": 2
}
但你也可以得到这个计算的结果(/computations/1/result
)
-- Request
GET /computations/1/result HTTP/1.1
-- Response
HTTP/1.1 204 No Content
Cache-Control: max-age=3600,must-revalidate
但是哦不!还没有结果。服务器告诉我们在一小时后回来(Cache-Control: max-age=3600,must-revalidate
)并再试一次。第二种解决方案允许您使计算异步(如果需要花费很多时间)或者您可以计算一次,将结果存储在某个DB中,并在下次请求时快速提供。
-- Request
GET /computations/1/result HTTP/1.1
-- Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"result": 4
}
答案 2 :(得分:0)
这个故事的寓意是,使用 REST,您总是假设一种资源,即使实际上不需要并且可能不需要 > 创建。在上面的例子中,如果我既不想存储计算资源(由参数和某种操作组成的 JSON 对象)也不存储计算结果资源怎么办?我不能。我也可以
这里还有一个偷偷摸摸的假设,即 /computation/