成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

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 になりました。

めでたしめでたし。