RESTful Web 应用程序中的客户端服务器体系结构

Client server architecture in RESTful web applications

本文关键字:客户端 服务器 体系结构 Web 应用程序 RESTful      更新时间:2023-09-26

我想澄清一下客户端服务器架构应该如何适用于具有 RESTful 后端的现代 Web 应用程序。

在 Web 应用程序中,客户端是浏览器,服务器是 Web 服务器。以编程方式,我们有客户端代码(视图),服务器端代码(控制器/模型)和数据库。我的理解正确吗?

所以现在当客户端代码向 RESTful 服务器端代码发送请求时,服务器应该返回一个 JSON/XML 对象,而不仅仅是简单的输出,对吗?

如果不允许客户端代码使用任何服务器端代码重新加载网页,那么它将如何将 JSON/XML 对象解析回网页?使用加载到浏览器中的 JavaScript 库?像阿贾克斯这样的东西?如果我们想重新加载整个网页怎么办?我们使用javascript来做到这一点吗?

编辑:

如果在这种情况下,Web 服务器与后端应用程序服务器是分开的,该怎么办?客户端代码应该调用 Web 服务器路由到后端还是在后端服务器想要调用 RESTful 服务时直接调用后端服务器?

正如罗伯特所说,是的! 你在技术上是正确的。通常在 RESTFul 级别,我们有各种用于 JSON 解析的提供程序,这些提供程序在 RESTFul 注释的帮助下从服务器流向客户端。并重新加载各种JS库,这些库作为JSON作为模型。

我一直在使用的流行组合是Backbone和RESTFul。它非常简单且随时可用的组合。

请参考骨干+休息基本了解

是的,你是对的。 主题有各种各样的变化,但这是"单页 Web 应用程序"的一般概念。 Web服务器提供了一个"纯"的html页面和一堆javascript。 javascript调用restful服务来获取JSON(比JS中的XML更容易使用),解析该JSON,然后相应地更新HTML DOM。 如果javascript出于某种原因想要重新加载整个页面(例如在window.onerror处理程序中或当用户单击"注销"按钮时),它可以执行window.location.reload()或window.location=urlOfSomeOtherPage。

有各种各样的开源JS库可以简化此类应用程序的构建。 参见Angular,Knockout和Backbone(通常使用Backbone.Marionette)作为流行的例子。

REST或HTTP中没有任何内容指示应该返回给客户端的内容(html,json等)。这取决于您正在构建的应用程序。

过去25年来的网络是"RESTful"。如果您遵循HTTP设计,那么您正在遵循良好的REST设计,因为HTTP是实现REST约束的协议。因此,如果您正在考虑资源并使用HTTP动词(GET,POST,PUT等)来更改服务器上资源的状态,而不是将资源视为动词以在服务器上执行某些操作,那么您就是RESTful。

最近发生的事情是,人们已经构建了返回JSON而不是HTML的Web应用程序API,并将其称为"RESTful"(即使它们不是),因此您必须返回JSON才能成为RESTful的想法已经进入了普遍意识。但是你可以返回HTML并且仍然是RESTful,因为REST并不关心服务器返回什么。内容类型只是资源的表示形式。哪种格式取决于您和客户端基于您支持Content-Types。在内容类型方面,REST是不可知的。您可以返回资源的 HTML 版本和资源的 JSON 版本,具体取决于客户端表示它可以接受的内容(在请求的 Accept 标头中)。

如果你只需要 HTML,那么只需返回 HTML。仅当您有实际理由时,才构建"单页应用程序"。Twitter这样做是因为他们不希望用户必须刷新页面才能看到新的推文,他们还希望有一个独立于网站的JSON API,而网站只是充当API的客户端。因此,twitter.com 页面只是从twitter API中提取数据,并使用它使用Javascript重新绘制页面的一小部分。这只有效(有些人认为它不起作用),因为 99% 的时间你只是打开了单个页面。您不会在网站中移动以探索不同的链接。

除此之外,如果你有一个网站有链接可以关注和探索,那么使用 JSON 和 JavaScript 重绘就是重新发明轮子。一些公司忘记了这一点,并将JavaScript的重绘带到了一个愚蠢的极端。他们有非常复杂的"单页站点",实际上是多页面站点,但是当您单击链接时,它们会使用来自 AJAX 的数据完全重绘页面。

简单地使用Web浏览器转到另一个链接会容易得多。您的浏览器已经是 REST/HTTP 客户端。确保你有正当的理由在 REST 客户端中用 JavaScript 实现另一个 REST 客户端。

tl;dr 版本 - REST 不关心您使用的内容类型,并且 REST 中不需要使用 JSON 或具有单页应用程序。如果你有一个多页网站,而你所做的只是在JSON中提取数据,并使用该数据来重绘网页的HTML,那么只使用HTML和浏览器的功能要好得多。如果需要支持 Web 浏览器以外的客户端,则可以生成资源的 JSON 版本以及资源的 HTML 版本,并将其留给客户端来决定所需的版本。