最近,我一直在对该问题以及其他与REST调页相关的问题进行广泛的研究,并认为在此处添加我的一些发现具有建设性。我正在扩展这个问题,以包括有关分页的思想以及与之密切相关的计数。
标头
寻呼元数据以响应头的形式包含在响应中。这种方法的最大好处是响应有效载荷本身就是实际数据请求者所要求的。对于对寻呼信息不感兴趣的客户端,可以更轻松地处理响应。
在野外使用了一堆(标准和自定义)标头,以返回与分页相关的信息,包括总数。
X总数
X-Total-Count: 234
我在野外发现的一些 API中都使用了它。也有NPM软件包可用于对此标头添加支持,例如回送。一些文章建议也设置此标头。
它通常与Link
标头结合使用,这是一个很好的分页解决方案,但缺少总数信息。
链接
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
我觉得,从这个题目读了很多,那一般的共识是使用Link
头提供使用分页链接到客户rel=next
,rel=previous
等这里的问题是,它缺乏一共有多少记录有信息,这是为什么许多API将此与X-Total-Count
标头结合在一起
或者,某些API(例如JsonApi标准)使用该Link
格式,但是将信息添加到响应信封中,而不是添加到标头中。这简化了对元数据的访问(并创建了一个添加总计数信息的位置),但以增加访问实际数据本身(通过添加信封)的复杂性为代价。
内容范围
Content-Range: items 0-49/234
由名为Range标头的博客文章推动,我选择了您(用于分页)!。作者强烈建议使用Range
和Content-Range
标头进行分页。当我们仔细阅读这些标头上的 RFC时,我们发现RFC确实预期将它们的含义扩展到字节范围之外,并且明确允许这样做。当在items
而不是的上下文中使用时bytes
,Range标头实际上为我们提供了一种方法,既可以请求一定范围的项目,又可以指示响应项目所涉及的总结果的范围。此标题还提供了一种显示总计数的好方法。这是一个真正的标准,大多数情况下都是一对一地映射到分页。它也用于野外。
信封
许多API,包括我们最喜欢的Q&A网站中的 API,都使用一个信封,即数据周围的包装材料,用于添加有关数据的元信息。同样,OData和JsonApi标准都使用响应信封。
这个问题的最大缺点是处理响应数据变得更加复杂,因为必须在信封的某个位置找到实际数据。该信封也有许多不同的格式,您必须使用正确的格式。这表明OData和JsonApi的响应包络截然不同,OData在响应中的多个点混合在元数据中。
单独的端点
我认为其他答案已经足够涵盖了这一点。我没有进行太多调查,因为我同意这样的说法,因为您现在拥有多种类型的端点,这令人困惑。我认为每个端点代表一个(一个或多个)资源是最好的。
进一步的想法
我们不仅需要传达与响应相关的分页元信息,还允许客户端请求特定的页面/范围。有趣的是,从这方面来看,最终得到一个连贯的解决方案。在这里,我们也可以使用标头(Range
标头似乎很合适)或其他机制,例如查询参数。有些人主张处理结果作为单独的资源,这可能是有意义的一些使用情况下(例如页面/books/231/pages/52
。最后我选择经常使用的请求参数,如野生范围pagesize
,page[size]
并且limit
等除了支持的Range
标题(和请求参数以及)。