2013-09-09 5 views
1

Я новичок в Faraday и пытаюсь научиться передавать массив для параметров url. Мой код выглядит следующим образом:Передача массива параметров url в faraday

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-адреса без [], когда я передаю массив параметров?

ответ

2

Я понимаю, почему это происходит сейчас.

Эта проблема на самом деле установлена ​​на Faraday ver 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 

Это остановит его m, добавляя символы [].

+0

к сожалению, чтобы принять и затем unaccept я думал, что это работает, но когда я добавил 'faraday.params_encoder Фарадей :: FlatParamsEncoder' к' do' блоку я получил 'неопределенного метода params_encoder» для #. (NoMethodError) '. Любые идеи? – user139014

+1

params_encoder находится только в последней версии faraday. Убедитесь, что вы определили версию в своем Gemfile так:' gem 'faraday "," ~> 0.9.0.rc5 ". Это должно исправить это :) –

1

Я не могу прокомментировать, поэтому я скажу следующее: вышеупомянутый ответ сработал для меня, и я его поддержал, но вот мой конкретный пример (мне пришлось перевести звонок на 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