【问题标题】:passing array of url params in faraday在法拉第传递 url 参数数组
【发布时间】:2013-09-13 09:23:37
【问题描述】:

我是法拉第的新手,正在尝试学习如何为 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 进行编码?

【问题讨论】:

    标签: ruby arrays faraday


    【解决方案1】:

    我明白为什么现在会这样了。

    这个问题实际上已在 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 
    

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

    gem install faraday --pre
    

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

    faraday.params_encoder = Faraday::FlatParamsEncoder
    

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

    【讨论】:

    • 抱歉接受然后不接受。我认为这是可行的,但是当我将faraday.params_encoder Faraday::FlatParamsEncoder 添加到do 块时,我得到了undefined method params_encoder' for #<Faraday::Connection:0x007fd52c05fd58> (NoMethodError)。有什么想法吗?
    • params_encoder 仅在最新版本的法拉第中。确保您已在 Gemfile 中定义版本,如下所示:gem "faraday", "~> 0.9.0.rc5"。那应该可以解决它:)
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-07-14
      • 2012-10-24
      • 2010-12-18
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多