Jump to Navigation

JSON-RPC协议与网络传输

通常据说的JSON-RPC协议指的是数据格式协议,
对于数据包的传输,可以使用不同的网络连接协议实现,
最基本的只使用tcp传输,所有传递的数据包以 json格式为准。
对于无法识别成json格式的数据包,像其他的类似软件一样认为协议错误。

另外,其他的像http,websocket这些通用协议,都可以作为JSON-RPC的传输层使用。
RPC的概念是一个远程过程调用,想当于通过网络执行一段远程服务器上的代码。
那么这段代码可以理解成普通编程语言中的函数,
它有函数名字和函数参数,这样程序的其他位置可以通过名字与参数调用。
JSON-RPC协议也是如此,给远程服务器一段功能代码一个名字与输入参数,
然后通过网络发起这段功能代码的调用,执行并返回结果。

所以,JSON-RPC协议标准,每次调用都需要提供一个方法名,一组方法参数。

例如,以JSON-RPC over HTTP为例,构造一个简单的请求:
请求包:
"POST /jsonrpc HTTP/1.0\r\n"
"Host: 127.0.0.1\r\n"
"Content-length: 71\r\n"
"\r\n"
"{"id": 1,"jsonrpc": "2.0","method": "aria2.getVersion","params": ["a"]}"
响应包:
HTTP/1.1 200 OK
Date: Mon, 07 Oct 2013 19:36:31 GMT
Content-Length: 170
Expires: Mon, 07 Oct 2013 19:36:31 GMT
Cache-Control: no-cache
Content-Type: application/json-rpc
Connection: close

{"id":1,"jsonrpc":"2.0","result":{"enabledFeatures":["Async DNS","BitTorrent","Firefox3 Cookie","GZip","HTTPS","Message Digest","Metalink","XML-RPC"],"version":"1.18.0"}}"

简单的解释也就是,把HTTP POST协议中的K/V格式替换成了JSON格式,
服务器解析时按照JSON格式解析POST过来的数据,查找method和params两个参数并行相应的代码。
在返回时,HTTP头中的Content-Type变了application/json-rpc,
而不是通过HTTP协议输出的text/html文件类型。
在HTTP协议头之后的所有数据作为JSON格式的返回结果处理。

个人认为之所以出现JSON-RPC这种协议格式,
原因在于它的标准化,通用化,可视化,最终传输协议的实现比较简单。
很明显,JSON-RPC依赖JSON数据标准的发展,由于JSON数据标准的流行才流行起来的。
还有一个原因,浏览器逐渐强大,web应用的快速发展也起到推动JSON标准流行的作用。
所以,它流行并不是因为效率有多么高,因为JSON的解析速度快不了。

与JSON-RPC对应的更早协议是XML-RPC协议。
这个出现的比较早,其标准很类似。
在其他方面都差不多的情况下,JSON解析速度想比XML快,
JSON比XML越来越流行,这就是JSON-RPC的优势所在。

从XML-RPC到JSON-RPC,也是人们对于看得见的协议的喜好与高效率代码的喜好折衷的结果。
计算机技术不断发展,没有最好,只有更好。

最近又发现一种同时支持文本格式与二进制格式的msgpack数据标准,
它的定位是轻量级的高效的网络传输数据标准,解析速度与包大小均小于JSON。
由于它支持文本格式与二进制格式标准,在复杂度上是否会小还不太确定。
对于msgpack数据标准是否能发展到如JSON一样流行,我们还需要耐心等待。

--
这是我对JSON-RPC及XML-RPC协议的认识理解,
由于刚接触不久,理解不到位地方请读者指出。

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut