2014-01-26 1 views
1

Я написал серверный модуль для использования JSON :: RPC :: Server и пытаюсь импортировать несколько пакетов (используя use). Это код для файла Server.pl:Использование нескольких пакетов в Perl для написания модуля API-сервера с использованием JSON :: RPC :: Server

#!/usr/bin/perl 

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

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

И это работает отлично. Тем не менее, я хочу импортировать (use) еще один файл, например, для вычитания. Я попытался переписывание серверного модуля 2 способами, как так:

#!/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(); 

Оба они дают мне «Procedure Error» при попытке получить доступ к функции вычитания, которая записывается в sub2Num. Я следовал this link для синтаксиса dispatch. Может кто-нибудь, пожалуйста, сообщите мне мою ошибку?

+0

Я ничего не знаю об этом, но похоже, что вы говорите «запросы на отправку для/jsonrpc/API для add2Num и запросы для/jsonrpc/API для sub2Num», что не имеет смысла. – ikegami

+0

@ikegami - это означает, что мне могут понадобиться отдельные URL-адреса для отдельных модулей? – rahuL

ответ

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 с sub2Num переписывал ранее установленный add2Num.

Не пытаясь ничего этого, я вижу несколько решений:

  • использовать массив ссылок синтаксиса dispatch(['add2Num', 'sub2Num') и выяснить, где установить путь, что демон, связанный с (скорее всего)
  • сборки дополнительный модуль, который импортирует как add2Num и sub2Num объединить их и dispatch({'/jsonrpc/API' => 'combinedNum})
  • добавить поддержку, необходимую для модуля и представить его в виде пластыря автора (не менее вероятно)
+0

Спасибо. Я думал по очереди второго варианта, который вы дали. Я пишу и тестирую это сейчас. Я дам вам знать, как это происходит через несколько часов. Спасибо. – rahuL

+0

Я еще раз посмотрел на код. Если вы используете версию ref массива, она просто будет использовать все методы модулей для всех путей, которые, как я полагаю. Это должно сработать. Кроме того, код содержит очень много строковых оценок, и я не могу понять, почему прямо сейчас. – simbabque

Смежные вопросы