在基于RESTful的应用程序中管理状态

我们正在评估用于基于Web的应用程序的技术,并且一些建议是采用基于RESTful的服务方法。 技术堆栈

1)Spring 2)Apache CXF(JAX-RS)

我的问题是

1)如何在请求之间管理状态。 例如,用户已经过身份validation,现在他正在发出一系列请求,让我们通过分页报告。 我想这会是这样的URL

domain.com/reports/customreport/page/1 domain.com/reports/customreport/page/2等…

a)存储用户信息和请求参数的位置,以便可以在请求之间共享。 b)让我们说结果是流式传输,Rowset存储在哪里?

是否有类似于Petclinic的完整示例应用程序可以为此类应用程序提供最佳实践。

如果您正在严格/正确地执行RESTful,则在每个请求中完成用户身份validation,并且没有会话的概念。 每个请求都包含足够的上下文信息(在URL和/或请求参数中),以使其独立于会话工作。

1)如何在请求之间管理状态。

它必须由客户管理。

a)存储用户信息和请求参数的位置,以便可以在请求之间共享。

用户认证信息由客户端存储,并随每个请求提供给服务器。 服务器将在每个请求上重新计算有关用户的任何派生信息。 通常存储在服务器端“会话”中的任何请求参数必须与每个请求一起重新传递。

b)让我们说结果是流式传输,Rowset存储在哪里?

在第一个瞬间,无处可去。 每次使用参数说明要跳到的位置重新发出查询。 如果性能是一个问题,你可以

  • 预读结果集的几页并将它们存储在服务器端缓存中,或者
  • 调整查询的数据库查询缓存。

1)用户信息不存储在任何地方,用户必须在每个请求上发送他的凭证(或您正在使用的任何身份validation方法)。

2)流式传输在RESTful API中没有多大意义,如果你想做流媒体我会建议你去寻找像WebSockets这样的东西(在Java中你可以用Jetty轻松地做到这一点)

如果您说流式传输,但您的意思是分页结果,与1相同,则没有保留状态,客户端必须发送包含所有信息的新请求,服务器必须查询数据库(或转到缓存,或执行任何操作需要)并将结果返回给客户。

您还应该阅读有关REST的更多信息,因为您的问题非常模糊,一个好的开始是Restful Web Services一书,或者,如果您有冒险精神,可以尝试Roy Fielding论文 ,该论文定义了我们今天所谓的REST。