LoginSignup
3
7

More than 3 years have passed since last update.

Ruby on RailsでGoogle Books APIを叩く

Last updated at Posted at 2020-02-29

動機

本のレビューサイト的なもの(厳密には違いますが、説明が楽なため)をポートフォリオとして作っています。

本の情報を取得はAPIで行うわけですが、本のAPIにも色々あります。
書籍検索APIは結局どれが一番いいのか

上の記事ではopenbdが勧められていますが、私はGoogle Books APIを使うことにしました。実装が比較的楽みたいです。(今のところ困っていません)
公式:
Google Books API - Google Developers

で、RubyでGoogle Books APIを叩いたドキュメントを探していて、しかし見つからなかったというのが、本記事を書くに至った動機になります。
Google Books APIとVue.jsを使ってシンプルなBook Finder appを作る
【Python3】Google Books APIを使ってみる
Google Books API からJSONデータを取得してjQueryで処理する

実装

本にはISBNという主キーのようなものがあります。
例: 9784839962227 => 現場で使える Ruby on Rails 5速習実践ガイド

例えば、Google Books APIではこのISBNを通じて、以下のようなJSONを得ることができます。
https://www.googleapis.com/books/v1/volumes?q=isbn:9784839962227

ruby 2.6.5

ISBNからJSONを返す

  def get_json_from_isbn(isbn)
    JSON.parse(Net::HTTP.get(URI.parse(
      "https://www.googleapis.com/books/v1/volumes?q=isbn:#{isbn}"
    )))
  end

インスタンス変数にJSON情報を入れる(例)

json = get_json_from_isbn(9784839962227)
@book = Book.new(
  author: json["items"][0]["volumeInfo"]["authors"][0],
  description: json["items"][0]["volumeInfo"]["description"],
  image_url: json["items"][0]["volumeInfo"],
  published_at: json["items"][0]["volumeInfo"]["publishedDate"],
  title: json["items"][0]["volumeInfo"]["title"],
)

JSONと見比べれば、本の情報を取得できていることが分かるかと思います。

なんでサーバーサイドのRubyでAPIを叩いたか?

  • Ruby以外よく分かってないためです
  • 本のISBNを送ってもらうだけにして、ユーザーにはその結果(本の情報)をいじってほしくなかったです。
  • Google Books APIには、本の検索に対するAPIもあります(まだ触ってませんが)。よって、サーバーサイドで叩く、で十分と判断しました。

あと初記事です:wink:

追記

本記事を書いておいてアレですが、ISBNで叩くのは良くなかったと思ってます。

以下が理由
1. ISBNがAPIの情報として入ってないことがある
2. ISBNが13桁でintegerが使えない(biginitを使うらしい)
3. 表記の仕方も色々ある(9784774142357とか、978-4-7741-4235-7とか)

特に1.が致命的で、主キーとしての機能が期待できないことになってしまいます。

Goole Books APIでは以下のようなIDが本ごとに用意されています
8rtiRwAACAAJ
扱いとしてはstringを使えばいいだけなので、比較的楽だと思います。

def url_from_id(googlebooksapi_id)
  "https://www.googleapis.com/books/v1/volumes/#{googlebooksapi_id}"
end

def get_json_from_url(url)
  JSON.parse(Net::HTTP.get(URI.parse(url)))
end

ついでに、urlを返すロジックとjsonを返すロジックをわけました。
こうすることで以下のような、検索を行うurlに対しても再利用できます。

def url_from_keyword(keyword)
  "https://www.googleapis.com/books/v1/volumes?q=#{keyword}&country=JP&maxResults=20"
end
3
7
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
3
7