我想第一次使用REST方法编写一个Web应用程序订单系统。当事情被发布到页面时,我理解“消息ID”的概念,但是这种情况出现了。一旦用户发布到Web应用程序,您就可以使用附加到URI的ID来跟踪他们的状态,但是当他们没有任何id时,如果他们点击浏览器的后退按钮到应用程序的入口点会发生什么?然后他们在交易中失去了他们的状态。
我知道你总是可以给他们一个cookie,但如果他们关闭了cookie就不能这样做,最糟糕的情况是,他们也关闭了javascript。
现在,我明白答案可能是“是的,那就是将要发生的事情”,这就是故事的结局,我可以忍受这一点,但是,对此我不熟悉,有什么我想念的吗?
答案 0 :(得分:4)
REST实际上没有服务器端的状态;你只需指向资源。不跟踪用户会话;而cookie则用于跟踪应用程序状态。但是,如果您发现确实需要会话状态,那么您将不得不打破REST并在服务器上跟踪它。
需要考虑的一些事项:
编辑:由于您不想强制使用Cookie和JavaScript,因此您无法拥有真正的RESTful系统。但你可以在某种程度上伪造它。您将需要跟踪用户服务器端。您可以使用会话对象执行此操作,如您选择的语言/框架中所示,或者通过向数据库添加字段以获取您想知道的任何内容。当然,当用户点击后退按钮时,他们可能会进入缓存页面。如果这不好,那么您将需要修改标头以禁止缓存。基本上,如果你不使用cookies,它会变得更复杂,但不是无法管理的。
缺少PUT和DELETE HTTP方法怎么样?您可以伪造那些带有POST和隐藏参数,指定您是否正在制作新内容,编辑内容或删除记录。 GET不应该真正改变。
答案 1 :(得分:3)
答案是您的应用程序(在REST方案中)只是不会跟踪发生的情况。所有状态都由客户端管理,状态转换通过URI导航实现。 REST的“状态转移”部分是指客户端导航到新状态的新URI。
根据HTTP规范和REST方法,使用GET访问的URI实际上是一种只读操作。这意味着如果客户端“备份”到某个先前的URI,则“最糟糕的”发生的是另一个GET,并且会加载更多数据。
假设客户端执行此操作(使用高度简化的伪HTTP)...
获取// site.com/product/123
这将检索有关产品ID 123的信息(或可能是页面),其可能包括对URI的引用,该URI可用于将该项目发布到用户的购物车中。因此用户决定购买该物品。再次,它过于简单了,但是:
POST //site.com/shoppingcart/ {productid = 123}
从此返回可能是购物车的表示,或者对添加的项目的引用(可以在购物车URI上使用DELETE再次删除项目),或者其他各种事物(例如更深入的XML描述购物车内容,其他URI指向购物车商品并返回原始产品。这完全取决于你。
但是“状态”是由客户端正在做的事情定义的。它根本不在服务器上跟踪,但您肯定会在数据库中保留一段购物车内容一段时间。 (两年后我曾回到一个网站,我的购物车项目仍在那里......)但是由他来跟踪ID。对于您的服务器应用程序,它只是另一条记录,可能是某种过期。
通过这种方式,您不需要cookie,而javascript完全依赖于客户端实现。没有脚本很难建立一个像样的REST客户端 - 你可能用XSLT构建一些东西并且只从服务器返回XML,但这可能比任何人都需要的更痛苦。
出发点是真正了解REST,然后设计系统,然后构建它。它肯定不像大多数其他系统那样(正确或错误)在运行中构建它。
这是一篇优秀的文章,它让你对REST有一个相当“纯粹”的看法,而不会过于抽象而且不会让你陷入困境:
答案 2 :(得分:0)
确实,REST中的“S”代表“状态”,而“T”代表“转移”。但是状态是保留在客户端上,而不是在服务器上。客户总是掌握所有必要的信息,以决定他想改变状态的方向。
您描述它的方式,您的系统不安静。