【问题标题】:Rails 3.1 API RoutesRails 3.1 API 路由
【发布时间】:2011-11-15 21:38:39
【问题描述】:

我有一个 Rails 3.1 应用程序,我想为其创建 API。我希望我的网址看起来像:

www.example.com/controller/action // Normal Web requests
api.example.com/controller/action.json // API requests

第一个用于正常请求,另一个显然用于我的 API 内容。我希望这两个映射到同一个控制器/动作。

当我在 api 子域上时,如何设置我的应用程序以便它只在 www 和 json、xml 等上响应 HTML?

【问题讨论】:

  • 如果您打算构建一个供外部使用的 API,我建议您使用单独的控制器。 API 和 UI 的错误处理完全不同。处理异常对我们来说也是完全不同的。如果 API 方法触发了异常,我们将其格式化为 xml 并以正确的 HTTP 状态返回。

标签: ruby-on-rails ruby ruby-on-rails-3 routing


【解决方案1】:

最简单的方法 (imo) 是使用 Rails 3 路由约束。在 config/routes.rb 中,使用:

constraints :subdomain => 'www', :format => :html do
  # Routing for normal web requests
  match 'mycontroller/:action' => 'mycontroller#index'
  # ...
end

constraints :subdomain => 'api', :format => :json do
  # Routing for API requests
  match 'mycontroller/:action.:format' => 'mycontroller#index'
  # ...
end

您可能还想查看respond_with(以及类级别的 respond_to),这使得编写响应多种格式的控制器比使用传统的 respond_to 更容易。

【讨论】:

    【解决方案2】:

    检查#221 Subdomains in Rails 3 Rails Cast。对于 www,您可以添加额外的约束 ":format => :html"。 另一种解决方案是使用检查 request.subdomain 和 params[:format] 的控制器过滤器。那么你就不需要重复路由了。

    【讨论】:

      【解决方案3】:

      subdomain-fu 会有帮助吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 2011-12-19
        • 1970-01-01
        • 2012-01-23
        • 2013-11-06
        • 2012-03-01
        相关资源
        最近更新 更多