[英]Ruby's Faraday - include the same param multiple times
我正在使用一个 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
我试图在发送请求之前破解网址:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.