RESTFul:使用POST执行算法
RESTFul: Using POST to execute algorithms
我正在设计 REST api,我需要一个使用客户端发送的数据执行算法的端点。
我的第一种方法是使用 GET 端点,因为该算法是幂等的:
Given an input with value "A" it always returns "B" and it never modifies anything in the server.
最好使用 GET 端点对其进行建模,这样我们就可以使用浏览器缓存、书签等。
但是我不能使用 GET 端点,因为该算法需要一个非常大的 JSON 作为输入参数,我不想将此参数作为 URL 参数发送。
鉴于我不能使用 GET,我使用 POST 设计了这个端点。
现在我对HTTP状态码有疑问。
如果算法 return 的结果为空,我将发送 404 状态代码,使用 GET 请求很有意义。
但是现在,使用POST的方法,我觉得有点奇怪:
POST /myAlgorithm
Response: 404 Not Found
听起来用户写错了URL但问题是输入参数,它产生了一个空响应。
所以我的问题是:
我应该 return 一个输入列表来处理这种情况吗?
有人知道如何使用 GET 端点设计这种方法吗?
如果结果为空,并且这是一个合法值,您应该 return 204,这意味着您没有执行错误,但没有什么可说的。
此外,如果调用是幂等的,POST 不是理想的方式。
GET 和 PUT 都被认为是幂等的,但不是 POST(许多参考文献之一 here)。
我想扩展一个答案并用一些概念澄清你的问题。
您的问题以 "RESTFul. Using post to execute algorithms" 开头,有点不准确,因此我们可以快速复习一些概念。
REST 主要且仅与动词相关,以使其简单化。每个网页都是 REST
RESTful 意味着你实现了所有的动词,网页不是 RESTful 除了极少数情况。
大多数时候 RESTful 与面向资源的体系结构并驾齐驱,RESTful 不是体系结构,而是一组设计原则。
RESTful 服务与 ROA(面向资源的体系结构)配合得很好,因为这是一种自然的方式。 ROA 的主要原则是 URI 中的范围,这样客户可以快速了解请求中发生了什么。
GET /users http/1.1
一眼就明白了客户要的是用户列表
我们还有一个不同的体系结构,即经典的 RPC 服务。 SOAP 就是其中之一。 RPC 服务通常 POST 使用信封(任何类型)的操作,并将结果接收到信封中,答案为 200 ok,仅此而已。这当然是许多其他原则的简化,但它有助于理解这个概念。
一个非常好的经验法则说,如果你非常需要 POST 你既不做 REST,也不做 RESTful,或者你正在设计一个 RPC 服务,或者你有明确认为 RESTful 的东西=38=]REST-RPC.
在 RPC 服务中,作用域和方法都包含在信封中。回到你的话:
... an endpoint that executes an algorithm using the data sent by the
client.
这是 RPC 或至少是 REST-RPC 的明显定义
在这种情况下,您不是在对资源进行操作。不涉及资源,您正在执行算法(过程,因此是 RPC)。所以,这里的幂等性根本不适用,没有资源,没有必要使用 GET。
同样,考虑到您需要 POST 您的数据,因为它很大,并且不能将此数据视为范围(例如,Google 中的范围是您传递给引擎的参数集),它不能使用任何经典的 REST 技术,主要是因为您正在进行 RPC 调用。
我的回答是您不需要在 GET 或 RESTful 方面考虑您的服务,将其视为设计的 REST-RPC 混合体。这意味着你 POST 一个信封(你的数据)并得到 200 ok 一个信封作为答案(在你的情况下,操作的结果。
这才是正确的管理方式。
我正在设计 REST api,我需要一个使用客户端发送的数据执行算法的端点。
我的第一种方法是使用 GET 端点,因为该算法是幂等的:
Given an input with value "A" it always returns "B" and it never modifies anything in the server.
最好使用 GET 端点对其进行建模,这样我们就可以使用浏览器缓存、书签等。
但是我不能使用 GET 端点,因为该算法需要一个非常大的 JSON 作为输入参数,我不想将此参数作为 URL 参数发送。
鉴于我不能使用 GET,我使用 POST 设计了这个端点。
现在我对HTTP状态码有疑问。
如果算法 return 的结果为空,我将发送 404 状态代码,使用 GET 请求很有意义。
但是现在,使用POST的方法,我觉得有点奇怪:
POST /myAlgorithm
Response: 404 Not Found
听起来用户写错了URL但问题是输入参数,它产生了一个空响应。
所以我的问题是:
我应该 return 一个输入列表来处理这种情况吗?
有人知道如何使用 GET 端点设计这种方法吗?
如果结果为空,并且这是一个合法值,您应该 return 204,这意味着您没有执行错误,但没有什么可说的。
此外,如果调用是幂等的,POST 不是理想的方式。 GET 和 PUT 都被认为是幂等的,但不是 POST(许多参考文献之一 here)。
我想扩展一个答案并用一些概念澄清你的问题。
您的问题以 "RESTFul. Using post to execute algorithms" 开头,有点不准确,因此我们可以快速复习一些概念。
REST 主要且仅与动词相关,以使其简单化。每个网页都是 REST RESTful 意味着你实现了所有的动词,网页不是 RESTful 除了极少数情况。
大多数时候 RESTful 与面向资源的体系结构并驾齐驱,RESTful 不是体系结构,而是一组设计原则。
RESTful 服务与 ROA(面向资源的体系结构)配合得很好,因为这是一种自然的方式。 ROA 的主要原则是 URI 中的范围,这样客户可以快速了解请求中发生了什么。
GET /users http/1.1
一眼就明白了客户要的是用户列表
我们还有一个不同的体系结构,即经典的 RPC 服务。 SOAP 就是其中之一。 RPC 服务通常 POST 使用信封(任何类型)的操作,并将结果接收到信封中,答案为 200 ok,仅此而已。这当然是许多其他原则的简化,但它有助于理解这个概念。
一个非常好的经验法则说,如果你非常需要 POST 你既不做 REST,也不做 RESTful,或者你正在设计一个 RPC 服务,或者你有明确认为 RESTful 的东西=38=]REST-RPC.
在 RPC 服务中,作用域和方法都包含在信封中。回到你的话:
... an endpoint that executes an algorithm using the data sent by the client.
这是 RPC 或至少是 REST-RPC 的明显定义
在这种情况下,您不是在对资源进行操作。不涉及资源,您正在执行算法(过程,因此是 RPC)。所以,这里的幂等性根本不适用,没有资源,没有必要使用 GET。 同样,考虑到您需要 POST 您的数据,因为它很大,并且不能将此数据视为范围(例如,Google 中的范围是您传递给引擎的参数集),它不能使用任何经典的 REST 技术,主要是因为您正在进行 RPC 调用。
我的回答是您不需要在 GET 或 RESTful 方面考虑您的服务,将其视为设计的 REST-RPC 混合体。这意味着你 POST 一个信封(你的数据)并得到 200 ok 一个信封作为答案(在你的情况下,操作的结果。
这才是正确的管理方式。