假设 Rails 3:
从 Rails 应用程序提供 XMLRPC 服务有两种或三种基本方法。
首先是使用支持此功能的 Rack 中间件 (gem 'rack-rpc' - https://github.com/datagraph/rack-rpc),理论上它应该可以与现有的基于 Rack 的应用程序在同一台服务器上运行,但我发现当我想使用 ActiveRecord 模型时,我感到很沮丧。我能够通过将 rack-rpc 添加到 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 请求的客户端(如十几个流行的博客客户端),您显然会没有那个选项。
我按照文档实现了一个 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 文档中解释的替代方法之一。
您的 MyApi 类继承自 ActionWebService::API::Base 并使用 api_method 等方法来指定支持的 xml-rpc 方法签名。您的 MyService 继承自 ActionWebService::Base 并像普通的 ruby 代码一样简单地实现方法。您可能需要/想要传递对您实现的 ApiController 类的引用,您可以在服务的初始化方法中执行此操作。