【问题标题】:How to get ALL of the URL parameters in a Sinatra app如何在 Sinatra 应用程序中获取所有 URL 参数
【发布时间】:2011-01-17 15:27:31
【问题描述】:

使用以下 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 将参数设置为哈希,但它并不代表所有 URL 请求。

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

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

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

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

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

    或者解析查询字符串与 Sinatra 提供的参数哈希。

    【讨论】:

      【解决方案2】:

      您可以创建一个帮助程序来使过程更加友好:

      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 读取了。
      【解决方案3】:

      kwon 建议解析查询字符串。 您可以使用 CGI 来解析它,如下所示:

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

      调用:

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

      给出以下结果:

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

      【讨论】:

        【解决方案4】:

        机架中的任何请求

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

        【讨论】:

        • rack.request.query_string 如果你想要原始字符串而不是哈希。
        猜你喜欢
        • 2016-03-15
        • 1970-01-01
        • 2012-11-21
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多