ruby on rails - tutorial - Rieles: restringe las solicitudes de la API al formato JSON
rails before_action (3)
Establecer un valor predeterminado en sus rutas no convertirá todas las solicitudes en una solicitud JSON.
Lo que quieres es asegurarte de que lo que estás renderizando sea una respuesta JSON
Casi lo tenía en la primera opción, excepto que necesita hacer esto
before_filter :set_default_response_format
private
def set_default_response_format
request.format = :json
end
Eso pasaría bajo su controlador Base API para que cuando llegue a su acción real, el formato siempre sea JSON.
Me gustaría restringir las solicitudes a todos los controladores API para que sean redirigidos a la ruta JSON. Me gustaría utilizar una redirección ya que también la URL debería cambiar según la respuesta.
Una opción sería usar un before_filter
que redirecciona la solicitud a la misma acción pero obliga al formato JSON. ¡El ejemplo no está funcionando todavía!
# 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
Otra opción sería restringir el formato en la configuración de rutas.
# routes.rb
MyApp::Application.routes.draw do
namespace :api, defaults: { format: ''json'' } do
namespace :v1 do
resources :posts
end
end
end
Quiero que todas las solicitudes terminen como una solicitud 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
...
¿Qué estrategia recomendarías?
Segunda opción, utilizando el formato de rutas. Si un usuario solicita explícitamente un formato XML, no debería recibir una respuesta JSON. Debería recibir un mensaje que diga que esta URL no responde al formato XML, o 404.
Por cierto, sería bastante fácil responder a todo lo que debería hacer en mi opinión.
class FooController
respond_to :xml, :json
def show
@bar = Bar.find(params[:id])
respond_with(@bar)
end
end
Si desea devolver un 404 o generar un error de RouteNotFound si el formato no es :json
, agregaría una restricción de ruta como esta:
Requiere formato JSON:
# routes.rb
MyApp::Application.routes.draw do
namespace :api, constraints: { format: ''json'' } do
namespace :v1 do
resources :posts
end
end
end
Puede encontrar más información aquí: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints