如何在Sinatra的GET请求中更简洁地传递数组参数?
在Sinatra中用逗号分隔字符串传递数组参数的实现方案
Sinatra默认仅支持通过重复的param1[]=value格式(比如param1[]=1¶m1[]=2)解析查询字符串中的数组参数,直接传param1[]=1,2,3的话,值会被当成单个字符串处理。不过你可以通过全局参数预处理实现自动解析逗号分隔的数组,不用在每个路由里手动拆分字符串。
方法:用before钩子全局处理参数
在Sinatra应用中添加一个before钩子,自动识别带[]后缀的参数,并将其中的逗号分隔字符串转换为数组:
require 'sinatra' require 'json' before do params.each do |key, value| # 仅处理带[]后缀且值为逗号分隔字符串的参数 if key.end_with?('[]') && value.is_a?(String) && value.include?(',') # 将逗号分隔的字符串拆分为数组 params[key] = value.split(',') # 可选:将参数名转为不带[]的格式,方便后续调用 clean_key = key.chomp('[]') params[clean_key] = params[key] params.delete(key) end end end get '/my/test' do content_type :json # 直接使用params[:param1]就能拿到数组 { received_param1: params[:param1] }.to_json end
测试你的curl命令
现在你可以直接用简洁格式发起请求:
curl -v -H 'ContentType: application/json' -H 'Accept: application/json' 'http://0.0.0.0:8848/my/test?param1[]=1,2,3'
响应会返回:
{"received_param1":["1","2","3"]}
如果需要将数组元素转为整数,可在拆分后添加类型转换:
params[key] = value.split(',').map(&:to_i)
这样就能完全满足你无需手动拆分字符串,直接用逗号分隔格式传递数组的需求。
内容的提问来源于stack exchange,提问作者Tarta
相关产品推荐
相关产品推荐

