在 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') 并找出设置守护程序绑定到的路径(最有可能) 构建一个附加模块,该模块同时导入add2Numsub2Num 以将它们和dispatch('/jsonrpc/API' => 'combinedNum) 结合起来 为模块添加您需要的支持,并将其作为补丁提交给作者(可能性最小)

【讨论】:

谢谢。我在考虑你给出的第二个选项。我现在正在编写和测试它。几个小时后我会告诉你情况如何。谢谢。 我又看了一些代码。如果您使用数组引用版本,它只会对我相信的所有路径使用所有模块的方法。那应该行得通。此外,代码包含大量字符串 eval,我现在不明白为什么。

以上是关于在 Perl 中使用多个包使用 JSON::RPC::Server 编写 API 服务器模块的主要内容,如果未能解决你的问题,请参考以下文章

JSON/RPC/Client.pm 丢失 - Fedora 17

golang jsonrpc 调用 java json rpc

如何使用多个版本的 Perl 在 Perl 模块中安装脚本?

如何使用R语言circlize包绘制漂亮圈图

在 perl 中使用 inotify 监视多个文件

如何在 Django 中发出 json rpc 请求?