LoginSignup
24
19

More than 5 years have passed since last update.

openBDのAPIライブラリをGoでつくりました

Posted at

openBDは2017年1月に開始された日本の書籍データを提供するAPIサービスです。

公式サイトで

私たちopenBDプロジェクト(カーリル・版元ドットコム)は書誌情報・書影を、だれでも自由に使える、高速なAPIで提供します。

と謳っている通り、登録不要で高速なレスポンスをJSON形式で返す、便利で使いやすいサービスとなっています。

これまで日本では、書籍データを網羅的かつ利用可能な形で取得できるサービスは実質AmazonのProduct Advertising API(と網羅性は劣りますが版元ドットコム)くらいしかなかったので非常に画期的なAPIといえます。個人的に期待大です。

そこでこのAPIにGoで利用するためのライブラリを作りました。

openBD APIの概要

1冊分の情報を取得する

/get?isbn=ISBN

  • ISBNはISBN10、13、ハイフン区切り、ハイフンなしに対応

複数冊の情報を取得する

/get?isbn=ISBN,ISBN

  • ISBNをカンマ区切りで記述
  • 1000冊まで指定可

その他、収録範囲すべてのISBNコードを取得するcoverage APIやJSONスキーマを取得するAPI、一万冊までのリクエストに対応するPOSTリクエストなどありますが自分の中で需要がないのでライブラリには実装していません。

その他API仕様の参考

レスポンスデータ仕様
OpenBD 書誌APIデータ仕様 (v1)

公式サイト->配布資料からアクセスできるpdf
openBDの概要、参加出版社、そして最後のページにクライアント側からのAPI利用方法が載っています。
https://openbd.jp/pdf/openBD_doc_20170123.pdf

使い方

o := openbd.New()

// 一冊の情報を取得
book, err := o.Get("477418392X")
if err != nil {
    ...
}
book.GetISBN() // 477418392X

// 複数冊の情報を取得 1000冊まで可
isbns := []string{"9780061234002", "9780071123419"}
books, err := o.GetBooks(isbns)
if err != nil {
    ...
}
for _, book := range *books {
    if !book.IsValidData() {
        // ISBNコードの一致するデータがなかった
    }
}

ISBNコードやタイトルなど基本的なプロパティにはGetterを作っています。
自分の需要の範囲で作っているので他のが必要な場合はプルリクかフォークでお願いします。

その他注意点など

書籍によってプロパティの有無が異なる

APIデータ仕様をみても分かる通り、かなりプロパティの数が多いです。これはおそらく版元ドットコムがもともと持っていたデータやその他データ提供社のデータ仕様を統合して最小公倍数的に提供するためだと思います。
そのためAPIデータ仕様にあるプロパティが欠けている(JSONレスポンス自体に存在しない)場合がよくあります。書籍データを取得した後に実際に目的のデータがあるかどうかは見てみないとわかりません。

structが完全でないかも

API仕様書や実際のデータをもとにBook structを作っていますがプロパティの数が多いので抜け漏れあるかもしれません。テストで500冊弱のマッピングを通しているので大抵の本はいけるつもりですが、もしも失敗する書籍データがあれば教えてほしいです。

ISBNのチェックについて

OpenBD.GetおよびGetBooksの中では渡されたISBNコードの妥当性をチェックしていません。
ISBNチェックのユーティリティを作っているのでもし必要な場合はぜひ使ってください。

24
19
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
24
19