最初に
自分用にメモ。
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 usingRails.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アプリケーションのルートディレクトリに保存します。
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