我需要在我的REST API中创建一个方法,用于执行一些计算。为简单起见,假设我需要实现一个方法,该方法对于给定的对象列表将返回其长度。
它应该只计算长度并返回到客户端,因此服务器端不会修改任何资源。因为它不修改任何资源,人们会认为它应该是GET
请求。但是,由于列表可能很大而且对象可能很复杂,看起来我需要将其作为POST
请求。然而,这将违反在REST中用于创建资源的POST
的标准。
你对这个问题的解决方案是什么?
务实的答案:使用POST
。
狡猾地回答:使用POST
。您的请求包含您希望服务器临时创建的资源(或资源集)(对象列表)。如果服务器碰巧在成功处理POST
后立即删除了该资源,那该怎么办?
根据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
}