1

我是法拉第的新手,正在尝试学习如何为 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. []当我传递参数数组时,如何让法拉第对 URL 进行编码?

4

2 回答 2

2

我明白为什么现在会发生这种情况。

此问题实际上已在 Faraday 版本 0.9+ 上得到修复,但这仅可作为 RC 使用。

所以有两个选择:将您的代码更改为如下所示(猴子补丁,取自Ruby 的法拉第 - 多次包含相同的参数

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 

或者使用预发布的 0.9 版本的法拉第

gem install faraday --pre

并将其添加到您的代码中:

faraday.params_encoder = Faraday::FlatParamsEncoder

这将阻止它添加[]符号。

于 2013-09-10T16:14:30.080 回答
2

我无法发表评论,所以我会这样说:上面的答案对我有用,我已经赞成,但这是我的具体示例(我不得不将调用移至 FlatParamsEncoder,我最初使用了错误的方法:

#Gemfile
gem 'faraday', '~> 0.9.0.rc5'

#lib/api_wrapper/faraday_adapter.rb
def patch
  connection.patch do |req|
    req.options.params_encoder = Faraday::FlatParamsEncoder
    req.headers['Content-Type'] = 'application/json'
    req.url "/api/v1/#{end_point}", @request.params
  end
end

def connection
  faraday_client = Faraday.new(:url => base_url) do |faraday|
    faraday.response :logger if Rails.env.development?
    faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
  end
  faraday_client.basic_auth(username, password)
  faraday_client
end
于 2014-04-01T15:17:26.200 回答