Copy of Google Book APIを使ってISBNコードから書籍情報を取得する

by May 2, 2018

筑木です。今回はWebAPIへのアクセスの例として、Google Books APIsを使ってISBNコードから書籍情報を取得してみます。

応用として、TCameraComponentとZXingを使って画像のバーコードから書籍のISBNコードを読み取り、Google Books APIsで書籍情報を取得、それをDBに登録して蔵書管理アプリみたいなものが作れます。

Google Books APIsにISBNコードを投げてその結果を取得するのは、TRESTRequest、TRESTClient、TRESTResponseを使えば非常に簡単です。
このようにフォームにUIであるTEdit,TLabel,TMemo,TImageと、Google Books APIsとやりとりをするためのTRESTRequest、TRESTClient、TRESTResponse、TIdHTTPを配置します。

配置したTRESTRequestのClientとResponseプロパティにそれぞれTRESTClient、TRESTResponseを設定します。

実際にAPIを呼び出してみましょう。TRESTRequestとTRESTClientにパラメータを設定し、Executeメソッドを呼ぶだけです。

procedure TForm1.Button1Click(Sender: TObject);
begin
  RESTRequest1.ResetToDefaults;
  RESTClient1.ResetToDefaults;
  RESTResponse1.ResetToDefaults;

  RESTClient1.BaseURL := 'https://www.googleapis.com/';
  RESTRequest1.Resource := 'books/v1/volumes?q=isbn:{ISBN}';
  RESTRequest1.Params.AddItem('ISBN', Edit1.Text, TRESTRequestParameterKind.pkURLSEGMENT);
  RESTRequest1.Execute;
end;

APIの詳細は以下のURLを参照してください。今回は単純にパラメータとしてISBNコードを渡すだけです。

https://developers.google.com/books/docs/v1/reference/

RESTRequestのAfterExecuteイベントが発生すると結果が取得できますので、戻ってきたJSONをパースします。
JSONの書式は以下のURLを参照してください。
https://developers.google.com/books/docs/v1/reference/volumes

procedure TForm1.RESTRequest1AfterExecute(Sender: TCustomRESTRequest);
var
  BookInfo : TJSONValue;
  BookItems : TJSONArray;
  Authors : TJSONArray;
  ThumbnailURL : string;
  ItemCount : integer;
  i : Integer;
  ImageStream : TMemoryStream;
begin
  BookInfo := RESTResponse1.JSONValue;

  // 項目をクリア
  Edit2.Text := '';
  Edit3.Text := '';
  Memo1.Text := '';
  Edit4.Text := '';
  Image1.Bitmap.Clear(claWhite);

  // アイテム数取得
  ItemCount := BookInfo.GetValue('totalItems');

  if ItemCount > 0 then
  begin
    // 結果をパースする。
    BookItems := BookInfo.GetValue('items');
    with BookItems.Items[0] do
    begin
      // 題名
      Edit2.Text := GetValue('volumeInfo.title');

      // 副題
      Edit3.Text := GetValue('volumeInfo.subtitle');

      // 著者
      Authors := GetValue('volumeInfo.authors');
      for I := 0 to Authors.Count - 1 do
      begin
        Memo1.Lines.Add(Authors.Items[i].GetValue());
      end;

      // 出版日
      Edit4.Text := GetValue('volumeInfo.publishedDate');

      // 書影のサムネイル
      ThumbnailURL := GetValue('volumeInfo.imageLinks.thumbnail');
      ImageStream := TMemoryStream.Create;
      IdHTTP1.Get(ThumbnailURL, ImageStream);
      Image1.Bitmap.LoadFromStream(ImageStream);
    end;
  end;
end;

書影のサムネイルはTIdHTTPを使って改めて取得します。結果はTMemoryStreamに保存してTImageに設定するだけです。

クラウド系のサービスはリクエスト結果がJSONで帰ってくることが多いのですが、Delphi/C++Builderのコンポーネントを使えば簡単に結果のパースが可能です。古いDelphiやC++BuilderのバージョンではJSONなどのパースも自前で行うか、フリーのライブラリを使う必要がありますが、最新のバージョンでは手軽にWeb サービスを利用できるようになっています。

2018年4月23日~5月4日までの月~金曜に毎日ブログを更新。Delphi / C++Builderに関する技術記事からエンジニアの日常まで、さまざまな話題を投稿します。お楽しみに!

日本人スタッフブログを一覧表示できる、こちらのページをブックマークしてください。