Http REST体系结构样式是否需要物理上独立的客户端和服务器?

Http REST体系结构样式是否需要物理上独立的客户端和服务器?,http,architecture,rest,soap,rpc,Http,Architecture,Rest,Soap,Rpc,是否要求在物理上独立的客户端和服务器之间进行RESTful交互?i、 e.交互是否需要以某种方式涉及网络堆栈?在应用程序的各个组件之间使用类似HTTP的“调用约定”有什么好处吗 在我看来,REST的好处(比如它们)几乎适用于同一应用程序的组件之间的通信,也适用于物理上独立的客户端和服务器之间的通信,并且REST的好处可以在不涉及网络堆栈的情况下得到满足。(我并不是说让每个函数调用“看起来像HTTP”是个好主意,但对于某些函数调用或交互,让交互像HTTP可能是有意义的。) 例如,在web应用程序中

是否要求在物理上独立的客户端和服务器之间进行RESTful交互?i、 e.交互是否需要以某种方式涉及网络堆栈?在应用程序的各个组件之间使用类似HTTP的“调用约定”有什么好处吗

在我看来,REST的好处(比如它们)几乎适用于同一应用程序的组件之间的通信,也适用于物理上独立的客户端和服务器之间的通信,并且REST的好处可以在不涉及网络堆栈的情况下得到满足。(我并不是说让每个函数调用“看起来像HTTP”是个好主意,但对于某些函数调用或交互,让交互像HTTP可能是有意义的。)

例如,在web应用程序中,通过
URL访问(“内部”)用户信息可能很有用http://api.local/user/34
和一个“HTTP客户端”,它在内部路由和分派请求,而不是通过标准的HTTP路由和分派过程。用户组件的开发人员不提供传统的库和相关文档,而是提供URL端点(资源),这些端点可以使用标准HTTP谓词进行操作。由于开发人员已经熟悉HTTP,因此需要的文档更少,而且跨组件的一致性和一致性也会更高


(我认为以这种方式思考REST也有助于澄清REST和RPC机制(如SOAP)之间的区别——没有理由将SOAP用于“内部”调用,但理解REST的行为和语义可能会使其在某些情况下对“内部”调用有用。当然,如果您将REST用于内部调用(REST级别为0?),如果需要,将此类交互转换为外部调用是很简单的。)REST背后的理念主要是由数据传输、远程性和体系结构中立性的经济性驱动的。访问远程资源的成本很高;您需要一个鼓励可缓存性、可寻址性和最低语义的体系结构。然而,对于进程内通信,在子系统之间发送数据是e非常便宜,通常相当于传递一个指针,它满足或消除了所有三个目标


我承认我没有深入思考过这一点,因此可能需要回答一个问题:进程内HTTP如何让我的生活更轻松?

在进程内使用REST原则和HTTP语义肯定是有意义的,但可能只有当您的应用程序最终也是与HTTP通信的客户端或服务器时

最困难的部分是尊重HTTP的分层约束,因为在该层的另一个sie上调用该单例非常容易,因为它只是一个函数调用

然而,一个好处是,你实际上可以将一层从一个地方移动到另一个地方。这可能很难完全实现,但我认为这是可行的,尽管我冒昧地猜测,这从未实现过

在我自己的思想实验中,HTTP的所有好处都发挥了作用,这些好处是单纯的memcached或进程内缓存无法处理的。以缓存验证或条件put为例。想象一下,能够使用HTTP请求的表达能力进行函数调用:

从这个服务中检索这个东西,但前提是它的ETag不是“A”或“B”或W/“C”,因为这些是我目前拥有的

将此存储在这里,但前提是ETag W/“DEF”仍然有效,因为这是我刚才执行GET时使用的标记

我想搜索这样的小部件,结果最好是作为IAtomCollection,但我会选择一个列表(Accept)。上次我问这个问题时,我得到了一个ETag“foo”(如果没有匹配的话),因此,如果没有更改,我不需要它,但如果您不介意,我想用源服务器验证我的缓存的有效性(缓存控制:必须重新验证)。哦,顺便说一下,这是我的凭据(授权

在HTTP中,这样的问题很容易解决,我们都知道如何伪造这样复杂的查询

HTTP响应也是如此:

您好,我找到了您的IAtomCollection,我确实与原始服务器进行了验证。您拥有的东西不再有效,因此这里有一个新的给您。它的ETag为“bar”你可以在不与我再次确认的情况下考虑两分钟的新鲜感,但是如果下次你问我的话,你可以把新鲜期延长一分钟。当然,根据你的资历(不用说,对吧?)和你的喜好,反应会有所不同。

再一次,简单的HTTP。想象一下能够进行如此智能的方法调用


至于HATEOAS,在封装标识符时考虑一些因素也会使遵守这一约束成为可能。但我的思想实验在这方面并没有走得太远…

在强调资源而不是其背后的功能的RESTful系统中,资源的URI通常是解决e资源。这就是已知的资源,为什么不使用它呢

在某些系统中,为了获取资源提供的数据,并不总是清楚要执行哪些函数调用。同样,简单地通过资源的URI(甚至从代码中)寻址资源可能是最方便的

在中,作为组件作者,我们为您提供了一种非常简单的方法来访问托管在该服务器上的资源的数据。同时,这种抽象也使得使用完全相同的语法引用托管在其他服务器上的数据成为可能