使用以下Sinatra应用程序
get '/app' do
content_type :json
{"params" => params}.to_json
end
调用:
/app?param1=one¶m2=two¶m2=alt
给出以下结果:
{"params":{"param1":"one","param2":"alt"}}
Params只有两个键,param1&参数2。
我理解Sinatra将params设置为哈希,但它并不代表所有的URL请求。
在Sinatra中是否有办法获取请求中发送的所有URL参数的列表?
答案 0 :(得分:20)
机架中的任何请求
get '/app' do
params = request.env['rack.request.query_hash']
end
答案 1 :(得分:18)
我相信默认情况下,同名的参数将被最后处理的参数覆盖。
您可以将params2设置为排序数组
...¶m2[]=two¶m2[]=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¶m2=two¶m2=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