我正在尝试通过XML-RPC导出Ruby框架。但是,当尝试从未直接添加为XML-RPC服务器的处理程序的类调用方法时,我遇到了一些问题。请参阅下面的示例:
我有一个测试Ruby XML-RPC服务器,如下所示:
require "xmlrpc/server"
class ExampleBar
def bar()
return "hello world!"
end
end
class ExampleFoo
def foo()
return ExampleBar.new
end
def test()
return "test!"
end
end
s = XMLRPC::Server.new( 9090 )
s.add_introspection
s.add_handler( "example", ExampleFoo.new )
s.serve
我有一个测试Python XML-RPC客户端,如下所示:
import xmlrpclib
s = xmlrpclib.Server( "http://127.0.0.1:9090/" )
print s.example.foo().bar()
我希望python客户端打印“hello world!”因为它相当于以下ruby代码:
example = ExampleFoo.new
puts example.foo().bar()
但是它会生成错误:“xmlrpclib.ProtocolError:< ProtocolError for 127.0.0.1:9090/:500 Internal Server Error>”。
print s.example.test()工作正常。
我不希望新的ExampleBar对象通过网络,但我希望它是'缓存'服务器端,随后对bar()的调用将被尊重。
XML-RPC可以支持这种用法还是太基本了?
所以我想我的问题确实是;我怎样才能使这个工作,如果没有XML-RPC的用途?
答案 0 :(得分:5)
您的客户端(在您的Python代码中)是ServerProxy对象。它只接受boolean,整数,浮点数,数组,结构,日期或二进制数据类型的返回值。
但是,如果没有进行连线,则无法返回另一个ServerProxy,这是访问另一个类所需的。您可以在Ruby端实现对象缓存,但它将涉及跟踪活动会话并决定何时删除对象,如何处理丢失的对象等。
相反,我建议在ruby端暴露一个薄包装器,它执行原子操作,如:
def foobar()
return ExampleFoo.new().foo().bar()
end
答案 1 :(得分:1)
XML-RPC无法传递对象。参数类型集是有限的(正如jakber所说)。
答案 2 :(得分:1)
在支持的数据结构中返回nil也会导致内部服务器错误消息。 stdlib ruby xmlrpc服务器似乎不支持允许nils的xmlrpc扩展,即使python方面也是如此。 xmlrpc4r支持nils,但我还没有尝试过。