Faraday パラメータのエンコードを差し替えてみる
前回に引き続きFaraday
ネタです。
Faradayはquery_stringをescapeする時に半角スペースを+
にescapeするようなので
%20
にescapeするようにERB::Util#url_encode
でescapeするようにしてみます。
参考 : http://stackoverflow.com/questions/21283414/how-to-avoid-faraday-request-to-encode-get-parameters
まずは普通に使って確認
前回同様にGETリクエストをしてみます。
client = Faraday.new(:url => "http://localhost:4567") do |faraday| faraday.response :logger faraday.adapter Faraday.default_adapter end res = client.get "/test", { "hoge hoge" => "foo bar" }
I, [2014-05-23T22:49:12.358290 #22807] INFO -- : get http://localhost:4567/test?hoge+hoge=foo+bar D, [2014-05-23T22:49:12.358373 #22807] DEBUG -- request: User-Agent: "Faraday v0.9.0" I, [2014-05-23T22:49:12.363857 #22807] INFO -- Status: 200 D, [2014-05-23T22:49:12.363918 #22807] DEBUG -- response: content-type: "application/json" content-length: "23" x-content-type-options: "nosniff" server: "WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)" date: "Fri, 23 May 2014 13:49:12 GMT" connection: "close"
結果を見てみると hoge+hoge=foo+bar
になってますね。
この辺を見ると、XXEncoder
っていう子たちがいます。
これ見ると、
- escape
- unescape
- encode
- decode
っていうクラスメソッドを定義したクラス作れば使えそうな感じがします。
今回はとりあえず、encode
だけ実装したクラスを作ってやってみます。
class ParamsEncoder def self.encode(params) params.map {|(key, value)| "#{ERB::Util.url_encode(key)}=#{ERB::Util.url_encode(value)}" }.join('&') end def self.to_query end end client = Faraday.new(:url => "http://localhost:4567") do |faraday| faraday.response :logger faraday.adapter Faraday.default_adapter faraday.options.params_encoder = ParamsEncoder end res = client.get "/test", { "hoge hoge" => "foo bar", "bar bar" => "hoge foo" }
I, [2014-05-23T22:56:42.243765 #23036] INFO -- : get http://localhost:4567/test?hoge%20hoge=foo%20bar&bar%20bar=hoge%20foo D, [2014-05-23T22:56:42.243848 #23036] DEBUG -- request: User-Agent: "Faraday v0.9.0" I, [2014-05-23T22:56:42.248266 #23036] INFO -- Status: 200 D, [2014-05-23T22:56:42.248340 #23036] DEBUG -- response: content-type: "application/json" content-length: "44" x-content-type-options: "nosniff" server: "WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)" date: "Fri, 23 May 2014 13:56:42 GMT" connection: "close"
結果をみると hoge%20hoge=foo%20bar&bar%20bar=hoge%20foo
になりました。
めでたしめでたし。