我是RESTful Web服务和RESTlet的新手。我们只有构建基于servlet的Web应用程序(JBoss / Apache上的Servlet / JSP)的经验。现在,我们正在构建一个基于RESTlet的应用程序,其中服务器端API将由两种类型的客户端使用 - 使用浏览器的Web和基于桌面的swing。
据我所知,按照REST概念 a)服务器无法维护会话以提高可伸缩性和其他一些原因 b)客户的每个请求都应该是自包含的
现在,我真的很困惑如何实现这一目标。假设我们采用简单的购物车应用程序。
步骤1)客户端发送认证请求,服务器认证,服务器响应OK。
步骤2)客户端发送将项目添加到购物车的请求。服务器响应正常。
步骤3)客户发送另一个请求以将第二项添加到购物卡。服务器响应正常。
通常,在正常的Web应用程序中,会在服务器上的步骤1中创建会话,从那时起,与该客户端相关的所有请求将自动与同一会话关联,并且我们存储会话状态(在这种情况下为购物车) )在会话对象中,并使用来自客户端的后续请求检索/更新它。
现在,在上面的场景中:
1)如果服务器上没有维护会话,我们如何在步骤2和3中对客户端进行身份验证和授权?
2)客户是否需要为每个请求发送一些额外信息?
3)我们如何在步骤3中检索客户特定的购物车?
4)客户端是否需要在步骤3中再次发送服务器在步骤2中创建/返回的购物车?
显然,这是最简单的用例,因此每个开发RESTful Web服务的人都必须设计自己的应用来处理这个问题。使用RESTLet在RESTful Web服务中处理会话管理,身份验证和授权的最佳和最常用方法是什么?如果我们必须使用客户端的数据维护服务器端的缓存,那么这与代表我们的服务器维护会话有何不同?
提前致谢, 深
答案 0 :(得分:15)
1)如果我们如何在步骤2和3中验证和授权客户端 服务器上没有维护会话?
2)客户是否需要向每个人发送一些额外的信息 请求?
是。您必须为每个请求发送身份验证/授权数据。这就是阻止服务器“记住”你是谁(即无状态服务器,没有会话)的原因
3)我们如何在步骤3中检索客户特定的购物车?
让我们问一个不同的问题:如果服务器重新启动会发生什么?您想要所有购物车数据丢失吗?可能不是。暗示你必须把它存放在一个可以在重启后存活的地方。暗示持久存储。可能在服务器或客户端......
...现在,如果您的客户重启,该怎么办?您可以选择使用POST请求为用户创建购物车“资源”(当用户添加第一个项目时),或者在客户端登录时创建(浪费)。然后,您继续使用PUT / DELETE更新购物车,并使用GET获取它。
它应该在DB中吗?可能是,取决于你是否想要它。如果它必须是持久性的,那么这是一个保持它的好地方,以便它可以在重新启动后继续存在。
那么如何接收客户特定的购物车?那么你只需要发送资源的GET请求!而已!第一个POST将在适当的URL创建一个资源,然后您可以使用它。
Restful Web服务还具有宁静的URL,因此这是设计的关键部分。
4)客户是否需要发送它的购物车 服务器在步骤2中再次在步骤3中创建/返回了什么?
没有。正如刚才提到的。但是如果你在客户端使用cookies或LocalStorage或其他一些信息,那么也许你可以这样做。
显然,这是最简单的用例,所以每个人都在发展 RESTful Web服务必须设计他们的应用程序来处理这个问题。什么 是处理会话管理的最佳和最常用的方法, 使用RESTLet在RESTful Web服务中进行身份验证和授权?
是。这很简单,但需要一段时间来考虑“资源”而不是“服务”。在宁静的设计中,一切都是(或可以是)资源,包括交易,购物车等,
但是,授权/身份验证是http请求数据包的一部分,并随每个请求一起发送。我建议你阅读这些内容。
如果我们必须使用客户端的数据维护服务器端的缓存 那么这与我们的服务器维护会话有何不同? 代表?
大的差异!您是在缓存性能还是维护会话?如果系统重新启动,您的系统将在空缓存上无缝工作吗?如果是,你正在缓存性能,否则你就是维持状态。
我强烈建议您阅读Richardson&amp ;;的RESTful Web Services。 Ruby可以创造上述概念,并更深入地了解如何设计宁静的服务......需要一些时间来适应。