从ruby on rails应用程序提供XML-RPC服务?

时间:2011-04-04 16:55:43

标签: ruby-on-rails xml-rpc

我正在考虑从rails应用程序上的现有ruby提供XML-RPC服务的可行性。我希望我可以通过实施一些额外的控制器方法并通过我现有的apache / passenger设置来提供它。这种方法是否合理,或者XML-RPC是否需要单独的Web服务器?

1 个答案:

答案 0 :(得分:2)

假设Rails 3:

从rails应用程序提供XMLRPC服务有两种或三种基本方法。

第一种是使用支持这种情况的Rack中间件(gem'port-rpc' - https://github.com/datagraph/rack-rpc),理论上应该可以在与现有的基于Rack的应用程序相同的服务器上运行,但是我当我想使用ActiveRecord模型时发现这种体验令人沮丧。通过将它添加到application.rb配置中的中间件列表,我能够让rack-rpc响应xml-rpc客户端请求,但我没有花时间找出让ActiveRecord连接起来的方法。

另一种方法是使用rails 1.x天中不推荐使用的actionwebservice功能的分支。在撰写本文时,我发现一个在Rails 3.0.5上看起来相对功能的fork:

gem 'rubyjedi-soap4r'
gem 'actionwebservice', :git => 'https://github.com/mkoentopf/actionwebservice.git'

不推荐使用actionwebservice功能来鼓励人们使用RESTful API来公开Web服务,但是如果您有希望能够发送xmlrpc请求的客户端(就像那些受欢迎的12个博客客户端那样),那么很明显没有那个选择。

我按照文档实现了一个ApiController,它有这样的行:

class ApiController < ApplicationController
  acts_as_web_service
  web_service_dispatching_mode :layered

  skip_before_filter :your_default_auth_method

  web_service :metaWeblog, MetaweblogService.new(self)
  web_service :blogger, BloggerService.new(self)
...

  def xmlrpc
    api
  end

  def api
    dispatch_web_service_request
  end

end

然后,您需要实现Api和Service类。 (如果您不需要命名空间样式的“metaWeblog.methodname”xml-rpc样式方法调用,则可以简化此操作;只需删除:layered分派方法,并将其替换为actionwebservice docs中解释的替代方法之一。

您的MyApi类继承自ActionWebService :: API :: Base,并使用api_method等方法指定支持的xml-rpc方法签名。您的MyService继承自ActionWebService :: Base,并且只是实现普通ruby代码之类的方法。您可能需要/想要传递对您实现的ApiController类的引用,您可以在服务的initialize方法中执行此操作。