web-dev-qa-db-ja.com

SinatraアプリですべてのURLパラメーターを取得する方法

次の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の2つのキーしかありません。

Sinatraがパラメータをハッシュとして設定していることは理解していますが、すべてのURLリクエストを表しているわけではありません。

リクエストで送信されたすべてのURLパラメータのリストを取得する方法はSinatraにありますか?

20
necrobious

デフォルトでは、同じ名前のパラメータは最後に処理されたパラメータで上書きされると思います。

Params2を並べ替えの配列として設定することもできます

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

または、クエリ文字列とSinatraが提供するparamsハッシュを解析します。

18
nowk

ラック内のリクエスト

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

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

10
Lysann Schlegel

プロセスをより使いやすくするためのヘルパーを作成できます。

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
4
ewalk