我有兴趣将直接 REST 接口暴露给 JSON 文档的集合(想想CouchDB或Persevere)。我遇到的问题是GET
如果集合很大,如何处理集合根目录上的操作。
举个例子,假设我正在公开 StackOverflow 的Questions
表格,其中每一行都作为文档公开(不一定有这样的表格,只是一个相当大的“文档”集合的具体示例)。该集合将在/db/questions
使用通常的 CRUD api时提供GET /db/questions/XXX
,PUT /db/questions/XXX
,POST /db/questions
正在播放中。获取整个集合的标准方法是,GET /db/questions
但如果天真地将每一行作为 JSON 对象转储,您将获得相当大的下载量和服务器方面的大量工作。
解决方案当然是分页。Dojo 在其JsonRestStoreRange
中解决了这个问题,方法是使用带有自定义范围单元的标头的符合 RFC2616 的巧妙扩展items
。结果是 a206 Partial Content
只返回请求的范围。这种方法相对于查询参数的优势在于它将查询字符串留给...查询(例如GET /db/questions/?score>200
,或者某些类似的,是的,它会被编码%3E
)。
这种方法完全涵盖了我想要的行为。问题是RFC 2616在 206 响应中指定了这一点(强调我的):
请求必须包含一个 Range 头字段(第14.35 节)指示所需的范围,并且可以包含一个 If-Range 头字段(第 14.27 节)以使请求有条件。
这在标头的标准用法的上下文中是有道理的,但这是一个问题,因为我希望 206 响应成为处理天真的客户/随机人探索的默认值。
我已经详细查看了 RFC 以寻找解决方案,但对我的解决方案不满意,并且对 SO 对这个问题的看法很感兴趣。
我有过的想法:
200
带头返回Content-Range
!- 我不认为这是错误的,但如果有一个更明显的指标表明响应只是部分内容,我会更喜欢。- Return
400 Range Required
- 对于所需的标头没有特殊的 400 响应代码,因此必须使用默认错误并手动读取。这也使得通过 Web 浏览器(或其他一些客户端,如 Resty)进行探索变得更加困难。 - 使用查询参数- 标准方法,但我希望允许查询 la Persevere,这会切入查询命名空间。
- 刚回来
206
!- 我认为大多数客户不会惊慌失措,但我宁愿不反对 RFC 中的 MUST - 扩展规格!Return
266 Partial Content
- 行为与 206 完全相同,但响应的是不得包含Range
标头的请求。我认为 266 足够高,我不应该遇到碰撞问题,这对我来说很有意义,但我不清楚这是否被视为禁忌。
我认为这是一个相当普遍的问题,我希望看到它以一种事实上的方式完成,这样我或其他人就不会重新发明轮子。
当集合很大时,通过 HTTP 公开完整集合的最佳方式是什么?