RJSONRPC2 - Restricted implementation of JSON-RPC 2.0 for Erlang
June 28, 2012 ยท View on GitHub
Restricted implementation of the JSONRPC 2.0 spec www.jsonrpc.org/specification
Only supports JSONRPC 2.0 requests with named parameters and needs a interface/proplists of methods and parameter types that is used to decode and validate jsonrpc requests.
Example
Client jsonrpc-requests to be handled
request1: {"jsonrpc": "2.0",
"method": "login",
"params": {"username": "foo",
"password": "bar"},
"id": "_login"}
% For valid jsonrpc 2.0 request
response1: {"jsonrpc": "2.0",
"result": "true"|"false",
"id": "_login"}
% Notification (i.e. no Id provided) so not response required
request2: {"jsonrpc": "2.0",
"method": "logout"}
Sample misultin websocket loop to handle JSON-RPC 2.0 request and response (See misultin wiki on github to setup websocket server)
% Define interface to handle JSON-RPC 2.0 requests
% Aside: parameter types can be the following atoms
% binary|integer|float|boolean|list
interface() ->
[{<<"login">>, [{params, [{<<"username">>, binary},
{<<"password">>, binary}]}]},
{<<"logout">>, [{params, []}]}].
% Misultin websocket loop to handle browser json requests
ws_loop(Ws) ->
receive
{browser, Data} ->
case rjsonrpc2:decode(list_to_binary(Data), interface()) of
{<<"login">>, Params, Id} ->
UserId = misultin_utility:get_key_value(<<"username">>, Params),
Password = misultin_utility:get_key_value(<<"password">>, Params),
case UserId =:= <<"foo">> andalso Password =:= <<"bar">> of
true ->
Response = rjsonrpc2:encode(true, Id),
Ws:send(Response);
false ->
Response = rjsonrpc2:encode(false, Id),
Ws:send(Response)
end,
ws_loop(Ws);
{<<"logout">>, [], undefined} ->
% logout user
ws_loop(Ws);
{error, JSONRPC_ERROR} ->
Ws:send(jiffy:encode(JSONRPC_ERROR)),
ws_loop(Ws);
_ ->
ws_loop(Ws)
end;
closed ->
closed;
_ ->
ws_loop(Ws)
end.