我试图在REST和JSON-RPC之间做出选择,为web应用程序开发API。它们是如何比较的?
更新2015:我发现REST在Web/HTTP上的API上更容易开发和使用,因为API可以利用客户端和服务器都理解的现有和成熟的HTTP协议。例如,API不需要任何额外的工作或设置就可以使用响应代码、报头、查询、帖子正文、缓存和许多其他特性。
我试图在REST和JSON-RPC之间做出选择,为web应用程序开发API。它们是如何比较的?
更新2015:我发现REST在Web/HTTP上的API上更容易开发和使用,因为API可以利用客户端和服务器都理解的现有和成熟的HTTP协议。例如,API不需要任何额外的工作或设置就可以使用响应代码、报头、查询、帖子正文、缓存和许多其他特性。
当前回答
REST与HTTP紧密耦合,因此如果您只通过HTTP公开API,那么REST更适合于大多数(但不是所有)情况。然而,如果你需要通过其他传输方式(如消息传递或web套接字)公开你的API,那么REST就不适用了。
其他回答
最好在REST和JSON-RPC之间选择JSON-RPC,为web应用程序开发一个更容易理解的API。JSON-RPC是首选,因为它对方法调用和通信的映射很容易理解。
选择最合适的方法取决于约束条件或主要目标。例如,只要性能是一个主要特征,就建议使用JSON-RPC(例如,高性能计算)。但是,如果主要目标是不可知,以便提供一个通用的接口供其他人推断,则建议使用REST。如果两个目标都需要实现,建议同时包含两个协议。
The fact which actually splits REST from JSON-RPC is that it trails a series of carefully thought out constraints- confirming architectural flexibility. The constraints take in ensuring that the client as well as server are able to grow independently of each other (changes can be made without messing up with the application of client), the calls are stateless (the state is regarded as hypermedia), a uniform interface is offered for interactions, the API is advanced on a layered system (Hall, 2010). JSON-RPC is rapid and easy to consume, however as mentioned resources as well as parameters are tightly coupled and it is likely to depend on verbs (api/addUser, api/deleteUser) using GET/ POST whereas REST delivers loosely coupled resources (api/users) in a HTTP. REST API depends up on several HTTP methods such as GET, PUT, POST, DELETE, PATCH. REST is slightly tougher for inexperienced developers to implement.
JSON (denoted as JavaScript Object Notation) being a lightweight data-interchange format, is easy for humans to read as well as write. It is hassle free for machines to parse and generate. JSON is a text format which is entirely language independent but practices conventions that are acquainted to programmers of the family of languages, consisting of C#, C, C++, Java, Perl, JavaScript, Python, and numerous others. Such properties make JSON a perfect data-interchange language and a better choice to opt for.
为什么JSON RPC:
对于REST api,我们必须为可能需要的每个功能/方法定义一个控制器。因此,如果我们想让客户端访问10个方法,我们就必须编写10个控制器来将客户端请求连接到特定的方法。
另一个因素是,即使我们为每个方法/功能使用不同的控制器,客户端也必须记住是使用POST还是GET。这使事情更加复杂。为了发送数据,如果使用POST,则必须设置请求的内容类型。
对于JSONRPC,事情大大简化了,因为大多数JSONRPC服务器操作POST HTTP方法,内容类型始终是application/ JSON。这减轻了在客户端使用正确的HTTP方法和内容设置的负担。
不必为服务器想要向客户端公开的不同方法/功能创建单独的控制器。
为什么休息:
对于服务器希望向客户端公开的不同功能,有不同的url。因此,您可以嵌入这些url。
这些观点大多是有争议的,完全取决于一个人的需要。
RPC的基本问题是耦合。RPC客户端以多种方式与服务实现紧密耦合,在不破坏客户端的情况下更改服务实现变得非常困难:
客户需要知道过程名称; 程序参数顺序,类型和计数事项。在不破坏客户端实现的情况下,在服务器端改变过程签名(参数的数量、参数的顺序、参数类型等)并不是那么容易的; RPC样式只公开过程端点+过程参数。客户不可能决定下一步该做什么。
另一方面,在REST风格中,通过在表示(HTTP报头+表示)中包含控制信息来引导客户端是非常容易的。例如:
It's possible (and actually mandatory) to embed links annotated with link relation types which convey meanings of these URIs; Client implementations do not need to depend on particular procedure names and arguments. Instead, clients depend on message formats. This creates possibility to use already implemented libraries for particular media formats (e.g. Atom, HTML, Collection+JSON, HAL etc...) It's possible to easily change URIs without breaking clients as far as they only depend on registered (or domain specific) link relations; It's possible to embed form-like structures in representations, giving clients the possibility to expose these descriptions as UI capabilities if the end user is human; Support for caching is additional advantage; Standardised status codes;
在REST方面还有更多的区别和优势。
我认为,一如既往,这取决于……
REST具有广泛的公众支持的巨大优势,这意味着有大量的工具和书籍。如果你需要制作一个API,让来自不同组织的大量消费者使用,那么只有一个原因:它是受欢迎的。作为一种协议,它当然是完全失败的,因为有太多完全不同的方法来将命令映射到URL/动词/响应。
因此,当你编写一个需要与后端对话的单页web应用程序时,我认为REST太复杂了。在这种情况下,你不必担心长期的兼容性,因为应用程序和API可以一起发展。
I once started with REST for a single page web app but the fine grained commands between the web app and the server quickly drove me crazy. Should I encode it as a path parameter? In the body? A query parameter? A header? After the URL/Verb/Response design I then had to code this mess in Javascript, the decoder in Java and then call the actual method. Although there are lots of tools for it, it is really tricky to not get any HTTP semantics in your domain code, which is really bad practice. (Cohesion)
尝试为中等复杂的站点制作一个Swagger/OpenAPI文件,并将其与该文件中描述远程过程的单个Java接口进行比较。复杂性的增长是惊人的。
因此,对于单页web应用程序,我从REST切换到JSON-RPC。aI开发了一个小型库,在服务器上编码Java接口,并将其传送到浏览器。在浏览器中,这为为每个函数返回承诺的应用程序代码创建了一个代理。
同样,REST也有它的地位,因为它很有名,因此得到了很好的支持。认识到底层的无状态资源哲学和层次模型也很重要。然而,这些原则同样可以在RPC模型中使用。JSON RPC工作于HTTP之上,因此它在这方面具有与REST相同的优势。不同之处在于,当您不可避免地遇到这些不能很好地映射到这些原则的函数时,您不必被迫做大量不必要的工作。
错误的问题:强加一个根本不存在的摩尼教!
您可以使用带有“较少动词”(没有方法)的JSON-RPC,并保留sendo id、参数、错误代码和警告消息所需的最小标准化。JSON-RPC标准没有说“你不能是REST”,只是说如何打包基本信息。
“REST JSON-RPC”存在!是REST与“最佳实践”,最小化信息包装,简单可靠的合同。
例子
(从这个答案和教学上下文)
在处理REST时,从资源的角度考虑通常会有所帮助。在这种情况下,资源不仅仅是“银行账户”,而是该银行账户的交易……但是JSON-RPC没有指定“方法”参数,所有都是由端点的“路径”编码的。
REST Deposit with POST /Bank/Account/John/Transaction with JSON request {"jsonrpc": "2.0", "id": 12, "params": {"currency":"USD","amount":10}}. The JSON response can be something as {"jsonrpc": "2.0", "result": "sucess", "id": 12} REST Withdraw with POST /Bank/Account/John/Transaction ... similar. ... GET /Bank/Account/John/Transaction/12345@13 ... This could return a JSON record of that exact transaction (e.g. your users generally want a record of debits and credits on their account). Something as {"jsonrpc": "2.0", "result": {"debits":[...],"credits":[...]}, "id": 13}. The convention about (REST) GET request can include encode of id by "@id", so not need to send any JSON, but still using JSON-RPC in the response pack.