【问题标题】:Array query parameter for Ruby Grape APIRuby Grape API 的数组查询参数
【发布时间】:2015-12-14 00:41:27
【问题描述】:

现在我的 API 接受一个请求,例如 ?a[]=x&a[]=y 使用:

params do
  requires :a, type: Array[String]
end

我的客户端只能以 Grape 不理解的?a[0]=x&a[1]=y 发送查询参数,导致 400 (Bad Request)

Grape 不能同时接受a[]a[0] 吗?另一种选择是先向另一台服务器发送请求,将a[0]转换为a[],将该请求发送给Grape,从Grape获取响应并将其发送给客户端,这似乎真的没有必要。

【问题讨论】:

  • 是什么阻止您的客户端生成此类 URL?
  • 我无法找到使用库从索引更改为括号的方法,因此将 Grape 更改为更灵活可能更容易。我当然可以自己构造参数,但我认为库应该处理这个问题。 Qs (github.com/hapijs/qs#stringifying) 可以处理这个问题,例如,轻松指定括号或索引(但我没有使用 Qs)。

标签: ruby grape grape-api


【解决方案1】:

Rack 比 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"}},基于params是无效的。

虽然未指明的版本 ?a[]=x&a[]=y 生成数组 {"a"=>["1", "2"]}

有关此的一些重要信息@see http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多