REST Web 应用程序中的分页

Posted

技术标签:

【中文标题】REST Web 应用程序中的分页【英文标题】:Pagination in a REST web app 【发布时间】:2011-03-11 20:08:05 【问题描述】:

通常,用户进行搜索,获取命中列表,然后可以浏览它。命中列表是在整个浏览过程中保持一致的中间结果,通常存储在会话状态中。例如。如果其他人同时添加了新项目,它们只会出现在随后的搜索中。

在 REST 应用程序中,我不能轻易获得这个中间结果——它既不属于客户端,也不属于模型。我已阅读Pagination in a REST web app,但我对答案并不完全清楚。那里的解决方案似乎假设在用户浏览结果时模型没有更新。

我们当然可以将世界(模型)想象成一系列不可变的快照。通过提供时间戳(或全局版本号),我们可以得到模型当时的一致视图,从概念的角度解决了问题。然而,它确实意味着模型的完整版本。 (我也想知道是否与函数式编程有联系)

我应该如何处理这个问题?

注意:我问是因为我打算使用play framework,它根本没有 HTTP 状态或会话的概念;这是纯粹的宁静。

【问题讨论】:

【参考方案1】:

我有点不知道你的上下文是什么,但如果我必须提供一个简短的答案,那就是搜索结果应该是模型的一部分。我假设您有一个可搜索的模型。您所做的是索引搜索和存储索引信息所需的部分(也使其成为模型的一部分)。执行搜索时,查询索引并显示结果。除非重新生成索引,否则第二次执行搜索不会包含新添加的项目。

这消除了使用任何会话状态的需要并使其保持安静,因为索引只是对资源执行的另一个操作。这是你需要的吗?

【讨论】:

域模型由持久实体组成。您是否建议我也应该保留搜索结果本身?【参考方案2】:

在第一次搜索得到查询结果后,您可以将结果保存在缓存中。对于一台服务器,它可以是 ehcache(play 中支持)或 memcached(play 也支持),用于集群环境。您可以通过静态名称 + 会话 ID 保存结果。因此,您只需要每个请求的会话 id,它保存在客户端 cookie 中并在您的 play 应用程序中可用。 您可以使用缓存数据来浏览页面。我也推荐 ElasticSearch。

编辑:更好的方法是您可以使用 play-search http://github.com/jfp/play-search,示例:

    Query q = Search.search("object:dogs", Folder.class);
q.orderBy("object")
    .page(2,5)
    .reverse();

PS:您对 Play 的决定是完美的。我是一名专业的 .net 开发人员,我可以说世界上唯一可以与 asp.net mvc 2 竞争的(最佳)Web 框架是 Play 框架。 Grails 有缺陷,Django/Python、Yii/php、Rails 都很慢,类型不安全,与 jvm/clr 框架相差甚远。 wicket、tapestry、struts、jsf、spring mvc 都是冗长而无用的。 spring roo 只是一个模板生成器。 Asp.net mvc 超越了 asp.net 并成为了 .net 的第一大开发平台,但是 sun 为下一代的 jsf 的旧 asp.net 克隆工作,大错特错。在我看来,java 的唯一希望是 play framework。有了 scala 模块,就完美了……

【讨论】:

然后我将研究一下缓存功能。但是无论用户会话是否超时,搜索结果都可以随时从缓存中清除,不是吗? play.Cache 走的路...播放搜索看起来很有趣,谢谢! 播放框架中缓存的文档:playframework.org/documentation/1.1/cache

以上是关于REST Web 应用程序中的分页的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架的分页 URL 中更改下一个键中的主机?

如何使用java中的selenium Web驱动程序中的分页搜索表中的元素

概括 REST API 的分页技术

Advantage 数据库中的分页

JDBC在Java Web中的应用——分页查询

web.py 中的分页设计