【问题标题】:Problems with Perl XML-RPC in combination with Perl reflection?Perl XML-RPC 与 Perl 反射相结合的问题?
【发布时间】:2011-05-22 07:12:27
【问题描述】:

我正在使用Frontier::Daemon 为 Robot Framework 测试自动化框架构建测试库服务器。我让测试库服务器在本地执行代码,但是当它通过 XML-RPC 运行/执行时,这就是我遇到问题的时候。部分问题也可能是因为我使用 Perl 反射来执行测试命令。

也许RPC::XML 可能更合适,但在我开发服务器时,Frontier::Daemon 似乎更容易开始。

Perl 反射代码是从本网站上发布的线程以及 Wikipedia 的代码反射页面(Perl 部分)中借用的。

代码托管在Google Code,您可以browse the code 或查看它以供审核。问题是described in more detail at the project site

我希望 Perl 开发者社区能给我一些关于问题根源和解决方法的指示。

谢谢, 戴夫

【问题讨论】:

  • 您能做些什么来展示您的问题的独立示例吗?我不知道您所说的“Perl 反射”是什么意思。
  • 或者至少提供复制问题的说明?我让您的示例服务器运行,但在感到无聊之前无法推断出示例客户端的外观。
  • 除非真的要求,否则我宁愿不花时间编写 XML-RPC 客户端来演示服务器应该做什么,因为在这一点上,服务器无论如何都不能正常工作。对于任何使用协议(HTTP、XML-RPC、SOAP、TCP/IP 等)的人,我认为他们应该知道如何在不需要最终用户客户端的情况下使用协议消息传递。例如,对于 XML-RPC,您可以使用任何普通 REST 客户端(有各种此类浏览器扩展)测试服务器消息传递。抱歉,由于每个帖子的字符数限制,我的回复分开了。
  • 要发出的 XML-RPC 请求示例,以及您当前返回的内容和应该返回的内容在 wiki code.google.com/p/plrobotremoteserver/wiki/… 上进行了描述,还有要比较的本地执行输出(在非-XML 形式)你应该得到什么。 exampleremoteserver.pl 是客户端(用于通过终端输出进行本地执行)以及服务器的示例。对于 XML-RPC 客户端到服务器,您可以使用 REST 客户端发出 XML-RPC 请求,或者构建您自己的客户端。服务器将返回一个 XML-RPC 响应(通过 HTTP)。
  • exampleremoteserver.pl 也会在您发出 XML-RPC 请求时重现该问题。对于 Perl 反射,robotremoteserver.pm 中的代码包含它,并显示了它如何与服务器代码的其余部分一起使用。这些代码的片段可以在这里找到:stackoverflow.com/questions/1021713/…en.wikipedia.org/wiki/Reflection_(computer_programming)#Perl

标签: perl reflection xml-rpc


【解决方案1】:

您缺少一些东西。首先,Frontier::Daemon 调用您提供的“方法”作为简单的子例程调用,但是您提供的两个方法期望作为远程服务器对象的方法调用。更改您的代码以执行此操作:

my $svr = Frontier::Daemon->new(
    methods => {
        get_keyword_names => sub { $self->get_keyword_names(@_) },
        run_keyword => sub { $self->run_keyword(@_) },
    },
...

按照他们的期望调用您的方法。

其次,您的 get_keyword_names 尝试返回一个数组,但您使用的接口似乎只允许一个返回值,并且在标量上下文中调用方法,导致 get_keyword_names 返回数组中元素的计数。我认为您希望返回对数组的引用:

return \@methods;

【讨论】:

  • 谢谢,解决了大部分问题。我有一种感觉,我没有正确启动 XML-RPC 服务器。但是还有一个问题,run_keyword 没有正确处理参数。当我直接在 Perl 中运行该方法时,它会正确处理参数,但从 Frontier 运行时则不会。
  • 直接执行$remote_svr->run_keyword("strings_should_be_equal","hello","world");调试输出显示:method = strings_should_be_equal RPC args: hello world Comparing 'hello' to 'world' Return => status => FAIL traceback => Given strings are not equal at ExampleLibrary.pm line 30. error => Given strings are not equal at ExampleLibrary.pm line 30. output => Given strings are not equal at ExampleLibrary.pm line 30.
  • 但是在 Frontier 上执行的同一个调用有这个调试输出:method = strings_should_be_equal RPC args: ARRAY(0x1d494bc) Comparing 'ARRAY(0x1d494bc)' to '' 这导致 strings_should_not_be_equal 反射方法没有做它打算做的事情。关于在robotremoteserver.pm 中为run_keyword 引用的数组/参数列表可能需要修复什么?
  • @ysth:我已经提交了代码。抱歉,最近比较忙,耽误了一点时间。
  • 我还更新了 wiki code.google.com/p/plrobotremoteserver/wiki/… 以突出显示剩余的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2014-08-10
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多