2015-09-04 23 views

risposta

5

Questo codice risolto la mia domanda request.env["HTTP_MY_HEADER"]. Il trucco era che dovevo prefisso il nome della mia intestazione con HTTP

+0

sembra 'richiesta.anche le intestazioni ['HTTP_MY_HEADER'] 'funzionerebbero. – 23inhouse

24

request.headers non restituisce un hash, ma un'istanza di ActionDispatch::Http::Headers, che è un wrapper attorno al rack env.

ActionDispatch::Http::Headers implementa molti metodi come [] e []= che lo rendono comportarsi come un hash, ma non ignorare l'impostazione predefinita inspect, quindi non è possibile vedere le coppie chiave-valore di appena p o pp esso.

È possibile, tuttavia, vedere le intestazioni di richiesta nella ENV rack:

pp request.headers.env.select{|k, _| k =~ /^HTTP_/} 

ricordare che le intestazioni di richiesta in env cremagliera sono il upcase d, underscore d e HTTP_ versione prefissata delle intestazioni di richiesta originale http .

UPDATE

realtà ci sono un insieme finito di header di richiesta che non sono preceduti HTTP_. Questi nomi di intestazione (maiuscola e sottolineata) sono memorizzati in ActionDispatch::Http::Headers::CGI_VARIABLES. Io li elenco qui sotto:

AUTH_TYPE 
    CONTENT_LENGTH 
    CONTENT_TYPE 
    GATEWAY_INTERFACE 
    HTTPS 
    PATH_INFO 
    PATH_TRANSLATED 
    QUERY_STRING 
    REMOTE_ADDR 
    REMOTE_HOST 
    REMOTE_IDENT 
    REMOTE_USER 
    REQUEST_METHOD 
    SCRIPT_NAME 
    SERVER_NAME 
    SERVER_PORT 
    SERVER_PROTOCOL 
    SERVER_SOFTWARE 

Così la versione completa di sfogliare intestazioni di richiesta sarebbe

pp request.headers.env.select{|k, _| k.in?(ActionDispatch::Http::Headers::CGI_VARIABLES) || k =~ /^HTTP_/} 
+0

buona risposta. vediamo se questo ti porta a 1000rep :) –

+1

Sono un po 'confuso, perché continuo a ricevere tutti gli attributi preceduti da 'HTTP', perché non riesco ad accedervi con qualcosa come' response [' Cache-Control '] ' – delpha

+2

@ user3433309 È assolutamente possibile accedere alle intestazioni delle richieste come' request.headers ['Autorizzazione'] '. Rails avvolge l'env del rack proprio per questo motivo. Puoi dare un'occhiata al codice sorgente di 'ActionDispatch :: Http :: Headers', è molto semplice. – Aetherus

-1

È possibile visualizzare l'hash delle intestazioni http effettive utilizzando @_headers nel controller.

3

Ho notato in Rails 5 che ora si aspettano le intestazioni siano scritte come questo nella richiesta:

Access-Token

Prima si trasformano in:

HTTP_ACCESS_TOKEN

In Rails . Fare ACCESS_TOKEN non funzionerà più.

Problemi correlati