返回202“已接受”以响应HTTP GET是否错误?


88

我有一组延迟创建的资源。构造这些表示的计算可能要花费几毫秒到几小时不等,具体取决于服务器负载,特定资源和月球相位。

收到的对资源的第一个GET请求开始在服务器上进行计算。如果计算在几秒钟内完成,则返回计算的表示形式。否则,将返回202“已接受”状态代码,并且客户端必须轮询资源,直到最终表示可用为止。

出现这种现象的原因如下:如果结果在几秒钟内可用,则需要尽快对其进行检索。否则,何时可用并不重要。

由于有限的内存和庞大的请求量,NIO或长时间轮询都不是一种选择(即,我无法打开几乎足够的连接,甚至什至无法容纳所有请求;一次“几秒钟”)已通过,我将保留多余的请求)。同样,客户端的限制使得它们不能处理完成回调。最后,请注意,我对创建一个“工厂”资源并没有兴趣,因为额外的往返行程意味着我们使分段实时约束失败的程度超出了期望(此外,这是额外的复杂性;此外,这是一种资源受益于缓存)。

我以为在响应GET请求时返回202“已接受”状态代码存在一些争议,因为我在实践中从未见过这种方法,并且最直观的用法是响应不安全的方法,但是我从未发现任何特别令人沮丧的东西。此外,我既不保留安全性又没有幂等性吗?

那么,人们如何看待这种方法呢?

编辑:我应该提到这是针对所谓的业务Web API的,而不是针对浏览器的。


2
我个人认为这是一个很好的定义,恰恰是的定义202。实际上,恕我直言很少使用它,因为很少有Web开发人员关心适当的状态代码,因为他们更习惯于浏览器/用户-代理交互,在这种情况下,a202不会给他们任何可见的线索(给他们a 200,他们会很高兴。 ..)。
Wrikken 2010年

1
@ user359996,只需使用即可200202应该的,但实际上人们并不期望202
Pacerier,2015年

它实际上需要200的ETA才能有用。
罗布(Rob)

Answers:


65

如果它是一个明确定义和-documented API,202声音正是适合发生了什么。

如果是用于公共Internet,我会太担心客户端兼容性。我已经看过太多if (status == 200)硬编码了。。。那种情况下,我会返回200

同样,RFC并未表示对202使用GET请求是错误的,尽管它在其他代码描述(例如200)中做出了明显区分。

该请求已被接受进行处理,但是处理尚未完成。


15

我们是针对最近的应用程序执行此操作的,客户端(自定义应用程序,而不是浏览器)对查询进行POST,服务器将返回202,其中包含URI到要发布的“作业”中-客户端将使用该URI来轮询结果-这似乎很适合所进行的工作。

无论如何,这里最重要的是记录服务/ API的工作方式以及202响应的含义。


+1感谢您的评论。关于文档的要点。但请注意对我的问题所作的澄清编辑(请查找“工厂”)。
user359996

好吧,如果您只想轮询最初请求的URI,则可以在响应中省略该URI。(只是文件应如何工作:-))

好主意,但请记住我要缓存,所以不需POST。而且,URI指定资源而不是方法。我采用的是RESTful而不是RPC的方法(抱歉,另一个未指定的约束-我的错)。
user359996

确切地说,我所说的“ RESTful”实际上是“面向资源的”,从技术上讲,它比REST约束所指定的要多。
user359996

12

我记得-GET应该返回资源而不修改服务器。可能会记录活动或您的活动,但该请求应可重新运行,结果相同。

另一方面,POST是更改服务器上某些设备状态的请求。插入一条记录,删除一条记录,运行一个作业,诸如此类。202适用于返回但尚未完成但实际上不是GET请求的POST。

这都是非常清教徒的,在野外没有很好的实践,因此返回202可能会很安全。GET应该返回200。如果POST完成,则返回200;如果未完成,则返回202。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


4
很好的想法,但我不确定它是否适用于此:从OP的角度来看,这似乎是一个正确的GET请求(因为它不会更改服务器上的任何内容),因此计算和导入所需的时间更长这种情况,将在另一个时间获取。也许OP可以发表权威评论。这是一个API所以它的精细是“清教徒”一个干净的界面的缘故
佩卡

哦,佩克斯佩卡。没错,GET是必经之路。而且我认为HTTP SPC并未真正考虑尚未准备好的GET。于是,他可能会有两种结果
Dlongnecker

7
(不相关)权威评论:是的,我认为这是幂等的。该资源既不被修改也没有创造,而是公司表示尚未计算。
user359996

1
它在哪里说呢?另外,如果我返回200,则客户端应该期望返回了表示形式,但是没有返回。
user359996

1
我把它收回。202似乎不只与GET或POST对应。当我查看该协议时,只是我的思维定势使我发现202仅存在于GET请求中。202应该适合您的目的。
Dlongnecker

0

如果资源应该具有由ID明确指定的实体的表示形式(而不是问题中所描述的“工厂”资源),则我建议使用GET方法,并且当实体/表示由于懒惰创建或任何其他临时情况而无法使用时,请使用更合适的503 Service Unavailable响应代码,该代码实际上是针对此类情况设计的。

可以在HTTP本身的RFC中找到此原因(请验证503响应代码的描述)以及许多其他资源。

请与HTTP状态代码比较暂时不可用的页面。尽管该问题是关于不同的用例的,但实际上它与HTTP的完全相同的功能有关。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.