【问题标题】:Access Python XML-RPC Service from Ruby Client从 Ruby 客户端访问 Python XML-RPC 服务
【发布时间】:2012-04-29 00:25:58
【问题描述】:

我有一个 XMLRPC 服务器正在运行:

#!/usr/bin/env python

from SimpleXMLRPCServer import SimpleXMLRPCServer
import subprocess
import os


def testls():
    retcode=subprocess.call(["ls", "/etc"])
    return retcode



server = SimpleXMLRPCServer(('192.168.15.20',8888),logRequests=True)

server.register_function(testls)

server.register_introspection_functions()
try:
    server.serve_forever()
finally:
    server.server_close()

我需要能够从 ruby​​ 客户端调用它。根据我的发现。好像应该是这样的:

require xmlrpc/client
server = XMLRPC::Client.new2("http://192.168.15.20:8888/")

但它返回以下内容,这表明它无法访问该服务。

=> #<XMLRPC::Client:0x2ab0f5caacf8 @parser=nil, @timeout=30, @path="/", @password=nil, @http_header_extra=nil, @use_ssl=false, @host="192.168.15.20", @user=nil, @proxy_port=nil, @auth=nil, @cookie=nil, @create=nil, @port=8888, @http=#<Net::HTTP 192.168.15.20:8888 open=false>, @proxy_host=nil, @http_last_response=nil>

我在以下方面取得了更好的成功,但我无法调用该方法:

irb(main):069:0> server = XMLRPC::Client::Proxy.new("http://192.168.15.20","8888")
=> #<XMLRPC::Client::Proxy:0x2ab0f5c4ef48 @args=[], @server="http://192.168.15.20", @meth=:call, @prefix="8888.">
irb(main):070:0> s = server.call('system.listMethods')
NoMethodError: undefined method `call' for "http://192.168.15.20":String
        from /usr/lib/ruby/1.8/xmlrpc/client.rb:608:in `send'
        from /usr/lib/ruby/1.8/xmlrpc/client.rb:608:in `method_missing'
        from (irb):70
        from :0

从 Ruby 调用 Python XML-RPC 服务器的适当代码是什么?

【问题讨论】:

    标签: python ruby xml-rpc


    【解决方案1】:

    我知道这是一个相当古老的问题,但由于它没有选定的答案,我想我会分享我的见解:

    在 ruby​​ 中,XMLRPC::Client 类代表服务器的低级接口:

    server = XMLRPC::Client.new( "192.168.15.20", 8888 )
    server.call 'system.listMethods'
    

    XMLRPC::Client::Proxy 类是服务器(部分)的更高级别接口,允许更自然的服务器方法调用:

    system = server.proxy('system')
    system.listMethods
    

    同样,访问服务器的“根”方法(如在 Python 中通过register_function 注册的方法):

    main = server.proxy
    main.testls
    

    【讨论】:

      【解决方案2】:

      我不熟悉 Ruby 中的 xmlrpc,但我认为您必须将 XMLRPC::Client 对象传递给 XMLRPC::Client::Proxy。 试试这样的东西:

      client = XMLRPC::Client.new( "http://192.168.15.20", 8888 )
      server = XMLRPC::Client::Proxy.new( client, 8888 )
      server.call "system.listMethods"
      

      也许它是这样工作的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-11
        • 2023-03-10
        • 2016-01-05
        • 1970-01-01
        • 2012-03-10
        • 2011-01-24
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多