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

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

假设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天中不推荐使用的actionwebservicefunction的分支。 在撰写本文时,我发现一个在Rails 3.0.5上看起来相对function的fork:

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

不推荐使用actionwebservicefunction来鼓励人们使用RESTful API来公开Web服务,但是如果你有希望能够发送xmlrpc请求的客户端(比如十几个在那里流行的博客客户端)你显然没有那个选项。

我按照文档来实现一个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类inheritance自ActionWebService :: API :: Base,并使用api_method等方法指定支持的xml-rpc方法签名。 您的MyServiceinheritance自ActionWebService :: Base,并且只是实现普通ruby代码之类的方法。 您可能需要/想要传递对您实现的ApiController类的引用,您可以在服务的initialize方法中执行该引用。