Rubyのnet/httpsでGoogleBooksAPIを叩いてみる

こんにちは!kossyです!



さて、今回はRubyの標準モジュールであるnet/httpsを使って、
GoogleBooksAPIを使う方法について、ブログに残してみたいと思います。

環境
Ruby 2.6.3
Rails 6.0.2.1
MacOS Mojave





GoogleBooksAPIから返却されるJSONを見てみる

下記のURLにアクセスしてみてください。
https://www.googleapis.com/books/v1/volumes?q=rails


JSON形式の文字が羅列されたページが表示されたかと思います。


GoogleBooksAPIで検索を行う場合、

https://www.googleapis.com/books/v1/volumes?q=検索したい語句

のように、クエリ文字列に検索したい語句を指定することで、JSON形式のレスポンスを受け取ることができます。
このレスポンスをよしなに加工して使ってみたいと思います。


コード全晒し

# lib/google_book_client.rb

require 'net/https' # モジュールの読み込み

class GoogleBookClient # クラスとして定義
  include Singleton # デザインパターンの一種。GoogleBookClient.instance.search(keyword)のように外部から呼び出す

  def initialize
    @uri = URI.parse 'https://www.googleapis.com/books/v1/volumes' # URIにparseする
    @http = Net::HTTP.new @uri.host, @uri.port # httpインスタンスを生成
    @http.use_ssl = true # httpsで通信を行うようにする。指定しないとエラーする場合がある
  end

  def search(keyword) # 検索を行って配列を返すメソッド
    create_request(keyword)

    @res['items'].map do |item|
      info = item['volumeInfo']
      {
        id: item['id'],
        title: info['title'],
        price: item['saleInfo']['listPrice'].nil? ? ' - ' : item['saleInfo']['listPrice']['amount'].floor.to_s,
        authors: info['authors'],
        publisher: info['publisher'],
        published_date: info['publishedDate'],
        description: info['description'],
        image_path: info['imageLinks']['smallThumbnail']
      }
    end
  end

  private

    def create_request(keyword) # httpリクエストを投げてレスポンスを返り値とするメソッド
      req = Net::HTTP::Get.new @uri.path + "?q=#{keyword}" # getリクエストを生成
      _res = @http.request req # httpリクエストを投げる
      @res = JSON.parse(_res.body) # レスポンスをJSON形式にparseする
    end

end

Railsの場合、このファイルをディレクトリに置いて、config/application.rbに

module MyApp
  class Application < Rails::Application
    config.load_defaults 6.0
    config.paths.add 'lib', eager_load: true # <= を追加
  end
end

上記のようにlibディレクトリのファイルをロードするように設定すれば、
コンソールで試せるようになるかと思います。

早速コンソールで試してみます。

$ cd ~/任意のRailsアプリのディレクトリ

$ bundle exec rails c 

> GoogleBookClient.instance.search('Rails')

=> [{:id=>"jqKkDwAAQBAJ",
  :title=>"独習Ruby on Rails",
  :price=>"3960",
  :authors=>["小餅 良介"],
  :publisher=>"翔泳社",
  :published_date=>"2019-06-19",
  :description=>
   "現場で使える Ruby on Rails 5.2の基本 プログラミング言語RubyによるWebアプ
リケーション開発の フレームワーク「Ruby on Rails」が、『独習』シリーズに登場!
 Rails入門者だけでなく、プログラミング初心者も、 ・解説→コード→演習 という形
式で、自力で使えるようになるまで、 基礎から一通り学べる本格入門書。 Railsを実
際に教えている著者による、 オブジェクト指向から、MVCモデルまで、 しっかり、じ
っくり学べる一冊です。 ~~~目次~~~ Chapter 1 Rails概要 Chapter 2 オブジェクト
指向とRubyの基本 Chapter 3 Railsの起動と簡単なアプリケーションの構築 Chapter
4 Rails全体の仕組み Chapter 5 Active Record Chapter 6 モデルに実装すべき役割
Chapter 7 モデルを豊かにする仕組み Chapter 8 ルーターとコントローラー Chapter
 9 コントローラーによるデータの扱い Chapter 10 Action View Chapter 11 ビュー
を支える機能 Chapter 12 その他のコンポーネント Chapter 13 Active SupportとRai
lsのテスト ※本電子書籍は同名出版物を底本として作成しました。記載内容は印刷出
版当時のものです。 ※印刷出版再現のため電子書籍としては不要な情報を含んでいる
場合があります。 ※印刷出版とは異なる表記・表現の場合があります。予めご了承く
ださい。 ※プレビューにてお手持ちの電子端末での表示状態をご確認の上、商品をお
買い求めください。 (翔泳社)",
  :image_path=>
   "http://books.google.com/books/content?id=jqKkDwAAQBAJ&printsec=frontcover
&img=1&zoom=5&edge=curl&source=gbs_api"},
...

上記のような出力結果が得られると思います。
あとは返ってきた値をviewで使用すればOKです。