はじめに
昨日行った作業を振り返り、進捗と発見した課題について整理しました。本記事では、Google Books APIを活用して書籍情報を取得するアプリケーションをGo言語で構築する中での進捗、問題点、および解決策の概要を報告します。また、次回以降に取り組むべき課題についても触れています。
昨日の進捗
以下の内容を完了しました:
- プロジェクトの初期設定
- Go言語でのプロジェクト構造を作成。
- 必要なディレクトリやファイルを整理し、基本的な構成を決定。
- Google Books APIs の連携
- 書籍情報(タイトル、著者、出版社、カテゴリーなど)を取得するプログラムを実装。
- 動作確認
- テストデータを用いてAPIのレスポンスを確認し、基本的な情報取得が機能することを確認。
プロジェクトのディレクトリ構成
以下のようなディレクトリ構造でプロジェクトを構築しました。この構成により、コードの可読性と保守性を向上させています。
BookReview/
├── cmd/
│ └── main.go // エントリーポイント
├── internal/
│ ├── models/ // 書籍情報のデータモデル
│ ├── services/ // ISBN検索API呼び出しロジック
│ └── handlers/ // HTTPハンドラー
├── templates/ // HTMLテンプレート
├── static/ // 静的ファイル
└── config/ // 環境設定ファイル
ISBN番号、Google Books APIs 、 Go言語を使った表示例
Google Books APIs を使った最小限のロジック
以下に、GoでGoogle Books APIを使用して書籍情報を取得する最小限のサンプルコードを示します。この例では、特定のISBN番号に基づいて書籍情報を取得します。
ここに示す例は今回実装したコードではありません。
package main
import (
"encoding/json"
"fmt"
"net/http"
)
func main() {
// Google Books API エンドポイント
apiURL := "https://www.googleapis.com/books/v1/volumes?q=isbn:9781449331818"
// HTTPリクエストを送信
resp, err := http.Get(apiURL)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
// レスポンスのデコード
var result map[string]interface{}
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
fmt.Println("Error decoding JSON:", err)
return
}
// 必要な情報を表示(最初の結果のみ)
if items, ok := result["items"].([]interface{}); ok && len(items) > 0 {
volumeInfo := items[0].(map[string]interface{})["volumeInfo"].(map[string]interface{})
fmt.Println("Title:", volumeInfo["title"])
fmt.Println("Authors:", volumeInfo["authors"])
} else {
fmt.Println("No results found.")
}
}
実行手順
- このコードをローカル環境に保存します(例:
main.go
)。 - 必要に応じてGoをインストールして環境を設定します。
- ターミナルでコードをコンパイル&実行します:
go run main.go
ポイント
- ISBN指定: URLパラメータ
q=isbn:ISBN番号
を使っています。 - 最小限のロジック: エラー処理や高度な解析は省き、基本的な取得と表示に焦点を当てています。
Google Books APIs の基本仕様
Google Books API: ISBNで書籍情報を取得する仕様
Google Books API は、特定のISBN番号をクエリパラメータとして指定することで書籍情報を取得できます。
基本URL
https://www.googleapis.com/books/v1/volumes
リクエストパラメータ
q
: 検索クエリ。ISBN番号を指定する際はisbn:ISBN番号
の形式で指定します。- 例:
q=isbn:9781449331818
- 例:
サンプルリクエストURL
https://www.googleapis.com/books/v1/volumes?q=isbn:9781449331818
レスポンス例
レスポンスはJSON形式で返されます。一部抜粋したサンプルレスポンスは以下の通りです。
{
"kind": "books#volumes",
"totalItems": 1,
"items": [
{
"volumeInfo": {
"title": "Learning JavaScript Design Patterns",
"authors": ["Addy Osmani"],
"publisher": "O'Reilly Media",
"publishedDate": "2012-08-30",
"description": "A book description.",
"industryIdentifiers": [
{
"type": "ISBN_10",
"identifier": "1449331815"
},
{
"type": "ISBN_13",
"identifier": "9781449331818"
}
],
"pageCount": 254,
"language": "en",
"previewLink": "http://books.google.com/..."
}
}
]
}
必要な情報の取り出し
レスポンスJSONから以下の情報を取り出すには、対応するキーを下記のように利用します。
- タイトル:
items[0].volumeInfo.title
- 著者名:
items[0].volumeInfo.authors
- 出版社名:
items[0].volumeInfo.publisher
- 出版日:
items[0].volumeInfo.publishedDate
制限事項と注意点
- APIキー: 一部のリクエストにはGoogle Cloud Consoleで取得できるAPIキーが必要になる場合があります。
- エラー処理: 不正なISBNやネットワークエラーへの対応が必要です。
- 利用制限: APIには日単位の利用制限があります。
進行中の課題と仮説
問題1: Google Books API のレスポンスにおける「publisher」フィールドの欠落
- 現象: テストした6冊のデータのうち、すべての書籍で「出版社名」が取得できませんでした。
↓
「15冊分のISBN番号でテストした結果、出版社情報も正しく表示されることを確認しました。一方で、Google Books APIでは出版社名やカテゴリー情報が少ない傾向があることが分かりました。 - 仮説: APIレスポンスに
publisher
フィールドが含まれない書籍が多い可能性。 - 対策案:
- 他の書籍で再テストを行い、再現性を確認。
- デフォルト値を設け、ユーザーが手動で補完できる仕組みを検討。
- 複数のAPIを併用する
問題2: 詳細なエラーハンドリングの不足
- 現象: APIリクエストの失敗や不完全なレスポンスに対する処理が未実装。
- 対策案:
- 各種エラーパターンに対応したハンドリングを追加。
- ログ出力を強化してデバッグを容易にする。
感想と成功点
- 成功点:
- プロジェクト構造を整理し、後の拡張を考慮した設計を実現。
- Google Books APIの基本的な利用方法を習得し、データ取得が可能になった。
- 課題:
- レスポンスに欠落データが多い場合の対策が必要。
- ISBNコードの読み取り機能や詳細エラー処理の実装がまだ不足している。
今後の予定
- Google Books API のレスポンス解析:
- 欠落データの原因を特定し、対応策を検討する。
- 「出版社名」取得の代替案を考える。
- エラーハンドリングの改善:
- リクエストエラーや不完全なレスポンスに対応するロジックを追加。
- 次のステップ:
- カメラでISBNコードを読み取る機能のプロトタイプ作成。
- 書籍情報をローカルデータベースに保存する仕組みの構築。
- 書影画像がない場合にデフォルト画像を表示する処理の改善。
おわりに
今回はプロジェクトの進捗を中心に振り返りました。課題がいくつか見つかりましたが、これらを解決しながら、Go言語とアジャイル開発の学びを深めていきたいと思います。次回以降、より詳細な実装例や学びのポイントを共有していきますので、ご期待ください!