2015-12-14 4 views
0

Сейчас мой API принимает запрос, такой как ?a[]=x&a[]=y с помощью:Массива параметр запроса рубин Grape API

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

Моего клиент может отправлять только параметр запроса в ?a[0]=x&a[1]=y которого Grape делает не понять, в результате чего 400 (неверный запрос).

Нельзя ли принять a[] и a[0] с виноградом? Другой вариант - сначала отправить запрос на другой сервер, преобразовать его с a[0] в a[], отправить этот запрос в Grape, получить ответ от Grape и отправить его клиенту, что кажется действительно ненужным.

+0

Что мешает вашему клиенту генерировать такие URL-адрес? – spickermann

+0

Мне не удалось найти способ изменения от индексов к скобкам с помощью библиотеки, поэтому, возможно, было легче изменить Grape, чтобы быть более гибким. Я мог бы самостоятельно разработать параметры, но я думал, что библиотеки должны это обработать. Qs (https://github.com/hapijs/qs#stringifying) может обрабатывать это, например, легко указывая скобки или индексы (однако я не использую Qs). – Filuren

ответ

0

Это больше связано со стойкой, чем с виноградом. Это как Rack разбирает строки запроса, посмотрите на

стойку 1.6.4/Lib/стойку/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 недействителен.

В то время как не-indiced версия ?a[]=x&a[]=y производит массив {"a"=>["1", "2"]}

Для некоторой большой информации о том @see http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query