Подтвердить что ты не робот

Rails: Ограничить запросы API в формате JSON

Я хотел бы ограничить запросы ко всем контроллерам API перенаправлением на путь JSON. Я хотел бы использовать перенаправление, так как URL-адрес должен измениться в соответствии с ответом.
Один из вариантов - использовать before_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
...

Какую стратегию вы бы порекомендовали?

4b9b3361

Ответ 1

Установка значения по умолчанию в ваших маршрутах не приведет к включению всех запросов в запрос JSON.

Что вы хотите, так это убедиться, что все, что вы делаете, это ответ JSON

Вы в значительной степени использовали его в первом варианте, за исключением того, что вам нужно сделать это

before_filter :set_default_response_format

private
  def set_default_response_format
    request.format = :json
  end

Это будет под вашим базовым API-интерфейсом, так что когда он достигнет вашего действительного действия, формат всегда будет JSON.

Ответ 2

Если вы хотите вернуть 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

Ответ 3

Второй вариант, используя формат маршрутов. Если пользователь явно запрашивает формат XML, он не должен получать ответ JSON. Он должен получить сообщение о том, что этот URL-адрес не отвечает на формат XML или 404.

Кстати, было бы довольно легко ответить на все, что вы должны делать по моему мнению.

class FooController
  respond_to :xml, :json
  def show
    @bar = Bar.find(params[:id])
    respond_with(@bar)
  end
end