Ruby葡萄API的数组查询参数
现在,我的API通过以下方式接受请求,例如Ruby葡萄API的数组查询参数,ruby,grape,grape-api,Ruby,Grape,Grape Api,现在,我的API通过以下方式接受请求,例如?a[]=x&a[]=y: params do requires :a, type: Array[String] end 我的客户端只能将查询参数发送为葡萄不理解的?a[0]=x&a[1]=y,导致400(错误请求) 是否不能同时接受a[]和a[0]?另一种选择是首先向另一台服务器发送请求,从a[0]转换为a[],将该请求发送给Grape,从Grape获得响应并将其发送给客户端,这似乎真的是不必要的。这更多地与机架有关,而不是与Grape有关。这是
?a[]=x&a[]=y
:
params do
requires :a, type: Array[String]
end
我的客户端只能将查询参数发送为葡萄不理解的?a[0]=x&a[1]=y
,导致400(错误请求)
是否不能同时接受
a[]
和a[0]
?另一种选择是首先向另一台服务器发送请求,从a[0]
转换为a[]
,将该请求发送给Grape,从Grape获得响应并将其发送给客户端,这似乎真的是不必要的。这更多地与机架有关,而不是与Grape有关。这是Rack解析查询字符串的方式,请看
rack-1.6.4/lib/rack/utils.rb
def parse_nested_query(qs, d = nil)
params = KeySpaceConstrainedParams.new
(qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
k, v = p.split('=', 2).map { |s| unescape(s) }
normalize_params(params, k, v)
end
return params.to_params_hash
rescue ArgumentError => e
raise InvalidParameterError, e.message
end
?a[0]=x&a[1]=y
将生成一个基于参数的哈希值=>{“a”=>{“0”=>“x”,“1”=>“y”}
,该哈希值无效
而非标记版本?a[]=x&a[]=y
生成一个数组{“a”=>[“1”、“2”]}
有关@see的一些重要信息,请参阅是什么阻止您的客户端生成此类URL?我无法找到使用库将索引更改为括号的方法,因此可能更容易将Grape更改为更灵活的方式。当然,我可以自己构造参数,但我认为库应该处理这个问题。Qs()可以处理这个问题,例如,很容易地指定括号或索引(但是我不使用Qs)。