2012-04-17 4 views
1

У меня есть ход XMLRPC сервера:доступ Python XMLRPC Service от клиента рубинового

#!/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() 

Мне нужно, чтобы быть в состоянии назвать его от клиента рубина. Из того, что я нашел. что это должно быть так:

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 

Что соответствующий код для вызова вызов из Руби в Python XML-RPC сервер ?

ответ

0

Я не знаком с xmlrpc в Ruby, но я думаю, вам нужно передать XMLRPC :: Client Object в XMLRPC :: Client :: Proxy. Попробуйте такие вещи:

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

Возможно, это работает именно так.

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 

Аналогично, для доступа к методам «корень» этого сервера (например, зарегистрированных через register_function в Python):

main = server.proxy 
main.testls 
Смежные вопросы