Faraday middlewareの作り方

2015-01-03#ruby

Faraday middlewareの要件としては、Rack middleware同様に

の2点だけを満たせばいい。ただし、レスポンスを処理する場合は#on_complete内のブロックで実装する必要がある。

def call(request_env)
  @app.call(request_env).on_complete do |response_env|
    # パースなどレスポンスの処理
  end
end

ここまではREADME.mdにも書いてあるのだけど、レスポンスの処理を効率的に実装するための方法が用意されている。それはFaraday::Response::Middlewareだ。使い方は以下の通り。

require "faraday"
 
module Faraday
  class Response
    class JSON < Middleware
      def parse(body)
        body.to_json
      end
    end
 
    register_middleware json: JSON
  end
end
connection = Faraday.new do |connection|
  connection.response :json
  connection.adapter Faraday.default_adapter
end

簡単なのでFaraday::Response::Middlewareのソースコードを見てみる。

module Faraday
  class Response
    class Middleware < Faraday::Middleware
      def call(env)
        @app.call(env).on_complete do |environment|
          on_complete(enrivonment)
        end
      end
 
      def on_complete(env)
        env.body = parse(env.body) if respond_to?(:parse) && env.parse_body?
      end
    end
  end
end
module Faraday
  class Middleware
    extend MiddlwareRegistry
 
    # ...
 
    def initialize(app = nil)
      @app = app
    end
  end
end