为啥在使用 MojoX::JSON::RPC::Service 时,我的 Mojo 测试与 FF REST 客户端的工作方式不同?

Posted

技术标签:

【中文标题】为啥在使用 MojoX::JSON::RPC::Service 时,我的 Mojo 测试与 FF REST 客户端的工作方式不同?【英文标题】:Why is my Mojo test working differently than the FF rest client when using MojoX::JSON::RPC::Service?为什么在使用 MojoX::JSON::RPC::Service 时,我的 Mojo 测试与 FF REST 客户端的工作方式不同? 【发布时间】:2012-06-15 14:15:57 【问题描述】:

我的 Mojolicious 应用程序模块中有以下代码。当我使用 Test::Mojo $t->post_ok('hosts', encode_json( $json_string ) )->status_is(200),应用程序工作正常。当我使用 Firefox 休息客户端时,我从来没有通过 add_condition 路由修饰符“访问”。我转储了 $can 的结果(在 add_condition 块中),它是“1”。所以,在我看来,这应该继续到控制器上(就像我运行测试时所做的那样)。使用 FF 休息客户端时,此 返回 404,因为访问条件返回 1 后没有任何反应。

知道为什么应用程序在这两种情况下会以不同的方式运行吗?

$self->plugin(
    'json_rpc_dispatcher',
    services => 
        '/auth'      => Package::Controller::Auth->new,
        '/user'      => Package::Controller::User->new,
        '/hosts'     => Package::Controller::Hosts->new,
       
);  

$self->app->routes->add_condition(
    access => sub 
        my ($rt, $cntrlr, $stuff) = @_; 
        my $sess = $cntrlr->stash('mojo.session');

        my $path = $cntrlr->req->url->path->parts;

        my $can = $self->can_access( 
            route => $path->[0],
            args  => $sess,
        ); 

        $can && return 1;


        $cntrlr->render_json(
            error => 'Not Authorized',
            ok    => 0,
        ); 
       
); 

$self->hook( before_dispatch => sub 

    my $this = shift;

    my $params = $this->tx->req->json;

    if( !$this->session('auth') ) 
    my $login = $self->login(
            user     => $params->paramsuser,
            password => $params->paramspassword,
    );

        return  error => 'Invalid Username or password'  if $login->error; 
        my $access = $self->has_access( 
            $params->paramsuser, $params->paramspassword
        );

        return  error => 'Invalid credentials'  unless keys % $access ;

        $this->session( auth =>  dn => $params->paramsuser, perms => $access  );

    

    else 
        $r->find('auth' )->over('access');
        $r->find('user' )->over('access');
        $r->find('hosts')->over('access');
    

 );  # hook

【问题讨论】:

【参考方案1】:

对不起。无论如何,这个问题与应用程序或 Mojolicious 无关(甚至与 perl 无关)。主机名解析不正确。

嗯,我不知道问题出在哪里。使用启动服务器 morbo 脚本/应用程序守护进程 -l my.host.name.domain.com 不工作。

当我使用 morbo script/app daemon -l 192.168.1.11(其中 192.168.1.11 是 my.host.name.domain.com 的 ip)。事情开始按预期进行。

现在这些都不起作用。 :(

【讨论】:

$t->post_ok('192.168.1.11:30000/hosts', encode_json( $json_string ) )->status_is(200);这也有效。日志显示我确实连接到在该端口上运行的服务。对我来说很奇怪的是,其余客户端始终返回 404,而与同一服务通信的测试代码始终如一地工作。 基本上我只是犯了一些愚蠢的错误。我实际上找不到我的钥匙,因为它们藏在我手里。

以上是关于为啥在使用 MojoX::JSON::RPC::Service 时,我的 Mojo 测试与 FF REST 客户端的工作方式不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有人应该在 git commit 之前使用 git add?或者为啥有人应该使用 git add 呢?

为啥在 TCP 中使用 bind()?为啥它只用在服务器端而不用在客户端?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥在 0-1 背包问题中我们使用 INT_MIN 以及为啥 0 不起作用

在 Java 7 ConcurrentHashMap 中,为啥在写的时候需要段锁?为啥我们不能再次使用 Unsafe 来保持非阻塞?

为啥在 hashCode 中使用素数?