我有一个接受JSON参数并具有特定方法URL的Web服务,例如:
http://IP:PORT/API/getAllData?p={JSON}
这绝对不是符合REST的标准,因为它不是无状态的。它会考虑cookie并拥有自己的会话。
那它是RPC吗?RPC和REST有什么区别?
我有一个接受JSON参数并具有特定方法URL的Web服务,例如:
http://IP:PORT/API/getAllData?p={JSON}
这绝对不是符合REST的标准,因为它不是无状态的。它会考虑cookie并拥有自己的会话。
那它是RPC吗?RPC和REST有什么区别?
Retrieving an Order:
Updating an Order:
示例取自sites.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpc
Orders/Order
从我的角度来看不好看 - gstackoverflow仅凭您发布的内容无法清楚地区分REST或RPC。
REST的一个约束是它必须是无状态的。如果您有会话,那么您就有状态,因此您不能将服务称为RESTful。
在您的URL中有一个动作(即getAllData
),这表明其属于RPC。在REST中,您交换表示,并且执行的操作由HTTP动词指定。此外,在REST中,内容协商不使用?p={JSON}
参数进行。
不知道您的服务是否为RPC,但它不是RESTful的。您可以在网上了解区别,这里是一篇文章供您入门:RPC和REST的神话破冰。您更了解自己的服务内部情况,因此请将其功能与RPC进行比较,然后得出自己的结论。
正如其他人所说,一个关键的区别在于REST URL以名词为中心,而RPC URL以动词为中心。我只想包括这个具有清晰示例的表格来说明:
---------------------------+-------------------------------------+-------------------------- 操作 | RPC(操作) | REST(资源) ---------------------------+-------------------------------------+-------------------------- 注册 | POST /signup | POST /persons ---------------------------+-------------------------------------+-------------------------- 辞职 | POST /resign | DELETE /persons/1234 ---------------------------+-------------------------------------+-------------------------- 读取个人信息 | GET /readPerson?personid=1234 | GET /persons/1234 ---------------------------+-------------------------------------+-------------------------- 读取个人物品列表 | GET /readUsersItemsList?userid=1234 | GET /persons/1234/items ---------------------------+-------------------------------------+-------------------------- 向个人物品列表添加物品 | POST /addItemToUsersItemsList | POST /persons/1234/items更新项目 | POST /modifyItem | PUT /items/456 删除项目 | POST /removeItem?itemId=456 | DELETE /items/456
这是使用HTTP的RPC。正确实现REST应该与RPC有所不同。具有处理数据逻辑的类似方法/函数的方式属于RPC。getAllData()是一种智能方法。REST不能具有智能性,它应该是可以由外部智能查询的愚笨数据。
我最近看到的大多数实现都是RPC,但许多人错误地称其为REST。REST与HTTP结合是救世主,SOAP与XML相对而言糟糕。所以你的困惑是合理的,你是正确的,它不是REST。但请记住,REST并不新(2000年),尽管SOAP/XML很旧,json-rpc稍后出现(2005年)。
HTTP协议本身并不能构建REST实现。REST(GET、POST、PUT、PATCH、DELETE)和RPC(GET + POST)两者都可以通过HTTP进行开发(例如:通过Visual Studio中的Web API项目)。
不过,那么REST是什么呢?以下是Richardson成熟度模型(摘要),只有第3级才是符合REST原则的。
例如:级别3(HATEOAS):
链接说明此对象可以通过这种方式进行更新,并且可以通过这种方式进行添加。
链接说明此对象只能被读取,以及如何读取。
显然,仅发送数据还不足以成为REST,但是如何查询数据也应该提到。但再次问一下,为什么要有4个步骤?为什么不能只有第4步并称之为REST?Richardson只是给了我们一个逐步接近目标的方法而已。
最后一个问题:为什么我们需要一个链接来解释如何调用它?任何程序员只需查看端点就知道如何调用API。或者在最坏的情况下,只需联系开发人员并询问!
你已经建立了可以被人类使用的网站。但是你能否也建立出可以被机器使用的网站呢?这就是未来的方向,而《RESTful Web Services》会告诉你如何做到。REST的最佳应用是处理资源,而RPC更多涉及操作。
REST代表表述性状态转移。它是组织独立系统之间交互的简单方法。 RESTful应用通常使用HTTP请求发布数据(创建和/或更新),读取数据(例如,进行查询)和删除数据。因此,REST可以使用HTTP执行所有四个CRUD(创建/读取/更新/删除)操作。
RPC主要用于不同模块之间的通信,以响应用户请求。 例如,在openstack中,当启动虚拟机时,如何让nova、glance和neutron一起工作。
分享的URL看起来像是RPC终端点。 以下是RPC和REST的示例。希望这有助于理解它们何时可以使用。
让我们考虑一个终端点,向客户发送应用程序维护中断电子邮件。
此终端点执行一个特定的操作。
RPC
POST https://localhost:8080/sendOutageEmails
BODY: {"message": "we have a scheduled system downtime today at 1 AM"}
REST
POST https://localhost:8080/emails/outage
BODY: {"message": "we have a scheduled system downtime today at 1 AM"}
在这种情况下,使用RPC端点更加合适。当API调用执行单个任务或操作时,通常会使用RPC端点。显然,我们可以像所示一样使用REST,但是该端点不太符合RESTful的规范,因为我们没有对资源执行操作。
现在让我们看一个将数据存储在数据库中的端点。(典型的CRUD操作)
RPC
POST https://localhost:8080/saveBookDetails
BODY: {"id": "123", "name": "book1", "year": "2020"}
REST
POST https://localhost:8080/books
BODY: {"id": "123", "name": "book1", "year": "2020"}
REST在这种情况下(CRUD)要好得多。在这里,可以使用适当的HTTP方法来读取(GET)、删除(DELETE)或更新(PUT)。方法决定了资源(在这种情况下为“books”)上的操作。 在这里使用RPC不合适,因为我们需要为每个CRUD操作(/getBookDetails、/deleteBookDetails、/updateBookDetails)设置不同的路径,并且对应用程序中的所有资源都必须这样做。
总之,
Slack使用这种风格的HTTP RPC Web API's - https://api.slack.com/web
我会这样说:
我的实体是否持有/拥有数据?如果是,则使用RPC:这里是一份部分数据的副本,请操作我发送给你的数据副本并将您的结果返回给我。
被调用实体是否持有/拥有数据?则使用REST:要么(1)向我展示一份部分数据,要么(2)操作一些数据。
最终关键在于哪个“方”拥有/持有数据。是的,你可以使用REST措辞与基于RPC的系统交谈,但这样做仍然会进行RPC活动。
例子1:我有一个对象通过DAO与关系型数据库存储区(或任何其他类型的数据存储区)进行通信。在我的对象和可以作为API存在的数据访问对象之间进行交互时,使用REST风格是有道理的。我的实体不拥有/持有数据,关系型数据库(或非关系型数据存储区)拥有/持有数据。
例子2:我需要进行大量复杂的数学计算。我不想将许多数学方法加载到我的对象中,我只想将一些值传递给其他能够进行各种数学计算的东西,并获得结果。然后RPC风格是有意义的,因为数学对象/实体将向我的对象公开大量操作。请注意,这些方法可能都会作为单独的API公开,并且我可以使用GET调用它们中的任何一个。我甚至可以声称这是符合REST原则的,因为我通过HTTP GET进行调用,但实际上在幕后进行的是RPC。我的实体拥有/持有数据,远程实体只是对我传递给它的数据副本进行操作。
在HTTP协议下,它们最终只是HttpRequest
对象,并且都期望返回一个HttpResponse
对象。我认为可以根据这个描述继续编码,然后考虑其他事情。
以下是我对它们在不同应用场景中的理解和使用方法:
例子:餐厅管理
REST的使用场景: 订单管理
- create order (POST), update order (PATCH), cancel order (DELETE), retrieve order (GET)
- endpoint: /order?orderId=123
对于资源管理,REST非常简洁。一个端点包含预定义的操作。它可以被看作是将数据库(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的Flask