REST VS JSON-RPC?(REST vs JSON-RPC?)

2019-07-20 11:01发布

我想REST和JSON-RPC之间进行选择用于开发Web应用程序的API。 哪一个更容易使用的API客户端?

2015年更新:我发现REST易于开发和使用其基于Web / HTTP服务的API,因为这是由客户端和服务器了解现有的和成熟的HTTP协议无法通过API加以利用。 例如响应代码,头,查询,发布机构,缓存和许多其他功能可以通过API没有任何额外的努力或安装使用。

Answer 1:

与RPC的根本问题是耦合。 RPC客户成为紧密结合,以服务多种方式实现,它变得非常难以改变服务实现在不破坏客户端:

  • 客户需要知道程序的名字;
  • 过程参数命令,类型和计数问题。 这不是那么容易改变的服务器端程序签名(参数个数,的参数顺序,参数类型等)而不会破坏客户端的实现;
  • RPC风格不公开什么,但程序的端点+过程参数。 这是不可能的客户端,以确定哪些可以下一步要做。

在REST风格另一方面它很容易通过在表示控制信息(HTTP头+表示)来引导客户。 例如:

  • 这是可能的(实际上是强制的)与传达这些URI的含义链接关系类型的注释嵌入链接;
  • 客户端的实现并不需要依赖于特定的程序名和参数。 相反,客户依赖于消息格式。 这造成可能使用已经实施库特定的媒体格式(例如原子,HTML,收藏+ JSON,HAL等...)
  • 它可以容易地改变的URI不会破坏客户只要它们只依赖于注册(或特定领域)的链接关系;
  • 它可以嵌入在交涉形式样结构,让客户如果最终用户是人类揭露这些描述为UI功能的可能性;
  • 缓存的支持是额外的优势;
  • 标准化状态代码;

有对REST侧有更多的差异和优势。



Answer 2:

我已经探讨这个问题的一些细节,并决定纯粹的REST的方式太受限制,而RPC是最好的,即使大多数我的应用程序是CRUD应用程序。 如果你坚持要休息,你最终会被抓你的头,你想知道如何可以轻松地添加另一种方法需要你的API,用于一些特殊用途。 在许多情况下,只有这样,才能做到这一点与REST是为它创建另一个控制器,这可能过于复杂程序。

如果你决定RPC,唯一的区别是,你明确指定动词为URI,这是明确的,一贯的,车少了,真的没有问题的一部分。 特别是如果你创建这远远超出了简单的CRUD应用程序,RPC是唯一的出路。 我有一个REST的纯化论者的另一个问题:HTTP POST,GET,PUT,DELETE有已被颠覆成REST意味着其他的东西在HTTP明确的含义,仅仅是因为他们适合大部分的时间 - 但不是所有的时间。

在编程中,我早就发现,试图用一两件事来表示两件事情是要一段时间过来和咬你。 我喜欢使用POST为几乎每一个动作的能力,因为它提供了自由发送和你的方法需要做接收数据。 你可以不适合整个世界变成CRUD。



Answer 3:

首先,HTTP-REST是“表述性状态转移”架构。 这意味着有很多有趣的事情:

  • 你的API将是无状态的,因此更容易设计(它真的很容易忘记在复杂自动机的转换),并与独立软件部分整合。
  • 您将导致设计的读取方法是安全的,这将是很容易的缓存,并集成。
  • 您将导致设计写入方法为幂等的,将处理超时好得多。

其次,HTTP,REST与HTTP完全兼容(参见“安全”,并在前面的部分“幂等”),因此您将能够重复使用HTTP图书馆(现为每一个现有的语言)和HTTP和反向代理服务器,它会给你的能力来实现的高级功能(高速缓存,认证,压缩,重定向,重写,记录等)具有零行代码。

最后但并非最不重要的,使用HTTP作为一个RPC协议是根据(REST的和发明人)HTTP 1.1的设计者一个巨大的错误: http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation。 HTM#sec_6_5_2



Answer 4:

伟大的答案 - 只是想澄清在一些评论。 JSON-RPC是快速和容易消耗,但如所提到的资源和参数是紧耦合的,它往往依赖于使用GET / POST,其中-作为REST提供松耦合资源(API /动词(API / deleteUser,API / ADDUSER)用户),在一个HTTP REST API依赖于若干HTTP方法(GET,POST,PUT,PATCH,DELETE)。 REST是稍硬对于没有经验的开发人员能够实现,但现在的风格已经成为相当普遍的地方,它提供了长期的更大的灵活性(给你的API更长的使用寿命)。

除了没有紧密耦合的资源,REST也可以让你避免被提交到一个单一的内容类型 - 这意味着,如果你的客户需要在XML来接收数据,或者JSON,甚至YAML - 如果内置到系统中你可以返回任何使用内容类型/接受头的那些。

这可以让你保持你的API足够灵活,以支持新的内容类型或客户的要求。

但是真正的JSON-RPC分离REST是,它遵循一系列深思熟虑的constraints-确保结构上的灵活性。 这些限制包括确保客户端和服务器都能够独立发展彼此的(你可以不搞乱客户端的应用程序变更),调用是无状态(状态通过超媒体表示),一个统一的接口提供了一种互动, API被分层系统上开发的,并且响应是由客户端缓存。 还有用于按需提供代码的可选的约束。

然而,这一切说的 - 大多数API不是基于REST(根据菲尔丁),因为它们不包含超媒体(嵌入式超文本链接在帮助浏览API响应)。 大多数API,你会发现有类似REST在他们遵循大多数REST的概念,但忽略了此约束。 然而,越来越多的API实现这一点,它变得更像是主流做法。

这也为您提供了一些灵活性,超媒体驱动的API(如Stormpath)直接在客户端中的URI(如果有新的变化意味着,在某些情况下,你可以修改URI没有负面影响),其中,与RPC的URI需要是静态的。 随着RPC,你还需要大量记录这些不同的URI,并解释它们相对于彼此是如何工作的。

在一般情况下,我会说剩下的就是去,如果你想建立一个可扩展的,灵活的API,这将是长期存在的方式。 出于这个原因,我会说这是去的时候99%的航线。

祝你好运,麦克



Answer 5:

如果您的服务工作正常,只有模型和GET / POST / PUT / DELETE模式,用纯REST。

我同意HTTP最初被设计为无状态的应用程序。

但是对现代的,更复杂的(!)的实时(网络),您将要使用WebSockets(这往往意味着有状态)的应用程序,为什么不能同时使用? JSON-RPC过的WebSockets是很轻,所以你有以下好处:

  • 每个客户端上的即时更新(定义你自己的服务器到客户端RPC调用用于更新机型)
  • 轻松添加复杂性(试图使EtherPad的克隆只有REST)
  • 如果你这样做的权利(添加RPC仅作为实时额外的),大部分仍然是可用的,只有REST(除非其主要特点是聊天什么的)

当你只设计了服务器端API,开始与定义REST模式和以后添加JSON-RPC支持,根据需要,保持RPC调用的次数降到最低。

(和抱歉括号过度使用)



Answer 6:

IMO,关键一点是动作VS资源的方向。 REST是资源导向,非常适合用于CRUD操作,并赋予其已知的语义提供了一些可预测到的第一用户,但从方法或程序的力量来实现,当你提供人工转换到资源中心的世界。 在另一方面RPC完全适合于面向行动的API,在这里公开服务,而不是CRUD操作,能够资源集。

毫无疑问,REST是比较受欢迎的,如果你要的API暴露给第三方,这无疑增加了一些分。

如果不是(例如,在创建一个SPA的AJAX前端的情况下),我的选择是RPC。 特别JSON-RPC,使用JSON模式组合为描述语言,并输送或HTTP的WebSockets根据使用情况下结束。

JSON-RPC是一个简单而雅致的规范,定义在同步或异步RPC所使用的请求和响应JSON有效载荷。

JSON模式是定义旨在描述JSON数据的JSON格式基于规范草案。 通过描述使用JSON模式服务的输入和输出消息,可以在消息结构中的任意复杂程度不影响可用性和服务集成,可以自动化。

传输协议(HTTP VS的WebSockets)的选择取决于不同的因素,是最重要的,是否需要HTTP的功能(高速缓存,再验证,安全性,幂等,内容类型,多,......),还是你的应用程序需要互换在高frecuencies消息。

到现在为止这是非常我个人认为在这个问题上,但现在的东西,可以为那些Java开发者阅读这些线路真正有用的,该框架在过去一年我一直在努力,从你现在想知道同样的问题诞生:

http://rpc.brutusin.org

你可以在这里看到现场演示,展示了功能测试(感谢JSON模式)等一系列的服务,例如内置的版本库浏览器:

http://demo.rpc.brutusin.org

希望它可以帮助队友!

纳乔



Answer 7:

我已经在过去的REST的大风扇,它拥有在纸上RPC许多优点。 您可以呈现不同的内容类型,缓存,HTTP状态代码重用的客户端,可以通过API引导客户,你可以在API中嵌入文档如果不是大多自我解释反正。

但我的经验是,在实践中,这是站不住脚的,而是你做了很多不必要的工作得到的一切权利。 另外,HTTP状态代码往往不映射到你的域逻辑准确,在你的环境中使用他们常常感觉有点被迫的。 但是关于在我看来REST最糟糕的事情是,你花了很多时间来设计你的资源,他们允许的相互作用。 每当你做一些重大的补充,你的API,你希望你找到一个很好的解决方案,以增加新的功能,你没有设计自己逼到墙角了。

这常常感觉就像是浪费时间对我来说,因为大部分的时间我已经有关于如何将API模型为一组远程过程调用的一个完美的罚款和明显的主意。 如果我已经经历了这一切的努力来模拟REST的约束下一个问题是如何从客户端调用内我的问题了? 我们的计划是根据调用程序,以便建立一个良好的RPC客户端库很容易,建立一个良好的REST客户端库没有这么多,而且在大多数情况下,你将映射从您的REST API回服务器的一组程序在客户端上图书馆。

正因为如此,RPC感觉今天的很多更简单,更自然的我。 我真的很想念虽然是一个统一的框架,可以很容易编写是自描述的,可互操作RPC服务。 因此,我创建了自己的项目尝试新的方式,使我自己RPC更容易,也许别人发现它有用,太: https://github.com/aheck/reflectrpc



Answer 8:

按照理查德森成熟度模型 ,这个问题不是休息与RPC,多少休息吗?

这种观点认为,在符合REST标准可在4个级别进行分类。

  • 0级:想在动作和参数方面。 如文中所述, 这基本上等同于JSON-RPC(文章解释了它的XML-RPC,但相同的参数保持两者)。
  • 1级:想在资源方面。 相关的资源都属于同一个网址
  • 级别2:使用HTTP动词
  • 3级:HATEOAS

根据REST标准的创造者,只有3级服务可以被称为REST风格。 然而,这是合规性的度量,而不是质量。 如果你只是想调用一个远程函数,它的计算,它可能是没有意义的在响应有关超媒体链接,行为既不分化基于使用的HTTP动词。 所以,这样一个电话本身更趋于RPC-等。 然而,较低的符合性水平并不一定意味着有状态,或更高的耦合。 也许,而不是想着REST与RPC,你应该使用尽可能多的REST越好,但没有更多。 不要扭曲您的应用程序只是正好与REST风格的合规标准。



Answer 9:

为什么JSON RPC:

在REST的API的情况下,我们必须定义每个功能/方法,我们可能需要一个控制器。 因此,如果我们有,我们要在客户端访问的10种方法,我们必须写10个控制器接口的客户端的请求到一个特定的方法。

另一个因素是,尽管我们有不同的控制器为每个方法/功能,客户端必须记住阉使用POST或GET。 这进一步复杂化的东西。 最重要的是要发送的数据,就必须设置请求的内容类型,如果使用POST。

在JSON RPC的情况下,事情大大简化,因为最JSONRPC服务器上POST HTTP方法操作和内容类型是总是应用/ JSON。 这需要关断负载记住使用正确的HTTP方法和在客户端内容设置的。

人们不必创建不同的方法/功能服务器要暴露给客户端单独的控制器。

为什么REST:

您有不同的功能服务器要暴露给客户端不同的URL。 其结果是,您可以嵌入这些URL。

大多数这些点是值得商榷的,完全取决于需要的人。



Answer 10:

如果您请求的资源,则基于REST的API是由设计更好。 如果您要求一些复杂的数据有很多的参数,比简单的CRUD其他复杂的方法,那么RPC是正确的道路要走。



Answer 11:

错误的问题:征收摩尼教是不存在的!

您可以使用JSON-RPC与“少动词”(无方法 ),并保持必要的仙道ID,参数, 错误代码和警告消息的最小标准化。 该JSON-RPC标准中没有说“你不能休息”,只说怎么收拾的基本信息。

“REST JSON-RPC”的存在 ! 是REST与“最佳实践”为最小的信息包装,简单和坚实的合同。


(从这个答案和教学情境)

当与REST处理,一般有助于在资源方面的思维开始。 在这种情况下,资源不只是“银行账户”,但它是银行账户的交易......但JSON-RPC不责成“方法”参数,它们都通过终点的“路径”编码。

  • REST 存款POST /Bank/Account/John/Transaction使用JSON请求{"jsonrpc": "2.0", "id": 12, "params": {"currency":"USD","amount":10}}
    JSON响应可以是东西作为{"jsonrpc": "2.0", "result": "sucess", "id": 12}

  • REST 翻供 POST /Bank/Account/John/Transaction ......类似。

  • ... GET /Bank/Account/John/Transaction/12345@13 ...这可能会返回确切交易的JSON记录(例如你的用户一般都希望借方和贷方对他们的账户的记录)。 东西作为{"jsonrpc": "2.0", "result": {"debits":[...],"credits":[...]}, "id": 13} 对公约(REST)GET请求可以包括由“@id” ID编码的,所以不需要发送任何JSON,但仍然使用JSON-RPC的响应包。



Answer 12:

我认为,一如既往,这取决于...

REST拥有的广泛的公众支持的巨大优势,这意味着大量的工具和书籍。 如果您需要所使用的大量的消费者来自不同组织的API,然后是去只有一个原因的方式:它是流行。 作为协议它当然是一个总的故障,因为有太多的完全不同的方式来一个命令映射到URL /动词/响应。

因此,当你写一个单页web应用程序,需要跟后端那么我认为REST是太复杂。 在这种情况下,你不必担心长期的兼容性,因为应用程序和API可以一起进化。

有一次,我开始与REST单个页面的Web应用程序,但Web应用程序与服务器之间的细粒度的命令很快让我抓狂。 我应该对其进行编码,作为路径参数? 在身体里? 查询参数? 一个头? 网址/动词/响应的设计后,我再有在Javascript,Java中的解码器进行编码这个烂摊子,然后调用的实际方法。 虽然有很多的IT工具,它是真正棘手的在您的域代码,这是非常不好的做法没有得到任何HTTP语义。 (凝聚)

试着做一扬鞭/ OpenAPI的文件中等复杂的网站和比较,来描述该文件中的远程过程一个Java接口。 的复杂性的增加是惊人的。

因此,我从静止切换到JSON-RPC的单页Web应用程序。 AI开发了编码的服务器上的Java接口,并将其运到浏览器的一个小图书馆。 在浏览器这创造为返回的每个功能的承诺,在应用程序代码的代理。

再次,REST有它的地方,只是因为它是著名的,因此很好的支持。 同样重要的是认识到潜在的无状态的资源理念和层次模型。 但是,这些原则,可以很容易地在RPC模型中使用。 JSON RPC工作通过HTTP所以它在这方面的REST相同的优点。 所不同的是,当你难免会碰到这些功能没有很好地映射到这些原则,你不会被迫做了很多不必要的工作。



Answer 13:

剩下的就是紧密结合HTTP,所以如果你只通过HTTP暴露你的API,然后REST更适合于大多数(但不是全部)的情况。 但是,如果您需要通过其他传输像短信或网络插座暴露你的API,然后REST是不适用的。



Answer 14:

我觉得有一点人们忘了提。 如果你已经有一个Web应用程序,然后休息是需要的,因为你需要的应用服务器反正,你可以既安全使用HTTPS ...但如果你没有一个Web应用程序,(只是有一个应用程序),然后RPC是可取的,因为你不再需要安装一个应用程序服务器,并配置它是一个hastle。 除了比,我没有看到在任何任何真正的根本优势。



Answer 15:

这将是更好的选择REST和JSON-RPC之间的JSON-RPC开发Web应用程序更易于理解的API。 JSON-RPC是优选的,因为它的方法调用和通信映射可以被容易地理解。

选择最合适的方法依赖于约束或主要目标。 例如,只要业绩是一大特点,最好是去JSON-RPC(例如,高性能计算)。 但是,如果主要目的是是为了提供一个通用的接口被他人推断不可知,最好是去休息。 如果您需要这两个目标来实现的,最好是包括两个协议。

这实际上从JSON-RPC分裂REST的事实是,它落后了一系列深思熟虑的constraints-确认架构的灵活性。 约束采取在确保客户端和服务器能够彼此独立发展(修改,而不与客户端的应用程序搞乱进行),调用是无状态(状态被视为超媒体),统一接口供交互,该API是一个分层系统(霍尔,2010年)提出。 JSON-RPC是快速和容易消耗,然而如所提资源以及紧密耦合参数,这是可能取决于使用GET / POST动词(API / ADDUSER,API / deleteUser),而REST提供松耦合资源(API /用户)在一个HTTP。 REST API依赖了几个HTTP方法如GET,PUT,POST,DELETE,补丁。 REST是稍微强硬对于没有经验的开发人员能够实现。

JSON(表示为JavaScript对象符号)是一种轻量级的数据交换格式,是便于人类的写读为好。 这是无忧无虑机器解析和生成。 JSON是一个文本格式,它是完全独立的语言,但做法是认识到家庭的语言的程序员,包括C#,C,C ++,Java和Perl中,JavaScript中,Python和许多其他约定。 这些特性使JSON一个完美的数据交换语言和一个更好的选择选择。



Answer 16:

我使用VDATA的RPC协议: http://vdata.dekuan.org/

1,PHP和JavaScript都还好。 2,跨源资源共享(CORS)调用仍然没有问题。



文章来源: REST vs JSON-RPC?