Über Stack

Notice: faraday-stack has been deprecated and its middleware moved to faraday_middleware.


Faraday is an HTTP client lib that provides a common interface over many adapters (such as Net::HTTP) and embraces the concept of Rack middleware when processing the request/response cycle.

“Faraday Stack” is an add-on library that implements several middleware (such as JSON and XML parsers) and helps you build an awesome stack that covers most of your API-consuming needs.

Boring example:

require 'faraday_stack'

response = FaradayStack.get 'http://google.com'

response.headers['content-type']  #=> "text/html; charset=UTF-8"
response.headers['location']      #=> "http://www.google.com/"
puts response.body

Awesome example:

conn = FaradayStack.build 'http://github.com/api/v2'

# JSON resource
resp = conn.get 'json/repos/show/mislav/faraday-stack'
resp.body
#=> {"repository"=>{"language"=>"Ruby", "fork"=>false, ...}}

# XML resource
resp = conn.get 'xml/repos/show/mislav/faraday-stack'
resp.body.class
#=> Nokogiri::XML::Document

# 404
conn.get 'zomg/wrong/url'
#=> raises Faraday::Error::ResourceNotFound

Features

  • parses JSON, XML & HTML
  • raises exceptions on 4xx, 5xx responses
  • follows redirects

To see how the default stack is built, see "faraday_stack.rb".

Optional features:

  • encode POST/PUT bodies as JSON:

    conn.post(path, payload, :content_type => 'application/json')
    
  • add Instrumentation middleware to instrument requests with ActiveSupport

    conn.builder.insert_after Faraday::Response::RaiseError, FaradayStack::Instrumentation
    
  • add Caching middleware to have GET responses cached

    conn.builder.insert_before FaradayStack::ResponseJSON, FaradayStack::Caching do
      ActiveSupport::Cache::FileStore.new 'tmp/cache',
        :namespace => 'faraday', :expires_in => 3600
    end
    
  • mount Rack::Cache through RackCompatible middleware for HTTP caching of responses

    conn.builder.insert_after FaradayStack::FollowRedirects, FaradayStack::RackCompatible,
      Rack::Cache::Context,
        :metastore   => "file:/var/cache/rack/meta",
        :entitystore => "file:/var/cache/rack/body"