实际上,RESTfulness仅适用于资源,如通用资源标识符所示。因此,谈论关于REST的头文件、cookie等内容并不合适。REST可以在任何协议上运行,尽管它通常是通过HTTP完成的。
主要的判断因素是:如果您发送一个REST调用,即URI,则一旦调用成功到达服务器,假设没有执行转换(PUT、POST、DELETE),那么该URI是否返回相同的内容?此测试将排除错误或身份验证请求的返回,因为在这种情况下,请求尚未到达服务器,这意味着将返回与给定URI对应的文档的servlet或应用程序。
同样,在POST或PUT的情况下,您可以发送给定的URI/payload,而无论您发送多少次消息,它都将始终更新相同的数据,以便随后的GET将返回一致的结果吗?
REST关注的是应用程序数据,而不是传输该数据所需的低级信息。
在以下博客文章中,Roy Fielding对整个REST思想进行了很好的总结:
http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/5841
REST架构系统从一个稳定状态到下一个稳定状态,每个稳定状态既是潜在的起始状态又是潜在的终止状态。也就是说,RESTful系统由未知数量的组件遵循一组简单的规则,它们始终处于REST或从一个RESTful状态转换到另一个RESTful状态。每个状态可以通过包含的表示和提供的过渡集合来完全理解,过渡被限制为可理解的统一动作集合。该系统可能是一个复杂的状态图,但每个用户代理只能看到一个状态(当前的稳态),因此每个状态都是简单的并且可以独立分析。然而,用户能够随时创建自己的过渡(例如输入URL、选择书签、打开编辑器等)。
关于身份验证的问题,无论是通过cookie还是header完成的,只要信息不是URI和POST负载的一部分,它与REST没有任何关系。所以,关于无状态,我们只谈论应用程序数据。
例如,当用户输入数据到GUI屏幕时,客户端会跟踪哪些字段已经输入,哪些没有,缺少任何必填字段等。这都是客户端上下文,并且不应该被发送或由服务器跟踪。发送到服务器的是需要在已识别资源(通过URI)中修改的完整字段集,以便在该资源中从一个RESTful状态转换到另一个状态。
因此,客户端跟踪用户正在做什么,并仅向服务器发送逻辑上完整的状态转换。