我需要在REST API中创建一个方法,用于执行一些计算。为简单起见,假设我需要实现一个方法,对于给定的对象列表,该方法将返回其长度。
它应该只计算长度并返回给客户端,所以服务器端不会修改任何资源。由于它不修改任何资源,因此应该是一个GET
请求。但是,由于列表可能很大,对象可能很复杂,所以看起来我需要将其作为POST
请求。然而,这违反了在REST中使用POST
创建资源的标准。
你对这个问题的解决方案是什么?
发布于 2015-03-30 09:36:20
实用的答案:使用POST
。
简单的回答是:使用POST
。您的请求包含您希望服务器临时创建的一个资源(或一组资源)(对象列表)。如果服务器碰巧在成功处理POST
之后立即删除了该资源,那该怎么办呢?
发布于 2017-12-19 15:30:57
第一个解决方案
根据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
}
发布于 2021-03-20 07:23:21
这里的故事的寓意是,对于REST,你总是假设一个资源,即使在现实中,一个资源是 needed,并且很可能是而不是 created。在上面的示例中,如果我既不想存储计算资源(由参数和某种操作组成的JSON对象),也不想存储计算结果资源,该怎么办?我不能。我可以
这里还有一个偷偷摸摸的假设,那就是没有对/computation//result的POST,因为结果只能通过计算来创建。
https://stackoverflow.com/questions/29342544
复制相似问题