Rest 使用http状态202进行异步操作

Rest 使用http状态202进行异步操作,rest,Rest,我正在为一个将接受用户贡献的数据的服务编写RESTAPI。我希望保持所有操作完全异步,包括PUT、POST、DELETE甚至GET请求。我的想法是接收请求,对其进行足够的处理以确保它是一个有效的请求,然后传递一个HTTP 202接受的响应,以及一个最终可以使用数据的url和一个令牌,以便后续的请求可以与处理过的数据相匹配。如果请求无效,那么我将发送HTTP 400 然后,客户机将负责在将来某个时候检查我提供给他们的url,并传递令牌。如果数据可用,我返回正常的200或201,但如果我仍在处理请求

我正在为一个将接受用户贡献的数据的服务编写RESTAPI。我希望保持所有操作完全异步,包括PUT、POST、DELETE甚至GET请求。我的想法是接收请求,对其进行足够的处理以确保它是一个有效的请求,然后传递一个HTTP 202接受的响应,以及一个最终可以使用数据的url和一个令牌,以便后续的请求可以与处理过的数据相匹配。如果请求无效,那么我将发送HTTP 400

然后,客户机将负责在将来某个时候检查我提供给他们的url,并传递令牌。如果数据可用,我返回正常的200或201,但如果我仍在处理请求,我将发送另一个202,指示处理尚未完成。如果处理数据时出错,我将根据需要发送4xx或5xx状态

我这样做的原因是,我可以将所有有效的请求转储到请求池中,并让工作人员从队列中提取请求,并在请求可用时进行处理。由于我不知道池的大小或可用的工作人员的数量,我无法确定我是否能够以足够快的速度处理请求,以满足Google App Engine的30秒限制

我的问题是:我以这种方式处理请求是否妨碍了REST?例如,浏览器似乎需要立即响应请求。对于HTML页面,我计划使用结构化页面进行响应,然后使用AJAX处理数据请求


我最感兴趣的是以这种方式使用REST处理数据的任何观点或经验。

我认为您的解决方案很好,
Http状态202
是在这种特定情况下使用的选项,表示请求已被接受进行处理,但处理尚未完成

在您的工作流程中,我要稍微更改的是后续请求的
Http状态

正如您所说,
202响应
应该返回一个
Location头
,指定客户端应该使用的URL来监视其先前请求的状态。
调用此项检查我的进程URL的状态,而不是在进程挂起的情况下返回202,我将返回:

  • 200正常
    当请求的进程仍处于挂起状态时。响应应描述流程的挂起状态
  • 201在处理完成后创建。GET/PUT/POST的响应应该包含请求/创建/更新的资源的位置
    
    把我的两分钱加到一个老问题上。我的想法类似于systempuntoout和Avi Flax的建议

    我同意
    http202
    响应适合通过
    Location
    头重定向到另一个资源的初始请求

    我认为
    位置
    URL可能应该包括您引用的令牌,以符合
    位置
    重定向的常见期望。例如
    Location:/queue?token={unique\u token}
    Location:/task/{unique\u token}

    我还认为,当“检查状态”操作成功时,用于检查进程状态的资源应该返回
    http200
    响应(而不是
    http202
    ,因为这意味着当前请求已“接受”)

    但是,我认为在创建新实体时,“检查状态”应该返回一个
    http303
    ()响应,并在创建新实体后返回一个
    Location
    头。这比发送
    http201
    更合适,因为刚刚执行了
    GET
    请求以检查状态,因此没有创建任何内容


    我还认为用于检查状态的资源应该适当地返回错误代码。每当成功执行“检查状态”时,应返回相应的成功代码。可以在应用程序级别处理错误(通过检查响应正文)。

    这是一个非常古老的问题,但我想提供一个稍微不同的观点,我并不声称这是正确的,只是我的观点

    从客户角度看

    让我们从最初的HTTP请求开始。首先,请求应该是POST。您正在向服务器发送消息以创建资源。在这种情况下,GET和PUT无效,因为:

    • GET在此上下文中无效,因为GET旨在获取特定位置的资源
    • PUT无效,因为您不是在创建请求,而是在请求服务器创建请求
    从服务角度看

    因此,现在您正在向服务器发送POST以处理请求。服务器实际上有3个可能的返回值(不包括4xx和5xx错误):

    • “201 Created”表示服务获得了请求,并且能够立即或在可接受的时间段内处理该请求。这个时间段完全取决于服务设计。这由服务开发人员来定义
    • “202已接受”表示服务已收到请求并正在处理该请求。当服务知道某事需要一段时间时,使用此选项。另一种观点是,如果服务依赖于任何其他无法确定结果的异步操作,那么它应该返回“202接受”响应。最后,一些服务设计者可能总是简单地返回“202 Accepted”,而不管它能以多快的速度完成
    • 在某些情况下,你会得到一个“302发现”。通常情况下,服务可以将请求标识为生成已经存在(并且仍然有效且未处于错误状态)的资源,并且重用现有资源是可以接受的。并非所有的服务都是这样工作的:发布评论t