首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于无状态计算的REST服务

用于无状态计算的REST服务
EN

Stack Overflow用户
提问于 2015-03-30 17:22:17
回答 3查看 280关注 0票数 3

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2015-03-30 17:36:20

实用的答案:使用POST

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

票数 3
EN

Stack Overflow用户

发布于 2017-12-19 23:30:57

第一个解决方案

根据RESTful Web Services Cookbook的说法,你可以把你的计算当作一种资源,然后直接GET它。例如:

代码语言:javascript
复制
-- Request
GET /computations?param1=2&param2=2 HTTP/1.1

-- Response
HTTP/1.1 200 OK
Content-Type: application/json

{
    "result": 4
}

它听起来很适合于使用少量输入参数进行快速计算。但是如果你的计算不是这样,那么你可以使用第二种解决方案。

第二种解决方案

将计算和结果都视为资源。POST计算和GET结果。例如:

首先,创建一个计算

代码语言:javascript
复制
-- Request
POST /computations HTTP/1.1
Content-Type: application/json

{
    "param1": 2,
    "param2": 2
}

-- Response
HTTP/1.1 201 Created
Location: /computations/1

然后你就可以得到这个计算结果了

代码语言:javascript
复制
-- Request
GET /computations/1 HTTP/1.1

-- Response
HTTP/1.1 200 OK
Content-Type: application/json

{
    "param1": 2,
    "param2": 2
}

而且您还可以获得此计算的结果(/computations/1/result

代码语言:javascript
复制
-- 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中,并在下次请求时快速提供它。

代码语言:javascript
复制
-- Request
GET /computations/1/result HTTP/1.1

-- Response
HTTP/1.1 200 OK
Content-Type: application/json

{
    "result": 4
}
票数 3
EN

Stack Overflow用户

发布于 2021-03-20 15:23:21

这里的故事的寓意是,对于REST,你总是假设一个资源,即使在现实中,一个资源是 needed,并且很可能是而不是 created。在上面的示例中,如果我既不想存储计算资源(由参数和某种操作组成的JSON对象),也不想存储计算结果资源,该怎么办?我不能。我可以

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

这里还有一个偷偷摸摸的假设,那就是没有对/computation//result的POST,因为结果只能通过计算来创建。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29342544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档