Web应用程序的架构在很大程度上受到框架开发人员所做的设计决策的影响,无论是隐式的还是显式的。有时,人们会有意识地接受这些决策,认为它们符合预期的整体系统架构。不过,更多情况下,它们之所以被接受,仅仅是因为开发人员认为它们体现了开发实践的最新水平。
ROCA试图定义一组独立于任何特定框架、编程语言或工具的建议,这些建议体现了我们所认为的好的Web应用程序架构的原则。它的目的是作为参考,可以按原样实现,也可以与其他方法进行比较,以突出不同的设计决策。
ROCA分为两部分:服务器端和客户端架构。服务器端由REST风格的后端组成,提供人类可读的内容以及用于机器到机器通信的服务,无论是公共的还是内部的。客户端侧重于基于渐进式增强原则的JavaScript和CSS的可持续且可维护的使用。几乎每一种基本的网络技术,例如HTML或HTTP,都在追求这种技术。客户端和服务器在很大程度上相互独立,但又相辅相成。服务器应用程序遵循REST原则,即它公开一组对坐在浏览器前面的用户有意义的资源,每个资源都有自己的URI,处理请求所需的所有信息都包含在请求本身中,HTTP方法按照其定义使用,资源状态由服务器维护(无状态通信)。休息。
用户必须能够链接到特定的信息,例如,通过从浏览器的地址栏复制地址并将其粘贴到电子邮件中、创建书签或使用任何更时髦的方式共享URI。链环。
必须能够通过浏览器以外的用户代理(例如命令行客户端,如cURL或wget)使用服务器的逻辑。非浏览器。
所有经过身份验证的通信都依赖于HTTP基本身份验证或摘要身份验证,通常与SSL结合使用,也可能与客户端证书结合使用。或者,由于浏览器本地身份验证的限制(例如,不注销、不设置样式),可以将基于表单的身份验证与cookie结合使用。如果使用Cookie,它们应该包括服务器处理它们所需的所有状态,并且应该支持另一种身份验证机制用于非浏览器访问。身份验证。
Cookie不得用于身份验证、用户跟踪或安全目的(如CSRF保护)以外的其他目的。曲奇饼。
除了对身份验证信息进行简单算法验证所需的状态之外,可能没有任何会话状态。会话
浏览器控件(如“后退”、“前进”和“刷新”按钮)必须按预期工作。即,后退按钮应该将用户带到他们期望被带到的地方(他们使用的最后一个有意义的资源)。浏览器刷新不应该导致重新呈现登录或主页,而不是用户正在查看的页面,或者(对用户而言)希望再次提交相同数据的意外问题(当用户不记得提交任何数据时,表明错误使用了POST动词)。浏览器控件。
服务器返回与布局信息和客户端行为无关的结构化语义HTML标记。华贵。
它必须能够访问每个页面的信息和功能通过使用辅助工具,如屏幕阅读器。无障碍。
CSS用于格式化和布局。这遵循渐进增强的原则,例如,允许不具备CSS3特征的浏览器仍然使用基于CSS3的站点。惯用语-CSS。
按照渐进式增强的原则,如果禁用JavaScript,则JavaScript的使用不会引起注意,应用程序仍可用(尽管可用性和便利性会降低)。不引人注目-javascript。
相同的功能不能在客户端(JavaScript)和服务器上冗余实现。因此,由于应用程序逻辑要求,应用程序逻辑不能驻留在客户端。无重复。
服务器代码可能不知道客户端代码生成的HTML结构(超越CSS),反之亦然。例外情况是服务器为初始化上述客户端功能而生成的一些定义良好的HTML结构。知识结构。
所有JavaScript代码和CSS代码都必须是静态的,并且不能由服务器以特定于请求的资源的形式动态生成。(请注意,这并不禁止使用CoffeeScript或更低的预处理器,因为相应的代码通常是作为发布过程的一部分预编译的。)。静态资产
客户端上由JavaScript触发的任何动态路由或URI状态修改都应该使用HTML5 History API。历史雅皮人