2015-12-21 32 views
5

Attualmente ci troviamo di fronte a un problema per l'elaborazione della richiesta HEAD e GET. Lasciatemi spiegare lo scenario dettagliatoProblema durante l'elaborazione della richiesta HEAD e GET nelle guide 3

Nella nostra applicazione abbiamo integrato la funzione SMS in entrata e in uscita.

Ma dagli ultimi 2-3 mesi riceviamo 2-3 volte la richiesta GET dal provider di servizi SMS e si ripercuote sul nostro sistema.

Dopo lunga discussione con provider del servizio SMS, che stanno dicendo "Sia capo e ottenere le richieste sono gestite in modo simile dalla tua fine"

ho anche fatto riferimento this link. Potete trovare i rispettivi registri a this link

Quindi qualcuno può suggerire come risolvere questo problema.

EDIT Dopo ricerche abbiamo scoperto che stiamo ottenendo tutti i parametri sia in HEAD e ottenere richiesta a causa di questo server è elaborarlo.

+0

Provare qualcosa del genere: corrispondenza 'utente/mostra' => 'utenti # mostra',: via => [: get,: head] –

+0

@ i-am-simple-user Qual è il problema? Ci sono più richieste GET del solito? Che problema provoca? –

+0

@ThongKuah fondamentalmente sto usando heroku e sta trattando la richiesta HEAD come GET. Anche se ottengo l'HEAD sta prendendo GET e anche nei registri mi sta mostrando che solo non sono HEAD –

risposta

1

Penso che il problema potrebbe essere il middleware ActionDispatch::Head. Parte di questo è seguente codice:

def call(env) 
    if env["REQUEST_METHOD"] == "HEAD" 
    env["REQUEST_METHOD"] = "GET" 
    env["rack.methodoverride.original_method"] = "HEAD" 
    status, headers, _ = @app.call(env) 
    [status, headers, []] 
    else 
    @app.call(env) 
    end 
end 

Quindi, in sostanza il middleware cambia la richiesta di metodo prima che il router diventa ancora la richiesta. Se volete che il vostro router per gestire la differenza tra la testa e le richieste GET, è possibile rimuovere il middleware con l'aggiunta di

config.middleware.delete "ActionDispatch::Head" 

al application.rb

caso contrario, si dovrebbe essere in grado di accedere a tale variabile nel controller come questo:

if request.env["rack.methodoverride.original_method"]=='HEAD' 
    #do head processing here 
    head :ok, :additional_header => 'value' 
else 
    #do get processing here 
end 

Se ti preoccupi delle prestazioni, ti suggerisco di scrivere il tuo middleware per gestire queste richieste. Railscasts ha alcuni tutorial good su this.

Si noti inoltre che altri middleware, come Rack :: Cache, potrebbero interferire in questo processo. Così si dovrebbe inserire il middleware in alto:

config.middleware.insert_before 0, "YourMiddleware" 
+0

provato la soluzione ma ancora affrontando lo stesso problema – Shrikant1712

+0

Quale soluzione hai provato? Se hai provato il middleware, ed era in cima alla catena, ciò potrebbe significare che il tuo server (nginx, unicorn, ecc.) Potrebbe convertire l'HEAD in una richiesta GET. Inoltre: hai fatto una richiesta head con curl ('curl -i -X ​​HEAD [url]')? Forse il problema è dal lato client. – skahlert

0

vorrei solo implementare la mia: la risposta testa come l'esempio nella https://stackoverflow.com/a/10453525/5446866

if request.head? 
head :ok # or whatever 
else 
# your other complex stuff here 
end 

Si potrebbe anche aggiungere un percorso specifico alla richiesta testa.per esempio

match '/validate_messages/sms' => 'validate_messages#noop', via: :head 

e poi nel controllore

def noop 
    head :ok 
end 

fondamentalmente, è necessario implementare ciò che si vuole fare con HEAD richiesta altrimenti andare avanti e usare il vostro GET gestore

Speranza che aiuta

+0

Ho già provato questa soluzione. –

+0

non è questo quello che volevi? rispondere alle richieste di 'head' e' get' in modo diverso? –

+0

sì, in pratica non dovrebbe elaborare la richiesta HEAD –