2012-02-16 41 views
1

我想在Ruby 1.9中使用内置的XMLRPC。不幸的是,XML-RPC未记录在ruby-docs.org,所以我试图建立一个基于由谷歌发现例子测试代码:如何在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目录/ XMLRPC/README.rdoc有ruby19-stdlib.chm有一些例子。网址可能不是最新的,但总体思路就在那里。你应该分享你从哪里得到你的代码。 – 2013-03-28 16:07:33

回答

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 2012-02-16 12:34:52

2

你明白了吧。这是您可以使用的tutorial。你的榜样需要稍加修改,你必须通过一个对象add_handler将用于提供给您的RPC调用:

# 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 2012-02-16 11:22:01

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 2012-02-16 11:22:19

2

请注意:默认XML-RPC/client.rb IMPL。不支持基于https连接的客户端证书。如果你想它,你必须使用不同的lib或补丁client.rb的东西,如:

# 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'],