REST与RPC-*实际用途*差异

REST与RPC-*实际用途*差异,rest,rpc,Rest,Rpc,当REST已经很流行时,我开始编写web应用和分布式应用,所以我实际上从未使用过RPC 在寻找它们之间差异的简单解释时,我开始理解,但一些例子让我感到困惑。 我看到过这样的事情: GET /getLastUser GET /addTwo?num=5 { "result": 7 } 或者这个: POST /changeUserName 如果REST是用于资源的,而RPC是用于过程的,那么将RPC用于这样的事情不是一种糟糕的做法吗 如果我错了,请纠正我,但在我看来,RPC应该更纯粹地

当REST已经很流行时,我开始编写web应用和分布式应用,所以我实际上从未使用过RPC

在寻找它们之间差异的简单解释时,我开始理解,但一些例子让我感到困惑。
我看到过这样的事情:

GET /getLastUser
GET /addTwo?num=5
{
    "result": 7
}
或者这个:

POST /changeUserName
如果REST是用于资源的,而RPC是用于过程的,那么将RPC用于这样的事情不是一种糟糕的做法吗

如果我错了,请纠正我,但在我看来,RPC应该更纯粹地起作用。
这意味着调用过程应始终:

  • 为相同的参数返回相同的结果
  • 不影响状态
因此,RPC调用如下:

GET /getLastUser
GET /addTwo?num=5
{
    "result": 7
}
返回如下内容:

GET /getLastUser
GET /addTwo?num=5
{
    "result": 7
}
对我来说似乎更符合逻辑(尽管这是一个非常简单的例子)


如果这个问题因为过于“基于意见”而被解决,我就知道我应该做任何我想做的事…

RPC不应该是功能性的。调用同一过程两次并不能保证结果

这个问题可以用几种不同的方式来回答,而且非常深刻。我认为这可能是一个公平的总结

  • 对于RPC,原语通常是函数名、参数和结果
  • 对于REST,原语是“资源表示”
因此,在使用RPC调用函数的地方,在REST中,您实际上是在发送和检索资源的状态,而不考虑协议

这意味着您通常只会问服务器“您能告诉我此资源的状态吗”,或者告诉服务器“这是一个新的资源状态,请将其存储在此位置”。REST给出的唯一成功答案是“当前状态”或“此操作已工作”,但使用RPC,问题(函数+参数)和答案(结果)可以是任何内容

所以你可以说,当你这样描述它时,RPC要灵活得多。可能是这样,但由于REST仅限于传输状态,因此您获得了许多基于RPC的简单协议无法提供的保证

REST不仅仅是转移状态。超级链接的使用是称为REST的服务的另一个重要要求,这也是RPC不能“开箱即用”的地方


最后,可以说HTTP本身是一种类似RPC的协议。我认为可以在任何RPC服务之上构建RESTful服务。

这很好地解释了这一点,REST不一定与RPC冲突?@user3134477,不一定,但在非常特定的条件下确实如此。当大多数人阅读REST时,他们会想到HTTP上REST的典型实现。对于大多数实际用途来说,它们是两件完全不同的事情,但是当你深入到理论上来时,剩下的部分可以在RPC协议的基础上完成。