是否可以覆盖Mojo :: Message :: Response中的响应数据?

时间:2012-02-08 23:59:17

标签: perl mojolicious

在一个Mojolicious应用程序中,我的控制器代码中有一条路线,如下所示:

/account/:id/users

当我到达时,路径的/ account /:id部分包含以下数据 用户的一部分链:

$VAR1 = { 
    'signup_ip' => '172.17.5.146', 
    'z_id' => '382C58D8-529E-11E1-BDFB-A44585CCC763', 
    'signup_date' => '2012-03-12T12:11:10Z', 
    'name' => 'Some Cool Account Name', 
    'users' => [ 
        { 
            'user_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763' 
        } 
    ], 
    'account_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763',
}; 

在链的用户部分,我正在使用上面的哈希 $自> TX->水库>内容 - > get_body_chunk(0)

sub users { 
    my $self = shift; 
    my $user_list = from_json( $self->tx->res->content->get_body_chunk(0) );    
    $self->respond_to( json => $user_list->{users} );
} 

我遇到的问题是我只想覆盖响应 用户arrayref。 sub users(){}中的上述代码不会这样做。那是, 当我将结果转储到测试中时,我仍然得到整个哈希值。 $ user_list是我在users()中寻找的arrayref,但是我无法覆盖它。

任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:1)

Hrm我想我把我以前的答案放在了错误的地方。所以这就是:

在申请中我添加了以下路线:

my $base = $r->bridge('/account/:id')->to('account#read');
$base->route('/')->via('get')->to('account#index');
$base->route('/users')->via('get')->to('account#users');

在Acount.pm

sub read {
    my $self = shift;
    # do stuff

    $self->stash->{account} = $data;   # set the stash

    return 1;     #return 1.  Don't render.
}

sub index {
    my $self = shift;
    my $data = $self->stash('account');  #get the stash 

     $self->render_json( $data );
}

sub users {
    my $self = shift;
    # do stuff

    my $data = $self->stash('account');
    $self->render_json( $data );
}

这样做会将/ account /:id的结果设置为read子中的存储。 将路线设置为$ base-> route('/') - > via('get') - > to('account #index'); 导致从/ index /:id调用从索引子。

路线$ base-> route('/ users') - > via('get') - > to('account#users')原因 调用/ account /:id / users从users sub。

答案 1 :(得分:0)

我认为您必须为respond_to方法提供不同的参数。我希望这可行:

$self->respond_to(json => { json => $user_list->{users} });

或者只是致电render_json

$self->render_json($user_list->{users});

编辑:我制作了适合我的简单测试脚本(使用上面的后一个选项):

use Mojolicious::Lite;

get '/account/users' => sub {
    my $self = shift;
    my $user_list = {
        'signup_ip'   => '172.17.5.146',
        'z_id'        => '382C58D8-529E-11E1-BDFB-A44585CCC763',
        'signup_date' => '2012-03-12T12:11:10Z',
        'name'        => 'Some Cool Account Name',
        'users' => [{'user_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763'}],
        'account_id' => '382C67EC-529E-11E1-BDFB-A44585CCC763',
    };
    $self->render_json($user_list->{users});
};

app->start;

http://localhost:3000/account/users的请求返回了此信息:

[{"user_id":"382C67EC-529E-11E1-BDFB-A44585CCC763"}]