3

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: <ProtocolError for 127.0.0.1:9090/: 500 Internal Server Error>」というエラーが生成されます。

print s.example.test() は正常に動作します。

新しい ExampleBar オブジェクトが送信されるとは思いませんが、サーバー側で「キャッシュ」され、その後の bar() の呼び出しが尊重されると予想します。

XML-RPC はこの種の使用法をサポートできますか?それとも基本的すぎますか?

だから私の質問は本当にそうだと思います。XML-RPC を使用していない場合、どうすればこれを機能させることができますか?

4

3 に答える 3

5

クライアント (Python コード内の s) は ServerProxy オブジェクトです。ブール型、整数型、浮動小数点型、配列型、構造体型、日付型、またはバイナリ データ型の戻り値のみを受け入れます。

ただし、ワイヤリングを行わないと、別のクラスにアクセスするために必要な別の ServerProxy を返す方法がありません。Ruby 側にオブジェクト キャッシュを実装することもできますが、アクティブなセッションを追跡し、オブジェクトをいつ削除するか、欠落しているオブジェクトを処理する方法などを決定する必要があります。

代わりに、次のようなアトミック操作を行う薄いラッパーをルビー側に公開することをお勧めします。

def foobar()
  return ExampleFoo.new().foo().bar()
end
于 2008-11-05T02:03:03.033 に答える
1

XML-RPCはオブジェクトを渡すことができません。パラメータタイプのセットは制限されています(jakberが言うように)。

于 2008-11-05T08:07:33.467 に答える
1

サポートされているデータ構造内で nil を返すと、Internal Server Error メッセージも発生します。stdlib ruby​​ xmlrpc サーバーは、Python 側がサポートしているにもかかわらず、nil を許可する xmlrpc 拡張機能をサポートしていないようです。xmlrpc4r は nils をサポートしていますが、まだ試していません。

于 2009-08-10T21:38:59.830 に答える