我有一个运行的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服务器的调用的适当代码是什么?
答案 0 :(得分: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
同样,要访问服务器的“root”方法(比如在Python中通过register_function
注册的方法):
main = server.proxy
main.testls
答案 1 :(得分:0)
我不熟悉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"
也许它会这样运作。