【问题标题】:Providing an XML-RPC service from a ruby on rails application?从 ruby​​ on rails 应用程序提供 XML-RPC 服务?
【发布时间】:2011-07-29 08:17:05
【问题描述】:

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

【问题讨论】:

  • 我不知道你从哪里得到这需要一个单独的 Web 服务器的想法。否则,从您的描述中听起来似乎是合理的。

标签: ruby-on-rails xml-rpc


【解决方案1】:

假设 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 类的引用,您可以在服务的初始化方法中执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多