代码之家  ›  专栏  ›  技术社区  ›  user359996

返回202“Accepted”以响应HTTP GET是错误的吗?

  •  76
  • user359996  · 技术社区  · 15 年前

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

    此行为的原因如下:如果结果在几秒钟内可用,则需要尽快检索它;否则,当它可用时并不重要。

    我无法保持几乎足够的连接打开,甚至无法在内存中容纳所有的请求;一旦“几秒钟”过去,我将保留多余的请求)。同样,客户端限制使得它们无法处理完成回调。最后,注意,我不感兴趣创建一个“工厂”资源,一个帖子,作为额外的往返行程意味着我们失败的分段实时约束超过期望的(此外,它是额外的复杂性;而且,这是一个资源,将受益于缓存)。

    我想对于返回202个“已接受”状态代码以响应GET请求有一些争议,因为我在实践中从未见过它,而且它最直观的用法是响应不安全的方法,但我从未发现任何具体的阻碍它的东西。而且,我不是同时保留了安全性和幂等性吗?

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

    :我应该提到的是,这是一个所谓的业务web API,而不是浏览器。

    4 回复  |  直到 15 年前
        1
  •  62
  •   Pekka    15 年前

    如果是一个定义良好且有文档记录的API, 202 声音 对所发生的一切都是正确的。

    if (status == 200) 硬编码。。。。如果那样的话,我会返回一个 200 .

    RFC 不表示对GET请求使用202是错误的,但它在其他代码描述(例如200)中有明显的区别。

        2
  •  14
  •   nos    15 年前

    我们这样做是为了最近的一个应用程序,一个客户端(自定义应用程序,而不是浏览器)发布了一个查询,服务器将返回202,其中包含一个发送到“作业”的URI,客户端将使用该URI来轮询结果,这似乎很适合正在做的事情。

    无论如何,这里最重要的事情是记录您的服务/API是如何工作的,以及202的响应意味着什么。

        3
  •  10
  •   Dlongnecker    15 年前

    据我所知,GET应该在不修改服务器的情况下返回资源。也许活动会被记录下来,或者你有什么,但是请求应该可以用相同的结果重新命名。

    另一方面,POST是更改服务器上某些内容的状态的请求。插入记录、删除记录、运行作业等。202适合于返回但未完成但不是真正的GET请求的POST。

    这都是清教徒的作风,而且在野外也没有很好的训练,所以你返回202可能是安全的。GET应该返回200。POST完成后可以返回200,否则返回202。

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

        4
  •  0
  •   Hermes    7 年前

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

    请与 HTTP status code for temporarily unavailable pages . 尽管这个问题是关于一个不同的用例,但它实际上与HTTP的完全相同的特性有关。