Perl
Mojolicious
json-rpc

MojoX::JSON::RPC::Serviceで作ったJSONRPCサーバー側処理でparams以外を使いたい

More than 3 years have passed since last update.

ググってもそれらしき情報が全然出てこなかったので自分用メモ

メソッドをregisterするときのoptionに

{

with_self => 1,
}

を指定すれば、メソッド呼び出し時の第1引数にアプリ本体が渡ってくるので、そこから$app->req->envとかなんでも自由に取り出して使える。


困りごと

ただし、PODの最初にあるような基本的な使い方をすると、JSONRPCの処理を行うメソッドがregisterと同じ階層に散らかってしまいコードの見通しが良くない。

use MojoX::JSON::RPC::Service;

my $svc = MojoX::JSON::RPC::Service->new;

$svc->register(
'sum',
sub {
my ($app, @params) = @_;
my $sum = 0;
$sum += $_ for @params;
return $sum;
},
{
with_self => 1,
}
);

そして、PODの二つ目にあるように MojoX::JSON::RPC::Serviceを継承したモジュールを作って、register_rpc_method_namesでメソッドの登録を行うと、register時の引数として自動的に with_svc_obj => 1 が指定され、メソッド内の第1引数が Service オブジェクトになってしまうため、自由にいろいろアクセスできない。

package MyService;

use Mojo::Base 'MojoX::JSON::RPC::Service';

sub sum {
my ($self, @params) = @_;
my $sum = 0;
$sum += $_ for @params;
return $sum;
}

__PACKAGE__->register_rpc_method_names( 'sum' );


解決策

register_rpc_method_namesはやめて、new の時に自分でregisterしてやることにした。

package MyService;

use Mojo::Base 'MojoX::JSON::RPC::Service';

my @METHODS = qw/ sum /;

sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);

for(@methods){
$self->register(
$_ => \&{$_},
{
with_self => 1.
}
);
}

return $self;
}

sub sum {
my ($app, @params) = @_;
my $sum = 0;
$sum += $_ for @params;
return $sum;
}

## Then in Mojolicious application
$self->plugin(
'json_rpc_dispatcher',
services => {
'/jsonrpc' => MyService->new,
}
);


参考リンク

MojoX::JSON::RPC::Service

http://search.cpan.org/~henryykt/MojoX-JSON-RPC-0.04/lib/MojoX/JSON/RPC/Service.pm