Working with JSON RPC from javascript

JSON-RPC is lightweight remote procedure call protocol similar to XML-RPC. Its very simple and its used by alots of web applications at least json wich is very used in modern applications.

To communicate with server in a professional way, json-rpc is a good solution all you need to do is to create server side classes and pass it to an json rpc server class like Zend_Json_Server, read the documentation about how to create the server side.

For the client side you need to create a javascript class witch sends the request to the server and parse the response.

The json request for json-rpc is very simple has three properties in the json object: the method, params and request id.

{method : "Account.login", params : ["user","pass"], id : "194" }

And response contain the result of call, the error if it is, and the request id number.

{"result": "done", "error": null, "id": "194"}

The id of the request and response is used to  match the request and reponse of the current call. For example if you send a request and also add a listener for it, when the response comes call the listener with the specific id. This id is increasing at every request.

I made a simple json-rpc implementation for javscript that handle a json-rpc protocol. Sintax of using this rpc implementation is very simple, its provide a fluent call mode with two functions “call” and “done”."Account.login", "username", "password").done( onLoginResponse );

This Rpc class depends by a public json encoder/decoder class, you can find this class here. For this work you must to change the url from ajax call and changed to your url, and thats all.

var Rpc = {
		id   : 0,
		cid  : 0,
		call : function()
			var args = [];
			for(var i=0;i<arguments.length;i++)
			var method;
			var tosend;;
			this.cid =;
				method = args.shift();

				var tosend = {method : method, params : args, id : this.cid };

					async: true,
					contentType: 'application/json',
					type: 'POST',
					processData: false,
					dataType: 'json',
					url: '/api/js',
					cache: false,
					data: JSON.stringify(tosend),
					error: function(req,stat,err){
					success: function(data){
							if(public.Rpc.callbacks[i].id ==
								var callback = public.Rpc.callbacks[i].callback;
									callback.apply(null, [data.result]);
			return this;
		done   : function(callback)
			if(typeof(callback) == 'function')
			this.callbacks.push( { id : this.cid, callback : callback } );

Leave a Comment.