我正在设计REST api,我需要一个使用客户端发送的数据执行算法的端点。
我的第一种方法是使用GET端点,因为算法是幂等的:
给出一个有价值的输入" A"它总是回归" B"它永远不会修改服务器中的任何内容。
使用GET端点对此进行建模会很棒,因此我们可以使用浏览器缓存,书签等。
但是我无法使用GET端点,因为算法需要非常大的JSON作为输入参数,我不想将此参数作为URL参数发送。
看到我无法使用GET,我使用POST设计了这个端点。
现在我对HTTP状态代码有疑问。
如果算法返回一个空结果,我将使用GET请求发送404状态代码,这很有意义。
但现在,使用POST方法,对我来说似乎有点奇怪:
POST /myAlgorithm
Response: 404 Not Found
听起来用户写错了网址,但问题是输入参数,产生空响应。
所以我的问题是:
我应该返回一个输入列表来处理这种情况吗?
有人知道如何使用GET端点设计这种方法吗?
答案 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(在你的情况下,是操作的结果。
这将是管理它的正确方法。