我有一个Web服务,它接受JSON参数并具有方法的特定URL,例如:
http://IP:PORT/API/getAllData?p={JSON}
这绝对不是REST,因为它不是无状态的。它考虑了cookie并具有自己的会话。
是RPC吗?RPC和REST有什么区别?
我有一个Web服务,它接受JSON参数并具有方法的特定URL,例如:
http://IP:PORT/API/getAllData?p={JSON}
这绝对不是REST,因为它不是无状态的。它考虑了cookie并具有自己的会话。
是RPC吗?RPC和REST有什么区别?
Answers:
您不能仅通过查看发布的内容就将REST或RPC进行明确区分。
REST的一个限制是它必须是无状态的。如果您有一个会话,那么您就处于状态,因此您不能将您的服务称为RESTful。
您的网址(即getAllData
)中有操作,这一事实表明RPC。在REST中,您交换表示形式,并且执行的操作由HTTP动词决定。另外,在REST中,不使用参数执行内容协商?p={JSON}
。
不知道您的服务是否是RPC,但它不是RESTful的。您可以在线了解差异,这里有一篇文章可以帮助您入门:揭穿RPC和REST的神话。您会更好地了解服务内部的内容,因此可以将其功能与RPC进行比较,并得出自己的结论。
考虑下面的HTTP API示例,该示例对在餐厅中下的订单进行建模。
正在下单:
检索订单:
更新订单:
取自site.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpc的示例
就像其他人所说的,主要区别在于REST以名词为中心,而RPC以动词为中心。我只想包含这个清晰的示例表,以表明:
--------------------------- + ---------------------- --------------- + -------------------------- 操作 | RPC(操作) | REST(资源) --------------------------- + ---------------------- --------------- + -------------------------- 注册| POST /注册| POST /人 --------------------------- + ---------------------- --------------- + -------------------------- 辞职 POST /辞职| 删除/人/ 1234 --------------------------- + ---------------------- --------------- + -------------------------- 读人| GET / readPerson?personid = 1234 | GET /人/ 1234 --------------------------- + ---------------------- --------------- + -------------------------- 阅读人的物品清单| GET / readUsersItemsList?userid = 1234 | GET /人/ 1234 /项 --------------------------- + ---------------------- --------------- + -------------------------- 将项目添加到人员列表| POST / addItemToUsersItemsList | POST /人/ 1234 /项 --------------------------- + ---------------------- --------------- + -------------------------- 更新项目 POST / modifyItem | PUT /项目/ 456 --------------------------- + ---------------------- --------------- + -------------------------- 删除项目| POST / removeItem?itemId = 456 | 删除/ items / 456 --------------------------- + ---------------------- --------------- + --------------------------
笔记
GET /persons/1234
),而RPC倾向于将查询参数用于函数输入GET /readPerson?personid=1234
)。GET /persons?height=tall
)。POST /signup
或时POST /persons
,您将包含描述新人的数据)。它是使用http的RPC。REST的正确实现应不同于RPC。具有处理数据的逻辑(例如方法/功能)的就是RPC。getAllData()是一种智能方法。REST无法提供智能,应该将其转储为可以由外部智能查询的数据。
这些天我看到的大多数实现都是RPC,但许多人误将其称为REST。使用HTTP的REST是拯救者,使用XML的SOAP是恶棍。因此,您的困惑是有道理的,并且您是对的,这不是REST。
Http协议未实现REST。REST(GET,POST,PUT,PATCH,DELETE)和RPC(GET + POST)都可以通过HTTP(例如,通过Visual Studio中的Web API项目)进行开发。
很好,但是REST是什么?理查森到期模型如下(概述)所示。只有级别3是RESTful。
例如:3级(HATEOAS):
链接状态可以用这种方式更新和添加该对象。
链接指出只能读取此对象,这就是我们的操作方式。
显然,发送数据不足以成为REST,但是还应该提到如何查询数据。但是再说一次,为什么要执行4个步骤?为什么不能仅将其称为“步骤4”并称为REST?理查森(Richardson)只是一步一步地达到了目标,仅此而已。
您已经建立了可供人类使用的网站。但是,您还可以建立可供机器使用的网站吗?那就是未来所在,RESTful Web Services向您展示了如何做到这一点。
PS:REST超级流行,因此自动化测试也是如此,但在实际示例中,..很好..
因此,我会争辩:
我的实体是否拥有/拥有数据?然后是RPC:这是我的一些数据的副本,处理我发送给您的数据副本,然后将您的结果副本返回给我。
被叫实体是否拥有/拥有数据?然后进行REST:(1)向我显示您的某些数据的副本,或者(2)处理您的某些数据。
最终,它是关于操作的哪一侧拥有/保存数据的信息。是的,您可以使用REST语言与基于RPC的系统进行通信,但是这样做仍将继续进行RPC活动。
示例1:我有一个对象正在通过DAO与关系数据库存储(或任何其他类型的数据存储)进行通信。对于我的对象和可以作为API存在的数据访问对象之间的交互,请使用REST风格。我的实体不拥有/保留数据,关系数据库(或非关系数据存储)拥有/拥有数据。
例2:我需要做很多复杂的数学运算。我不想将一堆数学方法加载到我的对象中,我只想将一些值传递给可以进行各种数学运算的其他东西,并获得结果。然后,RPC样式才有意义,因为数学对象/实体将向我的对象公开一堆操作。请注意,这些方法可能全部作为单独的API公开,我可能会使用GET调用它们中的任何一个。我什至可以说这是RESTful的,因为我是通过HTTP GET调用的,但实际上它是RPC。我的实体拥有/保留数据,远程实体只是对我发送给它的数据副本执行操作。
这里有很多很好的答案。我仍然会向您推荐这个 Google博客,因为它在讨论RPC和REST之间的区别方面做得非常好,并且捕获了我在此处的任何答案中都没有读到的内容。
我会引用引人注意的同一链接中的一段:
REST本身是对支撑HTTP和万维网的设计原则的描述。但是,因为HTTP是唯一在商业上重要的REST API,所以我们几乎可以避免讨论REST,而只关注HTTP。这种替换很有用,因为人们认为REST在API上下文中的含义存在很多混乱和可变性,但是对于HTTP本身是什么却有更大的清晰度和共识。HTTP模型是RPC模型的完美反面-在RPC模型中,可寻址单元是过程,而问题域的实体则隐藏在过程的后面。在HTTP模型中,可寻址单元是实体本身,系统的行为隐藏在实体后面,这是创建,更新或删除它们的副作用。
这就是我在不同用例中理解和使用它们的方式:
示例:餐厅管理
REST用例:订单管理
- create order (POST), update order (PATCH), cancel order (DELETE), retrieve order (GET)
- endpoint: /order?orderId=123
对于资源管理,REST是干净的。具有预定义动作的一个端点。可以看到向世界公开DB(Sql或NoSql)或类实例的方法。
实施示例:
class order:
on_get(self, req, resp): doThis.
on_patch(self, req, resp): doThat.
框架示例:适用于python的Falcon。
RPC用例:操作管理
- prepare ingredients: /operation/clean/kitchen
- cook the order: /operation/cook/123
- serve the order /operation/serve/123
对于基于分析,可操作,无响应,不具有代表性的基于操作的作业,RPC可以更好地工作,并且认为功能正常是很自然的。
实施示例:
@route('/operation/cook/<orderId>')
def cook(orderId): doThis.
@route('/operation/serve/<orderId>')
def serve(orderId): doThat.
框架示例:适用于python的烧瓶