【问题标题】:Is there a way to incorporate a Mojolicious::Controller with a MojoX::JSON::RPC::Service?有没有办法将 Mojolicious::Controller 与 MojoX::JSON::RPC::Service 结合起来?
【发布时间】:2012-05-11 05:10:47
【问题描述】:

我正在使用 zabbix 并编写一个与 zabbix api 交互的接口。由于 zabbix 公开了一个 jsonrpc 接口,我决定使用 MojoX::JSON::RPC::Service。我遇到的问题是,我现在面临着与使用 Mojolicious::Controllers 编写的其他服务进行交互,他们期望 Mojolicious::Controller 对象。使用 MojoX::JSON::RPC::Service 时没有可用的 Mojolicious::Controller 对象。

my $obj = $rpc_obj->register(
               'retrieve',
               sub {
                    # do stuff
               },
               { with_mojo_tx => 1 }
);

它注册了一个名为“retrieve”的路由。当路由被访问并且匿名 子程序运行时,子程序只能访问 Mojo::Transaction::HTTP 对象。

因此,我无法访问该应用程序来使用插件以及 Mojolicious 提供的存储和其他东西。有没有办法将 Mojolicious::Controller 与 MojoX::JSON::RPC::Service 结合起来?

我可以重写它以使用 Mojolicious::Controller,但如果可能的话,我会尽量避免这种情况。

【问题讨论】:

    标签: perl mojolicious


    【解决方案1】:

    你应该考虑使用MojoX::JSON::RPC::Dispatcher,因为它继承了Mojolicious::Controller的所有属性

    概要:

    # lib/your-application.pm
    
    use base 'Mojolicious';
    use MojoX::JSON::RPC::Service;
    
    sub startup {
        my $self = shift;
        my $svc = MojoX::JSON::RPC::Service->new;
    
        $svc->register(
            'sum',
            sub {
                my @params = @_;
                my $sum = 0;
                $sum += $_ for @params;
                return $sum;
            }
        );
    
        $self->plugin(
            'json_rpc_dispatcher',
            services => {
               '/jsonrpc' => $svc
            }
        );
    }
    

    [更新] 挂钩示例:

    package Application;
    use Mojo::Base 'Mojolicious';
    use Application::Firewall;
    
    # This method will run once at server start
    sub startup {
        my $app = shift;
    
        # Routes
        my $r = $app->routes;
    
        # Validation Middleware
        $app->hook(
            before_dispatch => sub {
                my $self = shift;
                my $data = $self->req->params->to_hash;
                my $vald = Application::Firewall->new($data);
    
                # mojolicious bug at the time of coding
                delete $data->{""} if defined $data->{""};
    
                $app->{input} = {};
    
                if ( keys %{$data} ) {
    
                    # validation the submitted data
                    unless ( $vald->validate( keys %{$data} ) ) {
                        $self->render(
                            text   => join( "", @{ $vald->errors } ),
                            status => 500
                        );
                        return 0;
                    }
    
                    # Helper (optional)
                    # create a helper to get access to the transformed data
                    # if your validation rules had/has filters
                    # Note! due to a bug in the params function we must do this
                    # (... i know, so what)
                    $app->{input} = {
                        map { $_ => $vald->{fields}->{$_}->{value} }
                          keys %{ $vald->{fields} }
                    };
    
                }
    
                return 1;
            }
        );
    
        # Normal route to controller * with auto-matic input validation *
        $r->route('/')->to(
            cb => sub {
                my $self = shift;
                $self->render(
                    text => 'Hello ' . ( $app->{input}->{foobar} || 'World' ),
                    status => 200
                );
            }
        );
    }
    
    1;
    

    【讨论】:

    • 是的,这就是我正在做的。我遇到的问题是,当执行“总和”路由时,无法访问控制器。基本上我想在执行路线之前做一些授权。所以,现在我正在尝试将一个钩子添加到 $self->app 作为 $self->app->hook( before_dispatch => sub { ... } );在应用程序中,所以我不需要访问“sum()”中的 Mojolicious::Controller。 search.cpan.org/~sri/Mojolicious-2.94/lib/Mojolicious.pm#hook
    • @jmcneirney - 当你使用 my $self = shift; 时应该只是 $self->hook... 或者如果你使用 my $app = shift;,那么它是 $app->hook,但我不知道为什么你用$self->app->hook..?
    猜你喜欢
    • 2011-08-24
    • 2015-04-05
    • 2013-12-28
    • 1970-01-01
    • 2021-07-28
    • 2013-09-15
    • 2017-12-14
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多