后退按钮后跟踪
我想第一次使用REST方法编写Web应用程序订单系统。当事情发布到页面时,我理解“消息ID”的概念,但是这种情况出现了。一旦用户发布到Web应用程序,您可以使用附加到URI的ID来跟踪他们的状态,但是如果他们没有任何标识时将他们点击浏览器的后退按钮到应用程序的入口点会发生什么情况?然后他们在交易中失去了他们的状态。后退按钮后跟踪
我知道你总是可以给他们一个cookie,但如果他们关闭了cookie,并且最坏的情况下在这里思考,他们也会关闭javascript。
现在,我明白答案可能是“是的,这就是发生的事情”,这是故事的结尾,我可以忍受这一点,但是,对于这个新手来说,我有什么缺失?
答案是您的应用程序(在REST方案中)只是不会跟踪发生了什么。所有状态由客户端管理,状态转换通过URI导航实现。 REST的“状态转移”部分是指客户端导航到新的状态的新URI。
根据HTTP规范和REST方法,使用GET访问的URI实际上是只读操作。这意味着如果客户端“备份”到之前的某个URI,那么发生的“最糟糕的”是另一个GET和更多的数据被加载。
假设客户做到这一点(使用高度简化的伪HTTP)...
GET //site.com/product/123
这检索信息(或者一个网页)有关产品ID 123,其大概包括对URI的引用,其可以用于将该项目发布到用户的购物车中。所以用户决定购买该物品。再次,它过于简化但:
POST //site.com/shoppingcart/ {的productid = 123}
从该返回的可能是购物车的一个表示,或以所添加的项的引用(可以在带有DELETE的shoppingcart URI上使用它来再次移除该项目)或各种其他事物(例如使用指向购物车项目并返回原始产品的其他URI来描述购物车内容的更深的XML)。全取决于你。
但是“状态”是由客户正在做的事情定义的。它根本不在服务器上进行跟踪,尽管您肯定会在您的数据库中保留一段时间内他的购物车内容的副本。 (两年后,我曾回到网站,我的购物车项目仍然存在......)但是,他需要跟踪该ID。对于您的服务器应用程序,这只是另一个记录,可能是某种期限。
这样你就不需要cookies了,javascript完全依赖于客户端的实现。很难在没有脚本的情况下构建一个像样的REST客户端 - 您可能会用XSLT构建一些东西,并且只从服务器返回XML,但这可能比任何人都需要更加痛苦。
起点是要真正了解REST,然后设计系统,然后构建它。它绝对不适合像大多数其他系统一样(正确或错误地)动态构建它。
这是一个很好的文章,让你在休息一个相当“纯粹”的外观,而不过于抽象,不陷入泥淖你打倒代码:
REST并没有真正的服务器端状态;你只需指向资源。用户会话不被跟踪;而Cookie则用于跟踪应用程序状态。但是,如果您发现确实需要会话状态,那么您将不得不中断REST并在服务器上进行跟踪。
要考虑的几件事情:
- 有多少用户已经饼干反正禁用?有多少人知道该怎么做?
- 您的用户是否真的有可能关闭JS?如果是这样,那么如何在没有AJAX的情况下完成PUT(编辑)和DELETE(删除)?
编辑:既然你不希望强制饼干和JavaScript,那么你就不能有一个真正的RESTful系统。但你可以假装它。您将需要跟踪用户服务器端。你可以用会话对象来做到这一点,就像在你选择的语言/框架中找到的那样,或者为你想知道的任何事情添加一个字段到数据库。当然,当用户点击后退按钮时,他们可能会进入缓存页面。如果这不是好的,那么你将需要修改标题以禁止缓存。基本上,如果你不使用cookies,它会变得更加复杂,但不是难以管理的。
缺失的PUT和DELETE HTTP方法呢?你可以用POST和一个隐藏的参数来伪造这些参数,指定你是否在做新东西,编辑或删除记录。 GET不应该真的改变。
确实,REST中的“S”代表“状态”,“传送”代表“T”。但是,状态保留在客户端上,而不是服务器上。客户始终掌握所有必要的信息,以决定他想要改变状态的方向。
您描述它的方式,您的系统是而不是宁静。
这并没有真正回答这个问题。 – 2009-08-25 13:16:21
就REST而言,问题是-1,所以我的回答相当准确。 – 2009-08-25 13:17:13
请不要大喊。谢谢。 – 2009-08-25 13:22:48
你提出一个我很困惑的场景。如果两年后你回到购物车,那么网站是如何知道这是你而不是其他人使用cookies的?你没有说你必须用名字/密码登录,那么你呢?或者你是否说客户对自己的购物车负责,如果外人掌握了这个URI,这不是我们的错?因为我找不到任何会谈这件事的事情(还没有读过你的文章参考资料),我只是在这个时候陷入迷雾。 如果客户端拥有包含订单的表单的URI,该网站如何防止任何人对其进行修改? – Rob 2009-08-28 13:32:40
这只是一个例外,但是,我登录了 - 这不是一个REST系统,它确实使用了cookies,虽然我的过期了。我只是指购物车数据长期到期的有趣示例。但是安全性和身份验证并不是纯REST概念的关注点。本质上,客户端在每次调用时都提供凭据,但API的具体情况如何。看来,最明显和最简单的解决方案是SSL加HTTP基本身份验证(毕竟这对于在线银行业务来说已经足够了)。 – McGuireV10 2009-08-28 13:58:30
请注意,REST仍可用于创建匿名购物车(无需登录),但只有当客户端知道购物车ID的URI时才可以访问REST。根据定义,客户端可以保存这个URI并在稍后访问它(例如,将其加入书签),所以将其视为一种穷人会话是不正确的,但是它与此类似。但是如果用户或客户端没有存储URI,那么如果它不与登录关联(并且希望最终会从表中删除),它将基本上变成孤立的数据。 – McGuireV10 2009-08-28 14:08:12