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