2010-02-16 22 views
20

使用下面的末日應用如何讓所有的URL參數在西納特拉應用

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

調用:

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

提供了以下結果:

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

Params只有兩個鍵,第m1 & param2。

我知道Sinatra將params設置爲散列值,但它並不代表所有的URL請求。

Sinatra有沒有辦法獲取請求中發送的所有URL參數列表?

回答

18

我相信在默認情況下,相同名稱的參數將被最後處理的參數覆蓋。

你既可以設置params2作爲排序

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

或分析查詢字符串VS的西納特拉提供PARAMS散列的數組。

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 
+0

不適用於我,我認爲rack.input流已被sinatra讀取。 – 2011-10-24 16:16:51

9

權建議分析查詢字符串。 您可以使用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"]}}

20

在機架上的任何請求

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

'rack.request.query_string'如果你想要的是原始字符串而不是散列。 – 2016-08-16 22:16:58