SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール

Ruby製HTTPクライアント用gemの「Faraday」を使おう

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール 第11回

  • X ポスト
  • このエントリーをはてなブックマークに追加

サンプル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を追記します。

[リスト 1]Gemfile
…(中略)…
gem 'faraday'
…(中略)…

 以下のコマンドを実行し、gemをインストールします。

bin/bundle

 執筆時点ではバージョン0.15.4がインストールされました。

記事一覧を取得するモデルの実装

 Qiita記事を取得するAPIの詳細については割愛しますが、以下の公式サイトの記事を参考に記事検索のクエリを組み立てます。

 Faradayを使ってQiitaのAPIにアクセスし、Railsタグが付与されている記事を取得するモデルを以下のように実装します。

[リスト 2]app/models/qiita_item.rb
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パラメーターを指定しています。

 各パラメーターの意味は以下の通りです。

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のキーの対応は以下の通りです。

QiitaAPIのキーの意味
キー 意味
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>

表示部分の実装

 続いて表示部分を実装していきます。まずはトップページのルーティングを以下のように記述します。

[リスト 3]config/routes.rb
Rails.application.routes.draw do
  root to: 'home#index'
end

 続いてトップページ用のコントローラーで先程実装したモデルを呼び出してビューにわたす処理を以下のように記述します。

[リスト 4]app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
    @items = QiitaItem.get
  end
end

 最後に、トップページに対応するビューで取得した記事一覧を表示する処理を以下のように記述します。

[リスト 5]app/views/home/index.html.erb
<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」にアクセスします。正常に動作していれば以下のように表示されます。

Faradayサンプルアプリ
Faradayサンプルアプリ

 なお、実行結果は記事執筆時点でのものです。実際に実行してみると、Railsに関係する良記事が確認できるはずです。

まとめ

 ここまで、HTTPクライアントライブラリであるFaradayの基本的な使い方を確認するとともに、実際にQiitaのAPIにアクセスしてRailsに関する記事を取得するサンプルアプリケーションを実装しました。

 このように、Faradayを使うことでシンプルにHTTPクライアントを実装することができます。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 竹馬 力(チクバ ツトム)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11462 2019/04/03 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング