2015-09-04 10 views
8

Ich habe eine Anwendung in Rails entwickelt und ich versuche, die Attribute im HTTP-Header zu sehen.Anzeigen oder erhalten Sie die HTTP-Header-Attribute in Rails 4

Gibt es eine Möglichkeit, diese Attribute zu lesen? Wo sind sie gespeichert?

Jemand erwähnte request.headers. Ist das richtig? Ich kann keine Attribute innerhalb dieses Arrays sehen.

Antwort

5

Dieser Code meine Frage gelöst request.env["HTTP_MY_HEADER"]. Der Trick war, dass ich den Namen meines Headers mit HTTP

+0

es sieht aus wie 'Anfrage.Header ['HTTP_MY_HEADER'] 'würde auch funktionieren. – 23inhouse

24

request.headers gibt keinen Hash zurück, sondern eine Instanz von ActionDispatch::Http::Headers, die ein Wrapper um Rack-env ist.

ActionDispatch::Http::Headers implementiert viele Methoden wie [] und []=, die es wie ein Hash verhalten, aber es hat keinen Vorrang vor den Standard inspect, daher können Sie nicht sehen, die Schlüssel-Wert-Paare von nur p oder pp es.

Sie können jedoch finden Sie in den Request-Header im Rack env:

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

Denken Sie daran, dass die Request-Header in Rack-env sind die upcase d, underscore d und HTTP_ Präfix Version der ursprünglichen HTTP-Request-Header .

UPDATE

Eigentlich eine endliche Menge von Request-Header gibt, die nicht HTTP_ Präfix. Diese (groß geschriebenen und unterstrichenen) Header-Namen werden in ActionDispatch::Http::Headers::CGI_VARIABLES gespeichert. Ich liste sie unter:

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 

So ist die Vollversion von Listing Request-Header wäre

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

gute Antwort. mal sehen ob das dich zu 1000rep brennt :) –

+1

Ich bin ein bisschen verwirrt, weil ich immer alle Attribute mit dem Präfix 'HTTP' bekomme, warum ich nicht darauf zugreifen kann mit etwas wie 'response [' Cache-Control '] ' – delpha

+2

@ user3433309 Sie können absolut auf die Anfrage-Header wie' request.headers ['Authorization'] '' zugreifen. Rails wickelt das Rack env genau aus diesem Grund. Sie können sich den Quellcode von 'ActionDispatch :: Http :: Headers' anschauen, es ist sehr einfach. – Aetherus

-1

voranstellen musste Sie sehen Hash der tatsächlichen HTTP-Header mit @_headers in Controller.

3

Ich habe in Rails bemerkt 5 erwarten sie nun Header wie dies in der Anfrage geschrieben werden:

Access-Token

Bevor sie umgewandelt werden in:

HTTP_ACCESS_TOKEN

In Rails . Doing ACCESS_TOKEN wird nicht mehr funktionieren.