全部博文(465)
分类: 系统运维
2011-09-28 16:35:06
如何维护应用程序状态
当您在阅读关于REST 的文章时,经常得到这样的建议——在客户端保存应用程序状态。但什么是“应用程序状态”?应当如何在客户端保存这些状态?本节描述了保存应用程序状态的最佳实践。
问题描述
您想知道如何管理RESTful Web 服务的状态,这样就不需要依赖于服务器内存中的会话了。
解决方案
将应用程序状态编码到URI 里,并通过链接在表述中包含这些URI(见第5 章)。让客户端使用这些URI 与资源进行交互。如果状态过大,或出于安全或隐私考虑不能在网络中传输,则可以在持久化存储(如数据库或文件系统)中存储应用程序状态,并将其状态的引用编码在URI 中。
问题讨论
考虑一个简化的汽车保险应用,假定其中涉及两个步骤。第一步,客户端提交一个带有司机和车辆细节信息的请求,服务器返回一个一周内有效的报价。第二步,客户端提交购买保险的请求。在这个例子中,应用程序的状态就是报价。服务器需要知道从第一个步骤返回的报价,基于它才能给出第二个请求中的保单。
应用程序状态是服务器需要在每个客户端的每个请求之间维护的状态。在客户端保持这个状态并不意味着要像ASP.NET 和JavaServer Faces 之类的Web 框架所做的那样,把会话状态序列化到URI 或HTML 表单中。
由于HTTP 是无状态协议,每个请求与之前的请求都是独立的。然而,交互应用程序通常要求客户端执行时遵循特定顺序。这就要求服务器在协议之外暂时存储每个客户端在步骤序列里的当前位置。这里的诀窍是管理状态,这样就可以在可靠性、网络性能和可扩展性之间寻求平衡。
资源表述中的链接是保持应用程序状态的最好地方,如下所示:
# 请求
POST /quotegen HTTP/1.1
Host:
Content-Type: application/x-www-form-urlencoded
fname=...&lname=...&..
# 响应
HTTP/1.1 200 OK
Content-Type: application/xml;charset=UTF-8
...
...
...
rel="http:///rels/quotes/buy"/> ❶