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

21

使用下面的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请求都被包含在其中。

在Sinatra中是否有一种方式可以获取请求中发送的所有URL参数列表?

4个回答

22
任何一个Rack请求。
get '/app' do
  params = request.env['rack.request.query_hash']
end

1
rack.request.query_string 如果你想要原始字符串而不是哈希表。 - Mike R

17

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

你可以将params2设置为一种数组形式。

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

或解析查询字符串而不是使用Sinatra提供的参数哈希表。


11

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"]}}


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

对我来说不起作用,我认为rack.input流已经被Sinatra读取了。 - Omry Yadan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接