我是 Faraday 的新手,正在尝试学习如何传递 url 参数的数组。我的代码如下所示:
require 'faraday'
conn = Faraday.new(:url => 'http://foo.com:8888') do |faraday|
faraday.request :url_encoded
faraday.response :logger
faraday.adapter Faraday.default_adapter
end
response = conn.get '/api/endpoint', { :bar => ['baz', 'qux'] }
response.body
当我调试时,我发现 URL 被编码为:
INFO -- : get http://foo.com:8888/api/endpoint?bar[]=baz&bar[]=qux
而不是http://foo.com:8888/api/endpoint?bar=baz&bar=qux
。当我传递参数数组时,如何让 faraday 在没有 []
的情况下对 URL 进行编码?
最佳答案
我现在明白为什么会发生这种情况了。
这个问题实际上已在 Faraday 版本 0.9+ 上得到修复,但这仅作为 RC 提供。
所以有两个选择: 将您的代码更改为如下所示(猴子补丁,取自 Ruby's Faraday - include the same param multiple times )
require 'faraday'
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
conn = Faraday.new(:url => 'http://foo.com:8888') do |faraday|
faraday.request :url_encoded
faraday.response :logger
faraday.adapter Faraday.default_adapter
end
response = conn.get '/api/endpoint', { :bar => ['baz', 'qux'] }
response.body
或者使用预发布的 Faraday 0.9 版本
gem install faraday --pre
并将其添加到您的代码中:
faraday.params_encoder = Faraday::FlatParamsEncoder
这将阻止它添加 []
符号。
关于ruby - 在法拉第传递 url 参数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18705845/