LoginSignup
9
7

More than 5 years have passed since last update.

FaradayでリクエストパラメータのArrayに括弧をつけない

Last updated at Posted at 2015-11-10

解決に少し手間取ったのでメモ
検索用キーワード: faraday array params without square brackets

問題点

Faradayでリクエストした時のパラメータがfoo_ids[]=1&foo_ids[]=2のようになってしまう
(ちなみにこの[]を付加するのはRailsでは標準になっているが、Web全体の標準というわけでは無いらしい)

foo_ids=1&foo_ids=2のようにしてリクエストしたい

解決方法

Faraday::FlatParamsEncoderを使う

Faraday.new(:url => base_url) do |faraday|
  faraday.request :url_encoded # form-encode POST params
  faraday.options.params_encoder = Faraday::FlatParamsEncoder
  ...
end

VCRを使う場合

テストの時にVCRを使う場合、問題がある
WebMock(config.hook_into :webmock)を使った場合に確認済み(他のlibraryは未確認)

ここで起こる問題は、foo_ids=1&foo_ids=2などをリクエストすると、実際のリクエストは問題ないが、cassetteに記録される時のURI(Query String)がfoo_ids=2の様に同名paramの最後の1つだけが記録される。

以下の設定を追加して解決

spec/support/vcr.rb
WebMock::Config.instance.query_values_notation = :flat_array

関連箇所は
webmock-1.22.3/lib/webmock/util/uri.rb の次のあたり

      NORMALIZED_URIS = Hash.new do |hash, uri|
        normalized_uri = WebMock::Util::URI.heuristic_parse(uri)
        if normalized_uri.query_values
          sorted_query_values = sort_query_values(WebMock::Util::QueryMapper.query_to_values(normalized_uri.query, :notation => Config.instance.query_values_notation) || {})

その他

参考Issue

Faraday handles repeated query parameters incorrectly

関連する部分

/faraday-0.9.2/lib/faraday/parameters.rb内の
elsif value.is_a?(Array)の辺り
[]%5B%5Dになっている

options.params_encoderなどのオプションはリクエストレベルでも変えられる

今回の事象はRailsのウェブアプリ相手には起きないが、Rails以外の環境で作られたアプリケーションと連携する場合必要となることがある。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7