Доступ к объектам Ruby с помощью Python через XML-RPC? - PullRequest
3 голосов
/ 05 ноября 2008

Я пытаюсь экспортировать инфраструктуру Ruby через XML-RPC. Однако у меня возникают некоторые проблемы при попытке вызвать метод из класса, не добавленного непосредственно в качестве обработчика на сервер 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 напечатает "Привет, мир!" так как он эквивалентен следующему рубиновому коду:

example = ExampleFoo.new
puts example.foo().bar()

Однако выдается ошибка: «xmlrpclib.ProtocolError: ».

print s.example.test () работает нормально.

Я не ожидаю, что новый объект ExampleBar пройдет по проводам, но я ожидаю, что он будет «кэширован» на стороне сервера, и последующий вызов bar () будет выполнен.

Может ли XML-RPC поддерживать такой вид использования или он слишком простой?

Так что я думаю, мой вопрос действительно таков; как я могу заставить это работать, если не с XML-RPC, а с?

Ответы [ 3 ]

5 голосов
/ 05 ноября 2008

Ваш клиент (в вашем коде Python) является объектом ServerProxy. Он принимает только возвращаемые значения типа boolean, целые числа, числа с плавающей запятой, массивы, структуры, даты или двоичные данные.

Однако, если вы не выполните подключение, у него не будет возможности вернуть другой ServerProxy, который вам понадобится для доступа к другому классу. Возможно, вы могли бы реализовать кэш объектов на стороне Ruby, но это потребовало бы отслеживания активного сеанса и принятия решения, когда удалять объекты, как обрабатывать отсутствующие объекты и т. Д.

Вместо этого я бы предложил выставить тонкую обертку на стороне рубина, которая выполняет атомарные операции, такие как:

def foobar()
  return ExampleFoo.new().foo().bar()
end
1 голос
/ 11 августа 2009

Возврат nil внутри поддерживаемой структуры данных также вызовет сообщение Внутренняя ошибка сервера. Сервер stdlib ruby ​​xmlrpc, по-видимому, не поддерживает расширения xmlrpc, которые допускают nils, даже если сторона Python поддерживает это. xmlrpc4r поддерживает nils, но я еще не пробовал.

1 голос
/ 05 ноября 2008

XML-RPC не может передавать объекты. Набор типов параметров ограничен (как говорит Джекбер).

...