Home

Awesome

<img src="http://i.imgur.com/DNNlN.png" width="800" border = "0"/>

rpc.js

Simple and lightweight JSON-RPC [gateway, server and documentation] for Node.JS

You can use it standalone (without any dependency) or integrate in your favorite framework (tested with flatiron and express)


Main Features


Try a demo

git clone https://hugorodrigues@github.com/hugorodrigues/rpc.js.git
node rpc.js/examples/servers/http.js

Open your browser: http://127.0.0.1:3000/help


How it works

You simply define your methods and set the parameters.

Method declaration structure

methodName: {
	info: 'Description of your method',
	params: {
		paramFoo: { required: true, type: 'number', info: 'Description of paramFoo'},
		paramBar: { required: false, type: 'string', info: 'Description of paramBar'}
	},
	action: function(params,output)
	{
		// Do your stuff here
		// You can use the params: params.paramFoo params.paramBar
		// When ready output with: output.win(result);

		// On error output with: output.fail(errorCode,errorMsg,errorData);
	}
},

Example method that sum two numbers:

sum: {
	info: 'Sum two numbers',
	params: {
		x: { required: true, type: 'number', info: 'X value'},
		y: { required: true, type: 'number', info: 'Y value'}
	},
	action: function(params,output)
	{
		var result = parseInt(params.x) + parseInt(params.y);
		output.win(result);
	}
},

Full Example

The following example will create a JSON-RPC server on 127.0.0.1:3000 with two methods:

// Load rpc.js
var rpc = require('rpc.js');

// Define you schema/Api
var apiSchema = {
	// Groups - Used to categorize your methods
	groups: {
		math: {
		    name: 'Math',
		    info: 'Some example math methods',
		},
		util: {
		    name: 'Utility calls',
		    info: 'API test, debug and utility methods',
		}
	},

	// Your API methods
	methods: {

		sum: {
			info: 'Adding two numbers',
			group: 'math',
			params: {
				x: { required: true, type: 'number', info: 'X value'},
				y: { required: true, type: 'number', info: 'Y value'}
			},
			action: function(params,output)
			{
				var result = parseInt(params.x) + parseInt(params.y);
				output.win(result);
			}
		},

		helloWorld: {
			info: 'Say hello!',
			group: 'util',
			params: {
				name: { required: true, type: 'string', info: 'The name - Must be "World"'}
			},
			action: function(params,output)
			{
				if (params.name == 'World')
					output.win("Hello World!");
				else
					output.fail(500,'The param "name" should be "World"');

			}
		}

	}
};


// Run a HTTP server on 127.0.0.1:3000 and with your schema
rpc.server('http', {
	port: 3000,
	address: '127.0.0.1',
	gateway: rpc.gateway({ schema: apiSchema }) // Your previously defined apiSchema
});


When the server is running, you can open http://127.0.0.1:3000/help to view the documenation and start testing your API.

Inside the action you can output successful responses with output.win("Hello World"); or error messages with output.fail(500, "You error Message"); Check the file /examples/example.schema.js for the full schema used in the demo and Screenshot's.


Consuming your api

Just like you do with any regular JSON-RPC api. Some examples:

In browser (using jquery)

jQuery.post('http://127.0.0.1:3000', {rpc:JSON.stringify({
    method:'sum', 
    params: { x: 10, y:5 }
})}, function (data){
    
    console.log(data.result);
    // 15

}, 'json');

Command line (Curl)

curl -i -X POST -d rpc='{"method":"sum","params":{"x":"10","y":"5"}}' http://127.0.0.1:3000/

Will Output: {"jsonrpc":"2.0","result":15}


Examples

rpc-js is very flexible and can be adapted to your needs. Check the /examples:

examples/servers/http.js - Standalone HTTP server implementation.

examples/servers/socketio.js - Socket.Io Implementation.

examples/servers/telnet.js - Socket server Implementation.

examples/dummy/index.js - This examples shows you how to use your api without any server. Is usefull when you need to access your api inside another nodejs application.

examples/express/index.js - Using your API in a expressJs Application

examples/flatiron/index.js - Using your API in a flatiron Application

examples/multi-schema/index.js - Insted of having a large schema, you can divide your api code base in a class-like fashion, This example is suggested if you have a big api and/or prefer use multiple object files.

examples/multi-server/index.js - Expose the same API in multiple http ports

examples/multi-version/index.js - Expose multiple versions of your API (/v1, /v2 etc...)


Inspiration

The automatic ui/documentation was inspired by webservice.js by Marak Squires https://github.com/Marak/webservice.js


License

(The MIT License)

Copyright (c) 2012, Hugo Rodrigues correio@hugorodrigues.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.