次の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とparam2の2つのキーしかありません。
Sinatraがパラメータをハッシュとして設定していることは理解していますが、すべてのURLリクエストを表しているわけではありません。
リクエストで送信されたすべてのURLパラメータのリストを取得する方法はSinatraにありますか?
デフォルトでは、同じ名前のパラメータは最後に処理されたパラメータで上書きされると思います。
Params2を並べ替えの配列として設定することもできます
...¶m2[]=two¶m2[]=alt
または、クエリ文字列とSinatraが提供するparamsハッシュを解析します。
ラック内のリクエスト
get '/app' do
params = request.env['rack.request.query_hash']
end
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"]}}
プロセスをより使いやすくするためのヘルパーを作成できます。
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