RESTFul:使用POST执行算法

时间:2015-11-20 10:32:15

标签: algorithm rest post get restful-architecture

我正在设计REST api,我需要一个使用客户端发送的数据执行算法的端点。

我的第一种方法是使用GET端点,因为算法是幂等的:

  

给出一个有价值的输入" A"它总是回归" B"它永远不会修改服务器中的任何内容。

使用GET端点对此进行建模会很棒,因此我们可以使用浏览器缓存,书签等。

但是我无法使用GET端点,因为算法需要非常大的JSON作为输入参数,我不想将此参数作为URL参数发送。

看到我无法使用GET,我使用POST设计了这个端点。

现在我对HTTP状态代码有疑问。

如果算法返回一个空结果,我将使用GET请求发送404状态代码,这很有意义。

但现在,使用POST方法,对我来说似乎有点奇怪:

POST /myAlgorithm
Response: 404 Not Found

听起来用户写错了网址,但问题是输入参数,产生空响应。

所以我的问题是:

我应该返回一个输入列表来处理这种情况吗?

有人知道如何使用GET端点设计这种方法吗?

2 个答案:

答案 0 :(得分:3)

如果你的结果是空的并且这是一个合法的价值你应该返回204,这意味着你没有执行任何错误,但根本没什么可说的。

此外,如果呼叫是幂等的,POST不是理想的方式。 假设GET和PUT都是幂等的,但不是POST(许多引用中的一个here)。

答案 1 :(得分:1)

我想扩展一个答案,并用一些概念澄清你的问题。

你的问题从“RESTFul。使用post执行算法”开始,这有点疏远,所以我们可以快速回顾一些概念。

REST主要与VERBs相关,只是简单地与VERBs相关。每个网页都是REST RESTful意味着您实现所有VERB,除极少数情况外,网页不是RESTful。

大多数时候,RESTful与Resource Oriented(一种架构)相关,RESTful不是一种架构,它是一套设计原则。

RESTful服务与ROA(面向资源的体系结构)非常相似,因为它是自然的方式。 ROA的主要原则是范围在URI中,因此客户可以快速了解查看请求的内容。

GET /users http/1.1

一眼就能清楚地了解客户希望用户列表。

此外,我们将经典的RPC服务作为不同的架构。 SOAP就是其中之一。 RPC服务通常使用信封(任何类型)POST一个动作,并将结果接收到一个200 ok答案且不超过该信封的信封中。这当然是对许多其他原则的简化,但它有助于理解这个概念。

一个非常好的经验法则说,如果你非常需要POST,你既不是REST也不是RESTful,或者你正在设计一个RPC服务,或者你有一些明确被认为是 REST-RPC 的东西。

在RPC服务中,范围和方法进入了包络。回到你的话:

  

...使用由...发送的数据执行算法的端点   客户端。

这是RPC或至少REST-RPC的明显定义

在这种情况下,您不是在资源上行事。没有涉及资源,你正在执行一个算法(进程,因此,它是RPC)。所以,这里的幂等性根本不适用,没有资源,没有必要使用GET。 再次,考虑到你需要POST数据,因为它很大,而且这些数据不能被视为范围(例如,Google中的范围是你传递给引擎的参数集),它不能使用任何经典的REST技术,主要是因为你在做RPC调用。

我的回答是你不需要在GET或RESTful方面考虑你的服务,认为它是一个REST-RPC混合体,因为它是设计的。这意味着你发一个信封(你的数据)并以信封作为答案得到200 ok(在你的情况下,是操作的结果。

这将是管理它的正确方法。