Monday, 8 October 2007

A Simple JSON-RPC Case in Python

前面说到了Ajax + JSON,既然有开了始,就趁着惯性,再玩了把JSON-RPC。这RPC是啥,不在网上查一下,还真不知道。先来看看Wikipedia上是怎么描述RPC的。

Remote procedure call (RPC) is a technology that allows a computer program to cause a subroutine or procedure to execute in another address space (commonly on another computer on a shared network) without the programmer explicitly coding the details for this remote interaction. That is, the programmer would write essentially the same code whether the subroutine is local to the executing program, or remote. When the software in question is written using object-oriented principles, RPC may be referred to as remote invocation or remote method invocation.
...

下面的例子虽小,JSON-RPC应用的基本流程,还是有的。

. JSON-RPC Client

试验例子中,JSON-RPC的客户端,是一个Python CGI程序。它显示一个字符串,及其长度。其中,字符串长度的计算,通过JSON-RPC,进行远程过程调用来实现。具体的代码如下:

#!/usr/bin/env python

from jsonrpc import ServiceProxy

if (__name__=='__main__'):
print "Content-Type: text/html" # HTML is following
print # blank line, end of headers

s = ServiceProxy("http://10.1.1.100/pyjsonrpc/jsonrpcServices.py")

myStr = "foobar"
myLen = s.getStringLength( myStr )
print "My string is '%s'. There are %d characters." % (myStr, myLen)

在这里,

. 导入class ServiceProxy;
. 用JSON-RPC服务的URL,来初始化一个ServiceProxy;
. 调用远端的过程。

这里用到了jsonrpc这个模块。该模块是从http://svn.json-rpc.org/trunk/python-jsonrpc上,通过SVN下载后,安装。

客户端的表面上看,JSON-RPC所调用的函数,在使用上和本地函数过程,没有特别大的差别。这里唯一需要注意的是,JSON-RPC服务的URL,即使是在本地,也必须是全路径。

. JSON-RPC Services

那么JSON-RPC,真正的服务端,又是什么样子呢?请看jsonrpcServices.py:

#!/usr/bin/env python

from jsonrpc import handleCGI, ServiceMethod

class SimpleService( object ):

@ServiceMethod
def getStringLength( self, data ):
return len( data )

if __name__ == "__main__":
service = SimpleService()
handleCGI( service )

在这里,定义了JSON-RPC Service的过程,处理CGI接口的服务请求。由此可以看到,jsonrpc模块可以自己处理CGI接口的输入和输出。并且,安装、使用jsonrpc并不需要额外的JSON解析模块,如cjson、simplejson等。jsonrpc自身内置了这项功能。在上面的例子中,除了模块名字是jsonrpc之外,看不到什么JSON的影子。没什么好奇怪的,jsonrpc模块包装了所有的技术细节。

其实,JSON只是RPC在使用过程中,用来进行数据交换的一种格式而已。如果采用XML格式,那就是XML-RPC,还有诸如PHP-RPC之类的,等等。

通常网络应用,如Ajax,在使用上,是URL + Data的模式,而在RPC中,则是URL + Action + Data的模式。尽管本质上是一样的,RPC感觉上似乎要更加面向对象一点。这一点点细微的差别,从这个简单的例子就可以看出,RPC使得应用开发得以更进一步的简化。

另外,Remote一下的好处,就是容易实现聚合,这一点比较有用。相信,RPC的应用会越来越广。

0 Comments:

Post a Comment

<< Home