Author: Shinji Chikugi
筑木です。今回は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メソッドを呼ぶだけです。
1 2 3 4 5 6 7 8 9 10 11 12 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
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<Integer>('totalItems'); if ItemCount > 0 then begin // 結果をパースする。 BookItems := BookInfo.GetValue<TJSONArray>('items'); with BookItems.Items[0] do begin // 題名 Edit2.Text := GetValue<String>('volumeInfo.title'); // 副題 Edit3.Text := GetValue<String>('volumeInfo.subtitle'); // 著者 Authors := GetValue<TJSONArray>('volumeInfo.authors'); for I := 0 to Authors.Count - 1 do begin Memo1.Lines.Add(Authors.Items[i].GetValue<String>()); end; // 出版日 Edit4.Text := GetValue<String>('volumeInfo.publishedDate'); // 書影のサムネイル ThumbnailURL := GetValue<String>('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 サービスを利用できるようになっています。
サンプルコードをGitHubにアップしました。https://github.com/schikugi/GoogleBooksAPIDel
参考にしてください。
2018年4月23日~5月4日までの月~金曜に毎日ブログを更新。Delphi / C++Builderに関する技術記事からエンジニアの日常まで、さまざまな話題を投稿します。お楽しみに! 日本人スタッフブログを一覧表示できる、こちらのページをブックマークしてください。 |
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition