Как получить ВСЕ параметры URL в приложении Sinatra
Используя следующее приложение Sinatra
get '/app' do
content_type :json
{"params" => params}.to_json
end
Вызов:
/app?param1=one¶m2=two¶m2=alt
Дает следующий результат:
{"params":{"param1":"one","param2":"alt"}}
Парамс имеет только два ключа: param1 и param2.
Я понимаю, что Sinatra устанавливает параметры как хэш, но не представляет весь URL-запрос.
Есть ли способ в Sinatra получить список всех параметров URL, отправленных в запросе?
Ответы
Ответ 1
Я считаю, что параметры по умолчанию с таким же именем будут перезаписаны параметром, который был обработан последним.
Вы можете либо настроить params2 как массив сортировок
...¶m2[]=two¶m2[]=alt
Или проанализировать строку запроса в соответствии с синтаксисом параметров sinatra.
Ответ 2
Любой запрос в стойке
get '/app' do
params = request.env['rack.request.query_hash']
end
Ответ 3
kwon предлагает проанализировать строку запроса.
Вы можете использовать CGI для его анализа следующим образом:
require 'cgi'
get '/app' do
content_type :json
{"params" => CGI::parse(request.query_string)}.to_json
end
Вызов:
/app?param1=one¶m2=two¶m2=alt
Дает следующий результат:
{"params":{"param1":["one"],"param2":["two","alt"]}}
Ответ 4
Вы можете создать помощника, чтобы сделать процесс более дружественным:
require 'cgi'
helpers do
def request_params_repeats
params = {}
request.env["rack.input"].read.split('&').each do |pair|
kv = pair.split('=').map{|v| CGI.unescape(v)}
params.merge!({kv[0]=> kv.length > 1 ? kv[1] : nil }) {|key, o, n| o.is_a?(Array) ? o << n : [o,n]}
end
params
end
end
Затем вы можете получить доступ к параметрам в своем блоке get:
get '/app' do
content_type :json
request_params_repeats.to_json
end