25

我想限制对所有 API 控制器的请求被重定向到 JSON 路径。我想使用重定向,因为 URL 也应该根据响应而改变。
一种选择是使用 abefore_filter将请求重定向到相同的操作,但强制使用 JSON 格式。该示例还没有工作!

# base_controller.rb
class Api::V1::BaseController < InheritedResources::Base
  before_filter :force_response_format
  respond_to :json
  def force_response_format
    redirect_to, params[:format] = :json
  end
end

另一种选择是限制路线设置中的格式。

# routes.rb
MyApp::Application.routes.draw do
  namespace :api, defaults: { format: 'json' } do
    namespace :v1 do
      resources :posts
    end
  end
end

我希望所有请求都以 JSON 请求的形式结束:

http://localhost:3000/api/v1/posts
http://localhost:3000/api/v1/posts.html
http://localhost:3000/api/v1/posts.xml
http://localhost:3000/api/v1/posts.json
...

您会推荐哪种策略?

4

3 回答 3

23

在您的路由中设置默认值不会将所有请求都转换为 JSON 请求。

您想要的是确保您呈现的任何内容都是 JSON 响应

您几乎在第一个选项中拥有它,除非您需要这样做

before_filter :set_default_response_format

private
  def set_default_response_format
    request.format = :json
  end

这将在您的 Base API 控制器下进行,因此当您执行实际操作时,格式将始终为 JSON。

于 2013-02-02T17:14:23.313 回答
17

如果要返回 404,或者如果格式不是 RouteNotFound 则引发错误:json,我将添加如下路由约束:

需要 JSON 格式:

# routes.rb
MyApp::Application.routes.draw do
  namespace :api, constraints: { format: 'json' } do
    namespace :v1 do
      resources :posts
    end
  end
end

更多信息可以在这里找到: http ://edgeguides.rubyonrails.org/routing.html#request-based-constraints

于 2013-02-02T20:39:45.743 回答
5

第二种选择,使用路线格式。如果用户明确请求 XML 格式,他不应该收到 JSON 响应。他应该收到一条消息,指出此 URL 不响应 XML 格式或 404。

顺便说一句,在我看来,对所有你应该做的事情做出回应是相当容易的。

class FooController
  respond_to :xml, :json
  def show
    @bar = Bar.find(params[:id])
    respond_with(@bar)
  end
end
于 2013-02-02T17:08:03.693 回答