LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-05

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

メソッドを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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0