動機
本のレビューサイト的なもの(厳密には違いますが、説明が楽なため)をポートフォリオとして作っています。
本の情報を取得は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もあります(まだ触ってませんが)。よって、サーバーサイドで叩く、で十分と判断しました。
あと初記事です
追記
本記事を書いておいてアレですが、ISBNで叩くのは良くなかったと思ってます。
以下が理由
- ISBNがAPIの情報として入ってないことがある
- ISBNが13桁でintegerが使えない(biginitを使うらしい)
- 表記の仕方も色々ある(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