5

我正在使用一个 API,该 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

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

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 服务器的实际 url 是:

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

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

4

3 回答 3

9

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

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

应该产生

color=red&color=blue
于 2013-02-20T16:16:56.247 回答
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
于 2013-07-19T19:14:44.340 回答
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
于 2013-02-05T14:18:48.533 回答