2010-02-16 25 views
20

Usando la siguiente Sinatra aplicaciónCómo obtener todos los parámetros de URL en una aplicación Sinatra

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

Invocación:

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

da el siguiente resultado:

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

Params tiene solo dos teclas, para m1 & param2.

Entiendo que Sinatra está configurando params como hash, pero no representa toda la solicitud de URL.

¿Hay alguna manera en Sinatra de obtener una lista de todos los parámetros de URL enviados en la solicitud?

Respuesta

18

Creo que por defecto los parámetros del mismo nombre serán sobrescritos por el parámetro que se procesó al final.

Usted podría params2 configuración como una matriz de tipo

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

o analizar la cadena de consulta frente a la Sinatra siempre de hash params.

4

Puede crear un ayudante para hacer el proceso más amigable:

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 

entonces usted puede acceder a los parámetros en el bloque get:

get '/app' do 
    content_type :json 
    request_params_repeats.to_json 
end 
+0

no funciona, creo que la transmisión de rack.input ya fue leída por sinatra. –

9

Kwon sugiere analizar la cadena de consulta. Puede utilizar CGI para analizar de la siguiente manera:

require 'cgi' 

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

Invocación:

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

da el siguiente resultado:

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

20

Cualquier solicitud de rack de

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

'rack.request.query_string' si desea la cadena sin formato y no un hash. –

Cuestiones relacionadas