分享

dojo远程过程调用

 tinaroad 2007-05-23

远程过程调用(Remote Procedure Calls(RPC)),也称作远程方法调用( Remote Method Invocations)是客户端/服务器模式应用开发的主要技术之一。RPC允许开发者调用远程主机的方法。Dojo提供了一个基本的RPC客户端类, 并且已经扩展,可以提供对JSON-RPC服务和Yahoo服务的访问。

我们假设已经拥有了一个小型的应用,希望执行服务器调用。出于简单起见,我们希望服务器执行的方法加法和减法操作,即add(x,y)和substract(x,y)。在RPC客户端,我们编写以下的代码:

add = function(x,y) {
request = {x: x, y: y};
dojo.io.bind({
url: "add.php",
load: onAddResults,
mimetype: "text/plain",
content: request
});
}

subtract = function(x,y) {
request = {x: x, y: y};
dojo.io.bind({
url: "subtract",
load: onSubtractResults,
mimetype: "text/plain",
content: request
});
}

由上代码可见,实现并不是十分复杂。这仅仅是一个小型的应用。如果我们的应用 不是这么简单,而是包含了30个不同的请求,将会发生什么状况?我们不得不为不同的请求一次次编写这些相同的代码;每一次获得一个请求对象,指定URL, 往往还要验证参数类型等等。这种做法烦琐无聊,而且常常导致错误。

Dojo的客户端通过对应用所需的远程方法的简单定义,生成客户端函数调用这些方法,从而简化了这整个过程。开发者只需要编写定义文件,初始化RPC客户端对象,所有这些远程方法便可以供开发者正常使用。

需要编写的定义,也称为简单方法描述(Simple Method Description(SMD))文件,是一个简单的JSON字符串,定义了RPC请求将要处理的URL,这个URL可供调用的一些方法,以及这些方法 所需的参数。在我们这个范例中,这个定义文件的内容如下:

{	
"serviceType": "JSON-RPC",
"serviceURL": "rpcProcessor.php",
"methods":[
{
"name": "add",
"parameters":[
{"name": "x"},
{"name": "y"}
]
},
{
"name": "subtract",
"parameters":[
{"name": "x"},
{"name": "y"}
]
}
]
}

在完成描述的创建之后,代码将变得相当简单。这个定义可以以一个字符串,一个可以获取到这个定义的URL,或者是一个JavaScript对象的方式提供。

var myObject = new dojo.rpc.JsonService(definition);

以上就是客户端创建远程调用类的所有代码,剩下的工作就是对方法的调用了。

myObject.add(3,5);

当然,你可能会说:“相当漂亮,但是我还需要获取相加后的结果,而不仅仅是简 单的调用”。获得结果的实现同样也很简单。我们执行了服务器的异步调用,myObject.add()调用的返回值是一个deferred对象(使用 Twisted Python或MochiKit的用户对这个对象比较熟悉)。deferred对象允许开发者为结果事件附加一到多个的回调函数。我们的简单范例如下:

var myDeferred = myObject.add(3,5);
myDeferred.addCallback(myCallbackMethod);

或者是更为简单直接的方式:

var myDeferred = myObject.add(3,5).addCallback(myCallbackMethod);

由上代码可见,我们为myObject.add()返回的deferred对 象附加了myCallbackMethod作为一个回调函数。在这个范例中myCallbackMethod将通过使用参数8被调用。同时,我们也可以附 加错误处理的回调函数到deferred对象。我们可以附加任意个回调函数,他们将被依次调用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多