Ruby: Как превратить хеш в параметры HTTP?

URL-адрес, который нужно добавить в инструмент тестирования остальных:

http://localhost:49342/api/get

Тип метода: GET

Если вы вызываете этот веб-API со страницы aspx, используйте класс httpClient.

198
задан Flip 15 March 2017 в 01:33
поделиться

3 ответа

Обновление: Эта функциональность была удалена из драгоценного камня.

Жюльен, твой самоотверженный ответ хороший, и я бесстыдно позаимствовал у него, но он не экранирует должным образом зарезервированные символы, и есть несколько других крайних случаев, когда он ломается.

require "addressable/uri"
uri = Addressable::URI.new
uri.query_values = {:a => "a", :b => ["c", "d", "e"]}
uri.query
# => "a=a&b[0]=c&b[1]=d&b[2]=e"
uri.query_values = {:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]}
uri.query
# => "a=a&b[0][c]=c&b[0][d]=d&b[1][e]=e&b[1][f]=f"
uri.query_values = {:a => "a", :b => {:c => "c", :d => "d"}}
uri.query
# => "a=a&b[c]=c&b[d]=d"
uri.query_values = {:a => "a", :b => {:c => "c", :d => true}}
uri.query
# => "a=a&b[c]=c&b[d]"
uri.query_values = {:a => "a", :b => {:c => "c", :d => true}, :e => []}
uri.query
# => "a=a&b[c]=c&b[d]"

Драгоценный камень ' addressable '

gem install addressable
86
ответ дан 23 November 2019 в 05:10
поделиться

Кража у Мерба:

# File merb/core_ext/hash.rb, line 87
def to_params
  params = ''
  stack = []

  each do |k, v|
    if v.is_a?(Hash)
      stack << [k,v]
    else
      params << "#{k}=#{v}&"
    end
  end

  stack.each do |parent, hash|
    hash.each do |k, v|
      if v.is_a?(Hash)
        stack << ["#{parent}[#{k}]", v]
      else
        params << "#{parent}[#{k}]=#{v}&"
      end
    end
  end

  params.chop! # trailing &
  params
end

См. http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html

9
ответ дан 23 November 2019 в 05:10
поделиться
class Hash
  def to_params
    params = ''
    stack = []

    each do |k, v|
      if v.is_a?(Hash)
        stack << [k,v]
      elsif v.is_a?(Array)
        stack << [k,Hash.from_array(v)]
      else
        params << "#{k}=#{v}&"
      end
    end

    stack.each do |parent, hash|
      hash.each do |k, v|
        if v.is_a?(Hash)
          stack << ["#{parent}[#{k}]", v]
        else
          params << "#{parent}[#{k}]=#{v}&"
        end
      end
    end

    params.chop! 
    params
  end

  def self.from_array(array = [])
    h = Hash.new
    array.size.times do |t|
      h[t] = array[t]
    end
    h
  end

end
4
ответ дан 23 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: