用于无状态计算的REST服务

问题描述 投票:0回答:2

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

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

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

rest web-services restful-architecture
2个回答
2
投票

务实的答案:使用POST

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


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
}
© www.soinside.com 2019 - 2024. All rights reserved.