2日目:Go言語プロジェクトの初期設計とGoogle Books APIで直面した問題

Go言語プロジェクトの初期設計とGoogle Books APIで直面した問題

はじめに

昨日行った作業を振り返り、進捗と発見した課題について整理しました。本記事では、Google Books APIを活用して書籍情報を取得するアプリケーションをGo言語で構築する中での進捗、問題点、および解決策の概要を報告します。また、次回以降に取り組むべき課題についても触れています。

昨日の進捗

以下の内容を完了しました:

  1. プロジェクトの初期設定
    • Go言語でのプロジェクト構造を作成。
    • 必要なディレクトリやファイルを整理し、基本的な構成を決定。
  2. Google Books APIs の連携
    • 書籍情報(タイトル、著者、出版社、カテゴリーなど)を取得するプログラムを実装。
  3. 動作確認
    • テストデータを用いて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.")
	}
}

実行手順

  1. このコードをローカル環境に保存します(例: main.go)。
  2. 必要に応じてGoをインストールして環境を設定します。
  3. ターミナルでコードをコンパイル&実行します: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

制限事項と注意点

  1. APIキー: 一部のリクエストにはGoogle Cloud Consoleで取得できるAPIキーが必要になる場合があります。
  2. エラー処理: 不正なISBNやネットワークエラーへの対応が必要です。
  3. 利用制限: APIには日単位の利用制限があります。

進行中の課題と仮説

問題1: Google Books API のレスポンスにおける「publisher」フィールドの欠落

  • 現象: テストした6冊のデータのうち、すべての書籍で「出版社名」が取得できませんでした。

    「15冊分のISBN番号でテストした結果、出版社情報も正しく表示されることを確認しました。一方で、Google Books APIでは出版社名やカテゴリー情報が少ない傾向があることが分かりました。
  • 仮説: APIレスポンスに publisher フィールドが含まれない書籍が多い可能性。
  • 対策案:
    1. 他の書籍で再テストを行い、再現性を確認。
    2. デフォルト値を設け、ユーザーが手動で補完できる仕組みを検討。
    3. 複数のAPIを併用する

問題2: 詳細なエラーハンドリングの不足

  • 現象: APIリクエストの失敗や不完全なレスポンスに対する処理が未実装。
  • 対策案:
    • 各種エラーパターンに対応したハンドリングを追加。
    • ログ出力を強化してデバッグを容易にする。

感想と成功点

  • 成功点:
    • プロジェクト構造を整理し、後の拡張を考慮した設計を実現。
    • Google Books APIの基本的な利用方法を習得し、データ取得が可能になった。
  • 課題:
    • レスポンスに欠落データが多い場合の対策が必要。
    • ISBNコードの読み取り機能や詳細エラー処理の実装がまだ不足している。

今後の予定

  1. Google Books API のレスポンス解析:
    • 欠落データの原因を特定し、対応策を検討する。
    • 「出版社名」取得の代替案を考える。
  2. エラーハンドリングの改善:
    • リクエストエラーや不完全なレスポンスに対応するロジックを追加。
  3. 次のステップ:
    • カメラでISBNコードを読み取る機能のプロトタイプ作成。
    • 書籍情報をローカルデータベースに保存する仕組みの構築。
    • 書影画像がない場合にデフォルト画像を表示する処理の改善。

おわりに

今回はプロジェクトの進捗を中心に振り返りました。課題がいくつか見つかりましたが、これらを解決しながら、Go言語とアジャイル開発の学びを深めていきたいと思います。次回以降、より詳細な実装例や学びのポイントを共有していきますので、ご期待ください!

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です