Как получить ВСЕ параметры URL в приложении Sinatra - PullRequest
20 голосов
/ 17 февраля 2010

Использование следующего приложения Sinatra

get '/app' do
  content_type :json
  {"params" => params}.to_json
end

Вызов:

/app?param1=one&param2=two&param2=alt

Дает следующий результат:

{"params":{"param1":"one","param2":"alt"}}

У Params есть только две клавиши: param1 и param2.

Я понимаю, что Sinatra устанавливает params как хеш, но он не отражает весь запрос URL.

Есть ли в Синатре способ получить список всех параметров URL, отправленных в запросе?

Ответы [ 4 ]

20 голосов
/ 17 октября 2012

Любой запрос в стойке

get '/app' do
  params = request.env['rack.request.query_hash']
end
18 голосов
/ 17 февраля 2010

Я считаю, что по умолчанию параметры с тем же именем будут перезаписаны параметром, который был обработан последним.

Вы можете настроить params2 как массив сортов

...&param2[]=two&param2[]=alt

Или проанализируйте строку запроса против хэша params, предоставленного Sinatra.

9 голосов
/ 04 апреля 2012

квон предлагает разобрать строку запроса.Вы можете использовать CGI для его анализа следующим образом:

require 'cgi'

get '/app' do
  content_type :json
  {"params" => CGI::parse(request.query_string)}.to_json
end

Вызов:

/app?param1=one&param2=two&param2=alt

Дает следующий результат:

{"params":{"param1":["one"],"param2":["two","alt"]}}

4 голосов
/ 26 марта 2011

Вы можете создать помощника, чтобы сделать процесс более дружелюбным:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...