2014-04-10 4 views
12

In realtà sto lavorando su un'API che utilizza Rails 4. Vorrei impostare lo Content-Type di una richiesta a JSON se il client non specifica un tipo di supporto nell'intestazione Content-Type.Forza tutte le richieste ricevute Content-Type a JSON

Al fine di ottenere che il comportamento ho provato ad aggiungere la seguente before_action nel mio ApplicationController:

def set_request_default_content_type 
    request.format = :json 
end 

Nel mio metodo RegistrationsController#create ho un punto di interruzione per controllare se tutto funziona. Bene, il trucco request.format non funziona, nonostante il valore sia impostato su application/json, sembra che il controller (o gli interni di Rails) non considerino il tipo di contenuto della richiesta ricevuta come JSON.

ho fatto una richiesta POST con il seguente (e non Content-Type):

{"user" : {"email":"[email protected]","password":"foobarfoo"}} 

Con il debug con leva vedo che:

[2] api(#<V1::RegistrationsController>) _ request.format.to_s 
=> "application/json" 
[3] api(#<V1::RegistrationsController>) _ params 
=> { 
     "action" => "create", 
    "controller" => "v1/registrations" 
} 

Significa che Rails non ha avuto ho considerato la mia richiesta con request.format configurato con Mime::JSON, ma invece con Mime::ALL e quindi non ha analizzato il corpo JSON della richiesta. :(

+0

penso che ed usa [wrap_parameters()] (http://apidock.com/rails/ActionController/ParamsWrapper/ClassMethods/wrap_parameters) in te 'ActionController' –

+0

' ActionController :: ParamsWrapper' è abilitato di default per il formato json. Ma non funziona. Al momento non utilizzo MetalController ma una classica architettura Rails con controller standard. – Mich

risposta

-1

si dovrebbe essere in grado di impostare il formato predefinito utilizzando le rotte: http://guides.rubyonrails.org/routing.html#defining-defaults

resources :registrations, ... defaults: { format: 'json' } 

Vedi anche:? How to set the default format for a route in Rails? formato-per-un-percorso-in-rotaie answertab = attiva # tab-top


anche forse interessare:

Rails ignora l'intestazione accept quando contiene “/” o “/”, e restituisce HTML (o JS se si tratta di una richiesta XHR).

Questo è sempre stato progettato per restituire HTML quando si accede da un browser.

Questo non segue le specifiche di negoziazione del tipo mime, ma era l'unico modo per aggirare i vecchi browser con intestazione di accettazione bug. Avevano accettato l'intestazione con il primo tipo di mime come immagine/png o testo/xml.

+0

Ho già provato ad usare il parametro di configurazione predefinito di config/route.rb e fondamentalmente fa la stessa cosa del mio before_action: [2] api (# ) _ request.format.to_s => " application/json " [3] api (# ) _ request.content_type =>" text/plain " [4] api (# ) _ params => { "format" =>: jSON, "azione" => "creare", "unità" => "V1/registrazioni" } :( – Mich

+1

request.format non cambia request.content_type – Mich

+0

vedo il tuo problema, è con la richiesta (content_type) non la risposta (formato) – house9

0
class V1::RegistrationsController < ApplicationController 
    respond_to :json 
end 

rende il formato reponse predefinito JSON

0

Si potrebbe definire una risposta any tipo all'interno del blocco respond_to, che non limiterà il controller per rispondere quando URI della richiesta termina con .json, ma anche sollievo che dalla definizione di un tipo di risposta esplicitamente e manterrà, indipendentemente dal tipo di contenuto della richiesta, rispondendo come desiderato, esempio:

respond_to do |format| 
    format.any {render :json => {foo: 'bar'}} 
end