代码之家  ›  专栏  ›  技术社区  ›  Rob

后退按钮后保持跟踪

  •  3
  • Rob  · 技术社区  · 16 年前

    我想第一次使用REST方法编写一个Web应用程序订单系统。我理解当事情发布到页面时“消息ID”的概念,但是这个场景出现了。一旦用户发布到Web应用程序,您可以使用附加到URI的ID跟踪他们的状态,但是如果他们没有任何ID时,按浏览器的后退按钮到应用程序的入口点会发生什么?然后,它们在事务中失去状态。

    我知道你可以给他们一个cookie,但是如果他们关闭了cookie,你就不能这样做,最坏的情况是,他们也关闭了javascript。

    现在,我明白了答案可能是“是的,这就是将要发生的事情”,这就是故事的结尾,我可以忍受,但是,作为一个新手,我有没有遗漏什么?

    3 回复  |  直到 7 年前
        1
  •  3
  •   McGuireV10    16 年前

    答案是您的应用程序(在REST场景中)只是 跟踪发生的事情。所有状态都由客户机管理,状态转换通过URI导航生效。REST的“状态转移”部分是指客户端导航到新的URI,这些URI是新的状态。

    根据HTTP规范和REST方法,使用GET访问的URI实际上是一个只读操作。这意味着如果客户机“备份”到以前的某个URI,“最糟糕的”情况是生成另一个GET并加载更多数据。

    假设客户端执行此操作(使用高度简化的伪HTTP)…

    获取//site.com/product/123

    这将检索有关产品ID 123的信息(或可能是一个页面),其中可能包含一个对URI的引用,该URI可用于将该项目发布到用户的购物车中。所以用户决定购买该商品。同样,它过于简单化,但是:

    发布//site.com/shoppingcart/ 产品ID=123_

    从中返回的可能是购物车的表示,或者是对添加的项目的引用(可以在ShoppingCart URI上使用Delete来再次删除该项目),或者其他各种内容(例如,使用指向购物车项目并返回原始产品的其他URI描述购物车内容的更深层的XML)。一切由你决定。

    但是“状态”是由客户所做的任何事情定义的。虽然您一定会在数据库中保存他的购物车内容的副本一段时间,但在服务器上根本不会跟踪它。(两年后我回到了一个网站,我的购物车物品还在那里…)但这要由他来跟踪身份证。对于你的服务器应用程序,这只是另一个记录,大概有某种过期。

    这样就不需要cookie,而javascript完全依赖于客户机实现。在没有脚本的情况下构建一个合适的REST客户机是很困难的——您可以使用XSLT构建一些东西,并且只从服务器返回XML,但这可能比任何人需要的都要痛苦。

    首先要真正理解REST,然后设计系统,然后构建它。它绝对不适合像大多数其他系统那样(对或错)在运行中构建它。

    这是一篇优秀的文章,它让您在不过于抽象和不让代码困扰的情况下,相当“纯粹”地看待静止状态:

    http://www.infoq.com/articles/subbu-allamaraju-rest

        2
  •  4
  •   geowa4    16 年前

    REST实际上没有服务器端的状态;您只需指向资源。不跟踪用户会话;而是使用cookie跟踪应用程序状态。但是,如果您发现确实需要会话状态,那么就必须中断REST并在服务器上跟踪它。

    需要考虑的几个问题:

    • 有多少用户禁用了cookie?有多少人知道怎么做?
    • 您的用户是否真的关闭了JS?如果是这样,在不使用Ajax的情况下,如何完成放置(编辑)和删除(删除)?

    编辑: 既然您不想强制使用cookie和javascript,那么您就不能拥有真正的RESTful系统。但你可以假装一下。您将需要跟踪用户服务器端。您可以使用会话对象来实现这一点,这可以在您选择的语言/框架中找到,也可以通过向数据库中添加字段来实现。当然,当用户点击后退按钮时,他们可能会进入一个缓存页面。如果这不正常,则需要修改头文件以禁止缓存。基本上,如果你不使用cookie,但又不是不可管理的,它会变得更复杂。

    丢失的Put和Delete HTTP方法呢?您可以使用posts和一个隐藏参数来伪造这些内容,该参数指定是否要创建新内容、编辑内容或删除记录。GeT不应该真的改变。

        3
  •  0
  •   lutz    16 年前

    “S”代表“状态”,“T”代表“转移”,这是事实。但是状态保存在客户机上,而不是服务器上。客户总是掌握所有必要的信息,以便自己决定他想改变状态的方向。

    你描述它的方式,你的系统是 休息。