解決に少し手間取ったのでメモ
検索用キーワード: 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つだけが記録される。
以下の設定を追加して解決
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以外の環境で作られたアプリケーションと連携する場合必要となることがある。