为啥在 REST 中没有存根?

Posted

技术标签:

【中文标题】为啥在 REST 中没有存根?【英文标题】:Why no Stub in REST?为什么在 REST 中没有存根? 【发布时间】:2012-08-23 18:37:29 【问题描述】:

编辑:我原来的标题是“在 RPC 中使用存根”;我编辑标题只是为了让其他人知道它不仅仅是那个问题。

我已经开始开发一些基于 SOAP 的服务,但我无法理解存根的作用。引用维基:

客户端和服务器使用不同的地址空间,因此必须对函数调用中使用的参数进行转换,否则这些参数的值将无法使用,因为指向计算机内存的指针指向各自的不同数据机器。即使是简单的参数,客户端和服务器也可以使用不同的数据表示(例如,整数的大端与小端)。存根用于执行参数的转换,因此远程函数调用看起来像本地函数调用用于远程计算机。

这很愚蠢,但我“实际上”不明白这一点。我已经用 Java 进行了一些套接字编程,但是当我的 TCP/UDP 客户端与我的服务器交互时,我不记得任何“参数转换”步骤。 (我假设使用 TCP/UDP 套接字的原始服务器-客户端通信确实属于 RPC)

我在 RESTful 服务开发方面有一些经验,但我也无法识别与 REST 类似的 Stub。有人可以帮我吗?

【问题讨论】:

更好的标题可能是“存根有什么用途?” 仅供参考,“存根”的概念是一个 RPC 概念。 SOAP Web 服务还支持“文档”样式的交互,它不使用术语“存根”。这种交互不涉及参数,而是交换文档。 @JohnSaunders:文档如何不需要存根?你能链接一些阅读吗?谢谢。 【参考方案1】:

用于网络调用的存根(无论是 SOAP、REST、CORBA、DCOM、JSON-RPC 还是其他)只是帮助类,它们为您提供了一个处理所有底层细节的包装函数,例如:

初始化 TCP/UDP/任何传输层 找到正确的呼叫地址并在需要时进行 DNS 查找 连接到服务器应位于的网络端点 在服务器未监听时处理错误 检查服务器是否符合我们的预期(安全检查、版本控制等) 协商编码格式 以适合在网络上传输的格式(CDR、NDR、JSON、XML 等)对您的请求参数进行编码(或“编组”) 通过网络传输您的编码请求参数,并根据需要处理分块或流量控制 从服务器接收响应 解码(或“解组”)响应详细信息 将响应返回到您的原始调用代码(如果出现问题,则抛出错误)

没有所谓的“原始”TCP 通信。如果您在请求/响应模型中使用它并从通过 TCP 连接发送的数据推断出任何类型的含义,那么您已经在其中编码了某种形式的“参数”。您只是碰巧自己构建了通常提供的存根。

存根试图让您的远程调用看起来就像本地进程内调用,但老实说,这是一件非常糟糕的事情。它们根本不一样,您的应用程序应该以不同的方式考虑它们。

【讨论】:

以上是关于为啥在 REST 中没有存根?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 集成测试中最好地存根/模拟 rest API 调用

为啥我的 REST 服务 .NET 客户端会在没有身份验证标头的情况下发送每个请求,然后使用身份验证标头重试?

为啥没有自动为 Spring Data REST 项目资源应用摘录投影?

为啥 Rest Controller 会给出错误:“处理程序没有适配器”?

为啥我的 Django REST Framework 视图集 URL 没有解析?

错误状态:没有从`when()`中调用方法存根