在Perl中使用多个包,使用JSON :: RPC :: Server编写API服务器模块

时间:2014-01-26 08:04:24

标签: json perl perl-module perl-data-structures json-rpc

我编写了一个服务器模块,用于使用JSON :: RPC :: Server,并尝试导入多个包(使用use)。这是Server.pl文件的代码:

#!/usr/bin/perl

use JSON::RPC::Server::Daemon;
use add2Num;

JSON::RPC::Server::Daemon->new(LocalPort => 42337)
                          ->dispatch({'/jsonrpc/API' => 'add2Num'})
                          ->handle();

这很好用。但是,我想导入(use)另一个文件,比方说,减法。我尝试过以下两种方式重写服务器模块:

#!/usr/bin/perl

use JSON::RPC::Server::Daemon;
use add2Num;
use sub2Num;

JSON::RPC::Server::Daemon->new(LocalPort => 42337)
                          ->dispatch({'/jsonrpc/API' => 'add2Num'})
                          ->dispatch({'/jsonrpc/API' => 'sub2Num'})
                          ->handle();

#!/usr/bin/perl

use JSON::RPC::Server::Daemon;
use add2Num;
use sub2Num;

JSON::RPC::Server::Daemon->new(LocalPort => 42337)
                          ->dispatch({'/jsonrpc/API' => 'add2Num', 'sub2Num'})
                          ->handle();

当我尝试访问用sub2Num编写的减法函数时,这两个都给我一个“过程错误”。我按this link了解dispatch的语法。有人可以告诉我我的错误吗?

1 个答案:

答案 0 :(得分:1)

在查看code for the module(好吧,差不多)之后,我认为你的假设是正确的。您不能有两个模块用于相同的路径。

elsif (ref $arg[0] eq 'HASH') { # Lazy loading
    for my $path (keys %{$arg[0]}) {
        my $pkg = $arg[0]->{$path};
        $self->{dispatch_path}->{$path} = $pkg;
    }
}

它将在dispatch中接受多个键/值对的路径和模块,因此不需要两次调用dispatch。但它只允许每个路径一个模块。您使用dispatchsub2Num的第二次调用覆盖了先前设置的add2Num

如果不尝试任何此类方法,我会看到一些解决方案:

  • 使用数组引用语法dispatch(['add2Num', 'sub2Num')并找出设置守护程序绑定路径的位置(最有可能)
  • 构建一个额外的模块,用于导入add2Numsub2Num以合并它们dispatch({'/jsonrpc/API' => 'combinedNum})
  • 将您需要的支持添加到模块并将其作为补丁提交给作者(最不可能)