是否错误返回202“接受”响应HTTP GET?
我有一组资源,其表示是懒洋洋地创build的。 构build这些表示所需的计算可能需要几毫秒到几个小时,具体取决于服务器负载,具体资源和月相。
为资源收到的第一个GET请求将启动服务器上的计算。 如果计算在几秒内完成,则返回计算的表示forms。 否则,将返回202“已接受”状态码,客户端必须轮询资源,直到最终的表示forms可用。
造成这种行为的原因如下:如果结果在几秒钟内可用,则需要尽快检索; 否则,当它变得可用时并不重要。
由于有限的内存和大量的请求,无论是NIO还是长轮询都不是一个select( 即我不能保持足够的连接打开,甚至我甚至不能适应内存中的所有请求;一旦“几秒钟”已经过去了,我坚持了多余的要求)。 同样,客户端限制是这样的,他们不能处理完成callback,而是。 最后,请注意,我不想创build一个POST的“工厂”资源,因为额外的往返意味着我们失败了分段实时约束超过所需(此外,这是额外的复杂性;而且,这是一个资源受益于caching)。
我想在回应一个GET请求时返回一个202“Accepted”状态代码是有争议的,因为我从来没有在实践中看到它,最直观的用法是响应不安全的方法,但我从来没有发现任何特别令人沮丧的事情。 而且,我不是既保护安全又是ide </s>?
那么,人们对这种方法有什么看法呢?
编辑 :我应该提到这是所谓的商业Web API – 不适用于浏览器。
如果是为了一个定义良好的文档API, 202
听起来恰到好处。
如果是公共互联网,我会担心客户端的兼容性。 我已经看到很多if (status == 200)
硬编码….在这种情况下,我会返回一个200
。
此外, RFC并没有指出使用202作为GET请求是错误的,而在其他代码描述(例如200)中则明确区分。
该请求已被接受处理,但处理尚未完成。
我们为最近的一个应用程序做了这样的工作,一个客户端(自定义的应用程序,而不是浏览器)POST了一个查询,服务器会返回一个URI到发送的“job”的URI – 客户端将使用该URI来轮询结果 – 这似乎很适合正在做的事情。
这里最重要的是logging你的服务/ API是如何工作的,202是什么意思。
从我记得的东西 – GET应该返回一个资源,而无需修改服务器。 也许活动将被logging或你有什么,但请求应该可以重新运行的结果相同。
另一方面,POST是一个请求来改变服务器上的东西的状态。 插入一条logging,删除一条logging,运行一个工作,类似的东西。 202适合于返回但未完成的POST,但不是真正的GET请求。
这是非常清教徒,并没有在野外练习,所以你可能是安全的返回202. GET应该返回200. POST可以返回200,如果它完成或202如果没有完成。