JSON-RPCを試す

"Operating System Concepts"でRPCのセッションを読んでたのだけど、イマイチ実感つかめないのでいい機会だからJSON-RPCを触ってみようと思った次第。なお、JSON-PRCの仕様はこちら。
http://json-rpc.org/wiki/specification


Zigorouさんのエントリー見つけたので、JSON::Shellで試してみる。

JSON::Shell

インストールはcpanmで。

sudo cpanm -Sv Term::ReadLine::Gnu
sudo cpanm -Sv JSON::Shell


あとはshellから叩けば。

kotaro@mac:~> jsonshell
Exiting subroutine via next at /opt/local/lib/perl5/site_perl/5.8.9/Shell/Base.pm line 200.
JSON::Shell 1.0

$ endpoint http://www.raboof.com/Projects/Jayrock/Demo.ashx
Endpoint set.
www.raboof.com/Projects/Jayrock/Demo.ashx$ post now ""
'jsonToObj' will be obsoleted. Please use 'decode' instead. at /opt/local/lib/perl5/site_perl/5.8.9/JSON/Shell.pm line 143
REQUEST: $VAR1 = {
          'params' => [],
          'id' => 298438,
          'method' => 'now'
        };

'jsonToObj' will be obsoleted. Please use 'decode' instead. at /opt/local/lib/perl5/site_perl/5.8.9/JSON/Shell.pm line 160
RESPONSE: $VAR1 = {
          'id' => 298438,
          'result' => '2011-06-25T20:08:14.0993456-07:00'
        };

なーんかobsoletedとか出る。

RPC::JSON

RPC::JSON - JSON-RPC Client Library だそうで。

{ 
"serviceType": "JSON-RPC", 
"serviceURL": "http://www.raboof.com/Projects/Jayrock/Demo.ashx",
    "objectName": [],
    "SMDVersion":1,
    "methods":[
        {   
            "name": "now",
            "parameters":[]
        },
        {   
            "name": "sum",
            "parameters": [
                {"name": "x"}, {"name": "y"}
            ]
        }
    ]
}

jmdファイルをnewの時に指定する必要があるらしく、こんな感じで定義してみた。


実際に使ってみる。

perl -MData::Dump=dump -MRPC::JSON -le 'print dump $jsonrpc=RPC::JSON->new("file:///Users/ito.kotaro/json.smd")->methods;'

{ now => [], sum => [{ name => "x" }, { name => "y" }] }
perl -MData::Dump=dump -MRPC::JSON -le 'print dump $jsonrpc=RPC::JSON->new("file:///Users/ito.kotaro/json.smd")->now'
garbage after JSON object, at character offset 4 (before "-06-25T20:46:18.2218...") at /opt/local/lib/perl5/site_perl/5.8.9/JSON.pm line 168.

実際に取得してきている様子。エラー出るけど。

まとめ

なんだか中途半端感たっぷりだけど、JSON使ってRPCできるんだなーということだけ確認できたからOKとしよう。