概要
HTTParty 0.13.x => 0.14.0 に上げたときに、空配列のエンコード方法が変わっていて、それが原因で挙動が変わっていた。
詳細
HTTParty.post(anUrl, body: { a: 1, b: []}
でリクエストを送った時、まずデフォルトでContent-typeがapplication/x-www-url-formencodedになっていて、Bodyが次のようになっていた。
HTTParty 0.13.x: a=1
HTTParty 0.14.0: a=1&b[]=
次に受け取る側の解釈ですが、
a=1
の場合、rackの層では{ a: 1 }
というhashになり、例えばGrapeなどでbをArrayとみなすように設定していれば、{ a: 1, b: [] }
に最終的に変換される。
a=1&b[]=
の場合、rackの層では{ a: 1, b: [nil] }
というhashになり、例えばGrapeでbをArrayと定義していたとしても、そのままになります。
該当issue
https://github.com/jnunemaker/httparty/issues/469
https://github.com/jnunemaker/httparty/pull/477
とりあえず対策
HTTPartyのバージョンを0.13.xで固定する。
根本対策
軽くapplication/x-www-url-formencodedの仕様についても調べてみたんですが、どう解釈するのが正しいのか、どこのせいなのかよくわかりませんでした。
が、 b[]=
という投げ方は [nil]
に解釈されるのが普通なきがする。
POSTのときはapplication/jsonで送るのが良いという話もありますが、GETだとそうもいかないので。。