Запрос Sinatra [ "SOME_HEADER" ] не работает на POST; ошибка doc?
SINATRA README говорит:
request["SOME_HEADER"] # value of SOME_HEADER header
Учитывая это приложение:
require 'sinatra'
post '/env' do
env['HTTP_X_FOO']
end
post '/request' do
request['X-Foo']
end
post '/request_rack_http_format' do
request['HTTP_X_FOO']
end
Первая спецификация проходит; следующие две ошибки:
describe "Sinatra should place the header in" do
before(:all) do
header 'X-Foo', 'Bar'
end
example "env" do
post '/env'
last_response.body.should == 'Bar' #pass
end
example "request[]" do
post '/request'
last_response.body.should == 'Bar' #fail; got ""
end
example "request[] (rack format)" do
post '/request_rack_http_format'
last_response.body.should == 'Bar' #fail; got ""
end
end
Глядя на источник, Sinatra фактически ничего не делает с []
; он реализован в Rack как объединение GET
и POST
. И POST
просто возвращает хэш формы. Для GET
это хеш запроса. Во всех трех маршрутах request.params
пуст.
Мой вопрос: Является ли это ошибкой doc, или я не понимаю, как использовать request[]
? На данный момент мое приложение отлично работает с методом env[]
. Но я хочу сделать это "правильно".
Ответы
Ответ 1
Кажется, это ошибка в документации. request[]
действительно извлекает параметры для запроса, а не заголовок:
https://github.com/rack/rack/blob/master/lib/rack/request.rb#L262
def [](key)
params[key.to_s]
end
Я дважды проверил его, проверив также. Кажется немного глупым, но похоже, что вы действительно не можете напрямую обращаться к заголовку любым способом, кроме как через env
. По крайней мере, я не мог понять другого пути.
Ответ 2
Я понял, что если заголовок param в 'SOME_HEADER'
Я могу получить к нему доступ с помощью
env['HTTP_SOME_HEADER']
поэтому Sinatra (возможно, Rack), похоже, добавляет префикс HTTP_ (и верхний регистр)...
странно.
Ответ 3
Да, поскольку Джорджио сказал, что заголовок был заглавным и отформатирован так:
env['HTTP_SOME_HEADER']
с любыми дефисами, преобразованными в символы подчеркивания. Это довольно запутанно.