JSON::RPC::Specをバージョンアップしました

@nqounetです。

先日公開したばかりですが、JSON::RPC::Specをアップデートしました。

Router::Simpleを使ってます

もともと、JSON::RPCRouter::Simpleを使っていた事もあって、JSON::RPC::SpecでもRouter::Simpleを使って書いていました。

ところが、せっかくマッチングできるのに、その結果を利用できなかったので、マッチング後のハッシュをリファレンスで渡すようにしました。これができないとRouter::Simpleを使っている意味がありません。

マッチングを使ったmethodはこのように書くことができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
use JSON::RPC::Spec;
my $rpc = JSON::RPC::Spec->new;
$rpc->register(
    'echo.{action}' => sub {
        my ($params, $matched) = @_;
        return $matched->{action};
    }
);
say $rpc->parse(
    '{"jsonrpc": "2.0", "method": "echo.hoge", "params": [1, 2, 3, 4, 5], "id": 1}'
);    # -> {"id":1,"result":"hoge","jsonrpc":"2.0"}

これまでMojoliciousばかり使ってきたので、Router::Simpleがどんな事をするのかも、よくわかっていませんでした。

というか、Mojoliciousのようにcontrollerとかactionを指定すると、Moduleに紐付ける機能があると思っていたのですが、そういうものではなく、条件とデータを設定しておくと、マッチした時にそのデータを取り出してくれる、とてもシンプルな機能のものでした。

使い方がわかると便利さがわかりますね。

JSON::RPC::Specにも、Router::Simpleのエッセンスが使えるようになりました。

如何でしょうか?

JSON::RPC::Dispatchは高性能

JSON::RPC::Dispatchは、Router::Simpleの機能をうまく使っていると思いました。

予めデータとしてhandleractionを指定しておくと、その2つから実行するべき関数を上手に呼び出してくれます。

handlerにインスタンスを渡しておくと、そのインスタンスからactionのmethodを呼び出してくれます。

そして、handleractionは単なるハッシュのキーなので、マッチングに使っておくと、JSONで指定した関数を呼び出すこともできます。

1
2
3
4
my $router = Router::Simple->new;
$router->connect( 'echo.{action}' => {
    handler => MyApp::Echo->new
);

上記の場合、package MyApp::Echoにある、{action}にマッチした関数が呼び出されます。

自前でこういうのを実装するのは結構面倒なので、柔軟に処理を振り分けたい場合はとても便利ですね。

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。