サンプルRailsアプリケーションの作成
ここからは実際にFaradayを使った簡単なサンプルRailsアプリケーションを作成します。作成するアプリケーションは、QiitaのAPIを使ってRailsタグがついている記事を取得し、一覧するものです。
Railsアプリケーションのインストール
実装するにあたり、Ruby/PostgreSQLインストール手順、Railsアプリケーションを作成するまでの手順は省略します。開発環境は以下の通りです。
- macOS High Sierra
- Ruby 2.6.1
- Ruby on Rails 5.2.2
- PostgreSQL 10.3
なお、開発環境構築手順は過去のCodeZine連載「サンプルコードで学ぶRuby on Rails 5実践入門」の以下記事をご参考ください。Ruby/Railsのバージョンは古いものの、同じ手順で環境構築できます。
なお、Railsアプリケーション開発までのコマンドのみ列挙しておきます。
mkdir faraday_sample cd faraday_sample bundle init bundle --path vendor/bundle -j4 bundle exec rails new . -d postgresql
Faradayのインストール
以下のようにGemfileにFaradayを追記します。
…(中略)… gem 'faraday' …(中略)…
以下のコマンドを実行し、gemをインストールします。
bin/bundle
執筆時点ではバージョン0.15.4がインストールされました。
記事一覧を取得するモデルの実装
Qiita記事を取得するAPIの詳細については割愛しますが、以下の公式サイトの記事を参考に記事検索のクエリを組み立てます。
Faradayを使ってQiitaのAPIにアクセスし、Railsタグが付与されている記事を取得するモデルを以下のように実装します。
require 'json' class QiitaItem def self.get url = 'https://qiita.com' connection = Faraday.new(url: url) # (1) response = connection.get do |req| # (2) req.url '/api/v2/items', page: 1, per_page: 100, query: 'tag:Rails updated:>2019-02 stocks:>3' # (3) end json = JSON.parse(response.body) # (4) json.sort_by { |i| i['likes_count']}.reverse.map do |item| # (5) { title: item['title'], url: item['url'], likes_count: item['likes_count'] } end.take(20) end end
(1)の部分では、Faradayの基本的な使い方で紹介した通り、初期化しています。(2)のブロックでは、GETリクエストを生成しています。このように、ブロックとして実装することもできます。(2)のブロック内にある(3)では、GETリクエストを送るURIを「/api/v2/items」に指定し、GETパラメーターを指定しています。
各パラメーターの意味は以下の通りです。
パラメーター | 値 | 意味 |
---|---|---|
page | 1 | 記事検索結果のページ数。ここでは1ページ目を指定。 |
per_page | 100 | 1ページあたりの記事数。ここでは1ページにつき100記事を指定。 |
query | 'tag:Rails updated:>2019-02 stocks:>3' | 記事検索の条件。複数条件はスペース区切りでAND条件となる。ここではRailsのタグが付与されていて更新日が2019/2/1以降でストック数が3以上のものを指定。 |
(4)では、QiitaのAPIから返ってきたJSONをパースしています。(5)のブロックでは、記事を一旦いいね数の降順でソートして記事タイトル/URL/いいね数のハッシュ形式にしたものを新しい配列をmapメソッドで生成しています。最後のtake(20)は、いいね数の上位20件を取得しています。
Qiitaの記事検索APIから返却されるJSONのキーの対応は以下の通りです。
キー | 意味 |
---|---|
title | 記事タイトル |
url | 記事URL |
likes_count | いいね数 |
なお、より実践的には、Qiitaがメンテナンス中や障害発生時の場合に対応するためにHTTPステータスの確認や例外処理などを入れる必要がありますが、ここでは簡略化のために省略している点に注意してください。
ここまで実装し終えたら、railsコンソール上で意図の通り動作するかを確認しておきます。
bin/rails c
▼
Running via Spring preloader in process 84989 Loading development environment (Rails 5.2.2) irb(main):001:0> ret = QiitaItem.get …(中略)… irb(main):002:0> ret.first => {:title=>"もっと気軽にアウトプットできる技術ブログサービス「Qrunch(クランチ)」をリリースした【個人開発】", :url=>"https://qiita.com/c0domisu/items/95a561d163d26bbfe274", :likes_count=>1987} irb(main):003:0> ret.count => 20 irb(main):004:0>
表示部分の実装
続いて表示部分を実装していきます。まずはトップページのルーティングを以下のように記述します。
Rails.application.routes.draw do root to: 'home#index' end
続いてトップページ用のコントローラーで先程実装したモデルを呼び出してビューにわたす処理を以下のように記述します。
class HomeController < ApplicationController def index @items = QiitaItem.get end end
最後に、トップページに対応するビューで取得した記事一覧を表示する処理を以下のように記述します。
<h1>Rails記事一覧</h1> <ol> <% @items.each do |item| %> <li><%= link_to item[:title], item[:url], target: '_blank' %>(<%= item[:likes_count] %>いいね)</li> <% end %> </ol>
動作確認
これで一通りの実装が完了したので、動作確認を行います。以下のコマンドでpumaサーバーを実行します。
bin/rails s
「http://localhost:3000」にアクセスします。正常に動作していれば以下のように表示されます。
なお、実行結果は記事執筆時点でのものです。実際に実行してみると、Railsに関係する良記事が確認できるはずです。
まとめ
ここまで、HTTPクライアントライブラリであるFaradayの基本的な使い方を確認するとともに、実際にQiitaのAPIにアクセスしてRailsに関する記事を取得するサンプルアプリケーションを実装しました。
このように、Faradayを使うことでシンプルにHTTPクライアントを実装することができます。