用于无状态计算的REST服务

时间:2015-03-30 09:22:17

标签: rest web-services restful-architecture

我需要在我的REST API中创建一个用于执行某些计算的方法。为简单起见,假设我需要实现一个方法,该方法对于给定的对象列表将返回其长度。

它应该只计算长度并返回到客户端,因此服务器端不会修改任何资源。由于它不会修改任何资源,因此可以预期它应该是GET请求。但是,由于列表可能很大且对象可能很复杂,我看起来需要将其作为POST请求。但是,这将违反在REST中用于创建资源的POST标准。

这个问题的解决方案是什么?

3 个答案:

答案 0 :(得分:2)

务实回答:使用POST

小心地回答:使用POST。您的请求包含您希望服务器临时创建的资源(或资源集)(对象列表)。如果服务器发生在成功处理POST后立即删除该资源,那该怎么办?

答案 1 :(得分:1)

第一种解决方案

根据RESTful Web Services Cookbook,您可以将计算视为资源,只需GET。例如:

-- Request
GET /computations?param1=2&param2=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 对象)也不存储计算结果资源怎么办?我不能。我也可以

  1. 使用 GET 将其视为虚假资源(假设它存在)或
  2. 使用单个 POST 创建两个资源 - 一个用于计算,一个用于其结果 - 然后使用相应的 GET 检索其中任何一个。

这里还有一个偷偷摸摸的假设,即 /computation//result 没有 POST,因为结果仅通过计算创建。