Ruby's Faraday - 多次包含相同的参数



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

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

我正在使用法拉第作为我的 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 服务器的实际 url 是:

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

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

我一直

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

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

应该屈服

color=red&color=blue

如果您不想升级到 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

我认为你称呼法拉第的方式是不正确的。您需要先定义一个连接(不带参数),然后在该连接上调用 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

相关内容

  • 没有找到相关文章

最新更新