json rpc 详细协议链接
var JsonRpcClient = function(config) // url , method ,callback this there parameters is mandatory { //private data var _callbackObj = {}; var _reqRespMapping = []; var _createId = function() { return ""+(new Date()).getTime(); }; var _send = function(jsonData) { var _sync=false; if(config.sync) _sync=config.sync; Ext.Ajax.request({ method:'POST', url: config.url, sync:_sync, success: function(res) { response = Ext.decode(res.responseText); _reqRespMapping.remove(response.id); if(config.callback) { config.callback(response); } }, failure: function() { _reqRespMapping.remove(jsonData.id); if(config.callback) { config.callback({"error":true,result:''}); } }, jsonData : jsonData, headers:{"Content-Type":"application/json-rpc;charset=UTF-8"} }); }; this[config.method]=function() { var id = _createId(); var args = []; for(var i=0;i<arguments.length;i++) { args[i]=arguments[i]; } var jsonRpcReq = { method: config.method, params: args, id: id }; _reqRespMapping[id] = jsonRpcReq; _send(jsonRpcReq); } }
在使用jsonplugin 会遇到协议头的解析错误,原因是Ext.Ajax 对协议头重复和错误包装,可以复写initHeader 方法达到协议的头正确设置代码如下:
Ext.lib.Ajax.initHeader=function(label, value, isDefault) { var headerObj = (isDefault) ? this.defaultHeaders : this.headers; if (headerObj[label] === undefined) { headerObj[label] = value; } else { headerObj[label] = headerObj[label] + "," + value;// 新协议头的定义放到最后面 } if (isDefault) { this.hasDefaultHeaders = true; } else { this.hasHeaders = true; } }
js 调用也非常的简单
var client=new JsonRpcClient({url:'xxx.action',method:'xxxmethod',sync:true,callback:function(res){});
client.xxxmethod();
首先初始化一个 rpc cilent ;
method :远程方法名
sync :是否同步调用
callback : 回调函数
初始化完毕 cilent 就是调用远程的方法了。