如何在Sinatra应用程序中获取所有URL参数

时间:2010-02-16 23:29:29

标签: ruby sinatra

使用以下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&参数2。

我理解Sinatra将params设置为哈希,但它并不代表所有的URL请求。

在Sinatra中是否有办法获取请求中发送的所有URL参数的列表?

4 个答案:

答案 0 :(得分:20)

机架中的任何请求

get '/app' do
  params = request.env['rack.request.query_hash']
end

答案 1 :(得分:18)

我相信默认情况下,同名的参数将被最后处理的参数覆盖。

您可以将params2设置为排序数组

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

或者解析查询字符串与Sinatra提供的params hash。

答案 2 :(得分:9)

kwon建议解析查询字符串。 您可以使用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"]}}

答案 3 :(得分: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