LoginSignup
4
8

More than 3 years have passed since last update.

【Rails】Web APIを利用する時に使用するgem、Faradayを初めて触る

Last updated at Posted at 2019-06-20

最初に

自分用にメモ。

Web APIを利用するとき
1. サーバー側からリクエストパラメータをAPIに送信し
2. JSON形式やらでレスポンスが返ってくる。

それを行うミドルウェア(?)という理解。

Faradayとは

  • HTTPクライアントのgem ≒ Rackミドルウェア
  • ミドルウェアを追加することで色々な機能を追加できるようになる。

Faraday is an HTTP client library 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.

Web APIコールに使ったりする。

Faradayを使うと何が嬉しいの?
- HTTPリクエスト部分が宣言的に美しく書ける
- リクエスト/レスポンスが柔軟に設定できる

とか

OAuth/OAuth2両方に対応しているので、APIによってgemを使い分けるみたいな面倒くさいことしなくても良い

Rackミドルウェア

Rackとは

RackはHTTPリクエストとレスポンスを可能なかぎり簡単な方法でラッピングすることで、Webサーバー、Webフレームワーク、その間に位置するソフトウェア(ミドルウェアと呼ばれています)のAPIを1つのメソッド呼び出しの形にまとめます。

言い換えると

指定したファイルを独自のRuby DSLとして読み込み、DSLで指定した様々なミドルウェア、アプリケーションを組み合わせてWebサーバーを立ち上げることができる rackup というコマンドを提供するライブラリである。

なるほど。

Rails on Rack

Rails Application's Rack Object

Rails.application is the primary Rack application object of a Rails application. Any Rack compliant web server should be using Rails.application object to serve a Rails application.

rails serverコマンド

rails server コマンドは、 Rack::Server オブジェクトを作成し、Webサーバーを起動します。

Rails::Server.new.tap do |server|
  require APP_PATH
  Dir.chdir(Rails.application.root)
  server.start
end

Rails::ServerクラスはRack::Serverクラスを継承しており、以下のように Rack::Server#start を呼び出します。

class Server < Rack::Server
  def start
    ...
    super
  end
end

rackupコマンド

Railsの rails server コマンドの代わりに rackup コマンドを使うときは、以下の内容をconfig.ruに記述して、Railsアプリケーションのルートディレクトリに保存します。

Rails.root/config.ru
require_relative 'config/environment'
run Rails.application

続いて、サーバーを起動します。

$ rack config.ru

Usage

GETリクエストの送信

Faraday.get("http://example.com")

コネクション生成とリクエストの送信

connection = Faraday.new("http://example.com") # Faraday::Connection.new("http://example.com")
connection.get

ミドルウェアの宣言

ミドルウェア機能を使って、いろんな機能を追加できる。

connection = Faraday::Connection.new(:url => 'http://example.com') do |builder|
  builder.use Faraday::Request::UrlEncoded  # リクエストパラメータをURLエンコードする
  builder.use Faraday::Response::Logger  # リクエストを標準出力に出力する
  builder.use Faraday::Adapter::NetHttp  # Net/HTTPアダプターに使う(NetHttpはデフォルト)
end

response = connection.get '/api/nyan.json'  # GET http://example.com/api/nyan.json
puts response.body

ミドルウェアの追加はクラスを使ってでなくシンボルを使っても書ける。

connection = Faraday::Connection.new('http://example.com') do |builder|
  builder.request :url_encode
  builder.response :logger
  builder.adapter :net_http
end

参考リンク

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8