当前位置:  开发笔记 > 编程语言 > 正文

通过XML-RPC使用Python访问Ruby对象?

如何解决《通过XML-RPC使用Python访问Ruby对象?》经验,为你挑选了1个好方法。

我试图通过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有什么关系?



1> jakber..:

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

但是,如果没有进行连接,则无法返回另一个ServerProxy,这是访问另一个类所需的.您可以在Ruby端实现对象缓存,但它将涉及跟踪活动会话并决定何时删除对象,如何处理丢失的对象等.

相反,我建议在ruby端暴露一个薄包装器,它执行原子操作,如:

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

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有