通过XML-RPC访问Ruby对象的Python方法?

3

我想通过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: "。 print s.example.test() 可以正常工作。
我不希望新的ExampleBar对象通过网络传输,但我希望它在服务器端被“缓存”,并且后续对bar()的调用也能够被接受。
XML-RPC是否支持这种用法,还是太基础了?
因此,我的问题实际上是:如果不能使用XML-RPC,那么我该如何让它正常工作?
3个回答

5
你的客户端(在你的Python代码中)是一个ServerProxy对象。它只接受布尔值、整数、浮点数、数组、结构体、日期或二进制数据类型的返回值。
然而,如果没有进行连接,它就无法返回另一个ServerProxy对象,你需要访问另一个类。你可能可以在Ruby端实现一个对象缓存,但这将涉及跟踪活动会话,决定何时删除对象,如何处理丢失的对象等。
相反,我建议在Ruby端暴露一个轻量级包装器,执行原子操作,例如:
def foobar()
  return ExampleFoo.new().foo().bar()
end

谢谢Jakber,我希望避免使用包装器,因为我正在处理的真实代码非常大且非常面向对象,所以有很多子/超类。我希望Ruby内省能拯救这一天! :) - QAZ

1

XML-RPC无法传递对象。参数类型集合受到限制(正如jakber所说)。


1

在支持的数据结构内返回nil也会导致内部服务器错误消息。标准库Ruby XMLRPC服务器似乎不支持允许nil的xmlrpc扩展,尽管Python端支持。xmlrpc4r支持nils,但我还没有尝试过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接