Ruby的法拉第 - 多次包含相同的参数

时间:2013-01-27 19:06:44

标签: api url-parameters faraday

我正在使用API​​来强制我多次发送相同参数的名称以级联不同的过滤条件。因此,示例api GET调用如下所示:

GET http://api.site.com/search?a=b1&a=b2&a=b3&a=c2

我使用Faraday作为我的REST适配器,它将其URL参数作为哈希(因此 - 它具有唯一键)。这意味着我不能做这样的事情:

response = Faraday.new({
  url: 'http://api.site.com/search'
  params: { a: 'b1', a: 'b2', a: 'b3', a: 'c2' } # => nay
}).get

我在发送请求之前试图破解网址:

connection = Faraday.new(url: 'http://api.site.com/search')
url        = connection.url_prefix.to_s
full_url   = "#{ url }?a=b1&a=b2&a=b3&a=c2"
response   = connection.get( full_url )

哪个不起作用 - 当我调试响应时,我发现发送到API服务器的实际网址是:

GET http://api.site.com/search?a[]=b1&a[]=b2&a[]=b3&a[]=c2

我无法更改API。有没有办法继续与法拉第合作并以优雅的方式解决这个问题?感谢。

3 个答案:

答案 0 :(得分:9)

我一直试图弄清楚如何做一段时间。我最后挖掘了法拉第代码,并在测试套件中找到了这个用例。

:params => {:color => ['red', 'blue']}

应该产生

color=red&color=blue

答案 1 :(得分:2)

如果您不想升级到0.9.x

module Faraday
  module Utils
    def build_nested_query(value, prefix = nil)
      case value
      when Array
        value.map { |v| build_nested_query(v, "#{prefix}") }.join("&")
      when Hash
        value.map { |k, v|
          build_nested_query(v, prefix ? "#{prefix}%5B#{escape(k)}%5D" : escape(k))
        }.join("&")
      when NilClass
        prefix
      else
        raise ArgumentError, "value must be a Hash" if prefix.nil?
        "#{prefix}=#{escape(value)}"
      end
    end
  end
end

答案 2 :(得分:0)

我认为你称法拉第的方式是不正确的。您需要首先定义连接(不带参数),然后在该连接上调用HTTP方法。

这样的事情:

require 'faraday'

client = Faraday::Connection.new :url => "http://api.twitter.com" do |builder|
    builder.response :logger
    # some middleware that helps to process a request/response comes here
end

client.get "search", { a: 1, b:2 }

这应该为您建立这个请求:

I, [2013-02-05T15:15:40.665955 #57012]  INFO -- : get http://api.twitter.com/search?a=1&b=2