我有兴趣向JSON文档集合公开直接的REST接口(请考虑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通过在其JsonRestStore中使用Range
与自定义范围单位一起使用标头的RFC2616兼容扩展,解决了此问题items
。结果是206 Partial Content
仅返回要求范围的。与查询参数相比,此方法的优势在于,它将查询字符串留给...查询(例如GET /db/questions/?score>200
,诸如此类,是的,将被编码%3E
)。
这种方法完全涵盖了我想要的行为。问题在于RFC 2616在206响应上指定了此内容(重点是我的):
该请求必须包含指示所需范围的Range标头字段(第14.35节),并且可能包含If-Range标头字段(第14.27节)以使请求成为条件请求。
这在标头的标准用法的上下文中是有道理的,但是这是一个问题,因为我希望206响应是默认值,以处理幼稚的客户/随机人员进行探索。
我已经详细研究了RFC,以寻找解决方案,但对我的解决方案不满意,并且对SO解决该问题很感兴趣。
我的想法:
200
带Content-Range
标题返回!-我不认为这是错误的,但是我希望有一个更明显的指示,即响应只是部分内容。- 返回
400 Range Required
-所需的标头没有特殊的400响应代码,因此必须使用默认错误并手动读取。这也使得通过Web浏览器(或诸如Resty之类的其他客户端)进行探索变得更加困难。 - 使用查询参数 -一种标准方法,但是我希望允许进行la la Persevere查询,这切入了查询名称空间。
- 刚回来
206
!-我认为大多数客户不会害怕,但我不想违反RFC中的MUST - 扩展规格!返回值
266 Partial Content
-行为与206完全相同,但响应于不得包含Range
标头的请求。我认为266足够高,因此我不应该遇到碰撞问题,这对我来说很有意义,但是我不清楚这是否被视为禁忌。
我认为这是一个相当普遍的问题,我希望以某种事实上的方式完成此任务,因此我或其他人不会重新发明轮子。
当集合很大时,通过HTTP公开完整集合的最佳方法是什么?
Range = "Range" ":" ranges-specifier
在tools.ietf.org/html/rfc2616#section-14.35.1中后者的位置仅描述为“ byte-ranges-specifier”,其必须以“ bytes-unit”开头,并定义为字符串“ bytes” ”。
Content-Range
报头适用于所述主体(可以与请求上载大文件等时下载时使用,或用于响应)。所述Range
报头被用来请求在一定的范围。206
当Range
标头包含在请求中时,应该做出回应。如果不是,则响应可能仍包含Content-Range
标头,但响应代码应为200
。实际上,此标头似乎是分页的理想选择。