【发布时间】:2011-07-02 01:13:00
【问题描述】:
我正在为接受用户贡献数据的服务编写 REST API。我想保持所有操作完全异步,这包括 PUT、POST、DELETE 甚至 GET 请求。我的想法是接收请求,对其进行足够的处理以确保它是一个有效的请求,然后传递一个 HTTP 202 接受的响应以及一个数据最终可用的 url 和一个令牌,以便后续请求可以与处理后的数据相匹配.如果请求无效,我将发送 HTTP 400。
然后,客户端将负责检查我在将来某个时间提供给他们的 url 并传递令牌。如果数据可用,我会返回正常的 200 或 201,但如果我仍在处理请求,我将发送另一个 202,表示处理尚未完成。如果处理数据出现错误,我将根据需要发送 4xx 或 5xx 状态。
我想这样做的原因是我可以将所有有效请求转储到请求池中,并让工作人员从队列中拉出并处理可用的请求。由于我不知道池的大小或可用工作人员的数量,我无法确定我是否可以足够快地满足请求,以满足 Google App Engine 的 30 秒限制。
我的问题是:我是否通过以这种方式处理请求来破坏 REST?例如,浏览器似乎需要立即响应请求。对于我的 HTML 页面,我计划使用结构化页面进行响应,然后使用 AJAX 处理数据请求。
我对以这种方式使用 REST 处理数据的任何意见或经验最感兴趣。
【问题讨论】:
-
您希望浏览器直接使用它吗?因为这个解决方案对于 API 来说似乎很好(参见 @systempuntoout 的回答),但它显然不适用于网络浏览器。
-
我将尝试将浏览器限制为 GET 操作,其中最有可能的查询保存在内存中(例如 memcached)。任何长期查询都可能通过 AJAX 使用显示进度表的轮询来完成(例如过滤大型结果集)。 PUT 和 POST 可能类似于上传 youtube 视频,在服务器完成任务之前,我会给用户一个标准的“您的媒体正在处理中”消息。
标签: rest