【问题标题】:Access Ruby objects with Python via XML-RPC?通过 XML-RPC 使用 Python 访问 Ruby 对象?
【发布时间】:2008-11-05 01:33:50
【问题描述】:

我正在尝试通过 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,我怎样才能让它工作?

【问题讨论】:

    标签: python ruby xml-rpc interop


    【解决方案1】:

    您的客户端(在您的 Python 代码中)是一个 ServerProxy 对象。它只接受布尔、整数、浮点数、数组、结构、日期或二进制数据类型的返回值。

    但是,如果不进行接线,它就无法返回另一个 ServerProxy,而您需要它来访问另一个类。您可能可以在 Ruby 端实现对象缓存,但这将涉及跟踪活动会话并决定何时删除对象、如何处理丢失的对象等。

    相反,我建议在 ruby​​ 端公开一个瘦包装器,它可以执行以下原子操作:

    def foobar()
      return ExampleFoo.new().foo().bar()
    end
    

    【讨论】:

    • 感谢 Jakber,不过我希望避免使用包装器,因为我正在使用的实际代码很大而且非常面向对象,因此有很多子/超类。我希望红宝石内省能挽救这一天! :)
    【解决方案2】:

    XML-RPC 不能传递对象。参数类型的集合是有限的(正如 jakber 所说)。

    【讨论】:

      【解决方案3】:

      在支持的数据结构中返回 nil 也会导致内部服务器错误消息。 stdlib ruby​​ xmlrpc 服务器似乎不支持允许 nils 的 xmlrpc 扩展,即使 python 端支持。 xmlrpc4r 支持 nils 但我还没试过。

      【讨论】:

        猜你喜欢
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        相关资源
        最近更新 更多