在 Perl 中使用多个包使用 JSON::RPC::Server 编写 API 服务器模块
Posted
技术标签:
【中文标题】在 Perl 中使用多个包使用 JSON::RPC::Server 编写 API 服务器模块【英文标题】:Using multiple packages in Perl for writing API server module using JSON::RPC::Server 【发布时间】:2014-01-26 08:04:24 【问题描述】:我已经编写了一个使用 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
的语法。有人可以告诉我我的错误吗?
【问题讨论】:
我对此一无所知,但您似乎在说“将 /jsonrpc/API 的请求发送到 add2Num 并将 /jsonrpc/API 的请求发送到 sub2Num”,这没有任何意义。跨度> @ikegami - 这是否意味着我可能需要为单独的模块提供单独的网址? 【参考方案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。但它只允许每个路径一个模块。您第二次使用sub2Num
调用dispatch
覆盖了之前设置的add2Num
。
没有任何尝试,我看到了一些解决方案:
使用数组引用语法dispatch(['add2Num', 'sub2Num')
并找出设置守护程序绑定到的路径(最有可能)
构建一个附加模块,该模块同时导入add2Num
和sub2Num
以将它们和dispatch('/jsonrpc/API' => 'combinedNum)
结合起来
为模块添加您需要的支持,并将其作为补丁提交给作者(可能性最小)
【讨论】:
谢谢。我在考虑你给出的第二个选项。我现在正在编写和测试它。几个小时后我会告诉你情况如何。谢谢。 我又看了一些代码。如果您使用数组引用版本,它只会对我相信的所有路径使用所有模块的方法。那应该行得通。此外,代码包含大量字符串 eval,我现在不明白为什么。以上是关于在 Perl 中使用多个包使用 JSON::RPC::Server 编写 API 服务器模块的主要内容,如果未能解决你的问题,请参考以下文章
JSON/RPC/Client.pm 丢失 - Fedora 17
golang jsonrpc 调用 java json rpc