2012-02-16 6 views
1

Ruby 1.9で組み込みのXMLRPCを使用しようとしています。残念ながら、XMLRPCはruby-docs.orgに文書化されていないので、私はGoogleが見つかった例に基づいてテストコードをビルドしようとしていますRubyでビルトインXMLRPCを正しく使うには?

# Server.rb 
require "xmlrpc/server" 
server = XMLRPC::Server.new(1234) 
server.add_handler("test") { |msg| return "responce for #{msg}" } 
server.serve() 

# Client.rb 

require "xmlrpc/client" 
server = XMLRPC::Client.new("localhost", "/", 1234) 
server.call("test", 42) == "responce for 42" 

残念ながら、これはWindowsとOSXの両方で機能していません。 Server.rbは不明瞭なエラーで失敗します:

C:/Ruby193/lib/ruby/1.9.1/xmlrpc/client.rb:414:in `call': Uncaught exception unexpected return in method test (XMLRPC::FaultException) 
     from client.rb:6:in `<main>' 

多分私のエラーは何ですか?

+0

:あなたはそれをしたい場合は、のようなものと異なるLIBやパッチclient.rbを使用する必要があります。 URLは最新ではないかもしれないが、一般的な考え方はそこにある。コードを取得した場所を共有する必要があります。 –

答えて

7

その別の方法ブロックで:

#server.rb: 
require "xmlrpc/server" 
server = XMLRPC::Server.new(1234) 
server.add_handler('my_test.test') { |msg|"responce for #{msg}" } 

#client.rb 
require "xmlrpc/client" 
client = XMLRPC::Client.new("localhost", "/", 1234) 
s = client.call('my_test.test','asd') 
+0

ありがとう、それは私のせいでした:RubyがブロックO_Oの中の 'return'ステートメントに置く原則を忘れてしまった。 – grigoryvp

2

ほとんど正しいです。ここにはtutorialがあります。あなたの例では、あなたのRPCコールを提供するために使用されますadd_handlerにオブジェクトを渡す必要があり、少し修正が必要です。

# server.rb 
require "xmlrpc/server" 

class MyClass 
    def dosomething(a) 
    "response for #{a}" 
    end 
end 

server = XMLRPC::Server.new(1234) 
server.add_handler("test", MyClass.new) 
server.serve 

# client.rb 
require "xmlrpc/client" 
server = XMLRPC::Client.new("localhost", "/", 1234) 
puts server.call("test.dosomething", 42) == "response for 42" 
+0

他のチュートリアルで書かれているように、ロックを介してハンドラを追加する方法はありませんか? – grigoryvp

1

私はこれが助けることができると思う: http://www.ntecs.de/ruby/xmlrpc4r/howto.html

#server.rb 
require "xmlrpc/server" 
server = XMLRPC::Server.new(1234) 

class MyHandler 
    def test(msg) 
     "message #{msg}" 
    end 
end 
server.add_handler(XMLRPC::iPIMethods("my_test"), MyHandler.new) 
server.serve 

#client.rb 
require "xmlrpc/client" 
server = XMLRPC::Client.new("localhost", "/", 1234) 
s = server.call('my_test.test','hello!') 
+0

他のチュートリアルで書かれているように、ロックでハンドラを追加する方法はありませんか? – grigoryvp

2

ご注意:デフォルトXMLRPC/client.rb独自の実装を。クライアント証明書ベースのhttps接続をサポートしていません。あなたはファイル/ libに/ XMLRPC/README.rdoc下ruby19-stdlib.chmを持っている場合は、いくつかの例がある

# HG changeset patch 
# User Anonymous Coward <[email protected]> 
# Date 1338149770 -10800 
# Node ID f0557306c8e4f113507fb3bab8567391949fa302 
# Parent 3eae8e8f9e065ff6cdf1c95092ad5cca635c9eac 
patch client.rb to support https with client certificate. 

diff -r 3eae8e8f9e06 -r f0557306c8e4 client.rb 
--- a/client.rb Sun May 27 22:20:18 2012 +0300 
+++ b/client.rb Sun May 27 23:16:10 2012 +0300 
@@ -292,8 +292,8 @@ 

    # Constructors ------------------------------------------------------------------- 

- def initialize(host=nil, path=nil, port=nil, proxy_host=nil, proxy_port=nil, 
-     user=nil, password=nil, use_ssl=nil, timeout=nil) 
+ def initialize(host=nil, path=nil, port=nil, proxy_host=nil, proxy_port=nil, 
+  user=nil, password=nil, use_ssl=nil, timeout=nil, cacert=nil, cert=nil, key=nil) 

     @http_header_extra = nil 
     @http_last_response = nil 
@@ -311,6 +311,10 @@ 
     if use_ssl 
     require "net/https" 
     @port = port || 443 
+  @cacert = cacert 
+  @cert = cert 
+  @key = key 
+ 
     else 
     @port = port || 80 
     end 
@@ -325,8 +329,19 @@ 

     # HTTP object for synchronous calls 
     Net::HTTP.version_1_2 
-  @http = Net::HTTP.new(@host, @port, @proxy_host, @proxy_port) 
-  @http.use_ssl = @use_ssl if @use_ssl 
+  @http = Net::HTTP.new(@host, @port, @proxy_host, @proxy_port) 
+  if @use_ssl 
+  @http.use_ssl = @use_ssl 
+  if nil != @cacert 
+   @http.ca_file = @cacert 
+   @http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
+   @http.verify_depth = 5 
+  else 
+   @http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
+  end 
+  @http.cert = @cert 
+  @http.key = @key 
+  end 
     @http.read_timeout = @timeout 
     @http.open_timeout = @timeout 

@@ -366,7 +381,7 @@ 
     hash.each { |k,v| h[k.to_s.downcase] = v } 

     self.new(h['host'], h['path'], h['port'], h['proxy_host'], h['proxy_port'],  h['user'], h['password'], 
関連する問題