やりたいこと
タイトルを元に書籍情報を調べる
今回使うAPIはこれ → 楽天ブックス書籍検索API
環境
- 楽天ブックス書籍検索API
- Visual Studio
- C#
API利用方法
アプリIDを発行
API用URL
https://app.rakuten.co.jp/services/api/BooksBook/Search/20130522?
applicationId=[アプリID]
&title=%E5%A4%AA%E9%99%BD
&format=json
[アプリID]にはさきほど取得してメモしたものを入れ、タイトルはURLエンコードしたものを指定する。
返却形式はjsonとxmlがあったが、今回はjsonを使う。
他にも著者名や、出版社を指定する方法もある。詳細はこちら。
ソースコード
リクエスト
注意すべき点として、リクエストは1秒に1回以下でないといけない。各APIの利用制限に関して
リクエスト
const string REQUEST_URL = "https://app.rakuten.co.jp/services/api/BooksBook/Search/20130522?";
const string APPLICATION_ID = ""; //ここにアプリIDを指定
string title = "もやしもん"; //書籍のタイトル
string requstUrl = REQUEST_URL
+ "&format=json" //フォーマットの指定
+ "&applicationId=" + APPLICATION_ID
+ "&title=" + HttpUtility.UrlEncode(title); //書籍タイトルをURLエンコードして指定
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requstUrl);
req.Method = "GET"; //メソッドの形式
HttpWebResponse res = (HttpWebResponse)req.GetResponse(); //リクエストして格納。
レスポンス
レスポンス
Stream s = res.GetResponseStream(); //レスポンスのストリームを取得
StreamReader sr = new StreamReader(s);
string str = sr.ReadToEnd(); //ストリームの内容を全てstrに格納
NuGetが利用できる環境であれば、DynamicJsonを導入することによって、jsonを簡単に扱うことが出来る。
DynamicJson
var jsonData = DynamicJson.Parse(str); //先にNuGetを利用してDynamicJsonを導入している必要がある
レスポンスの中身の一部
{
"count": 14,
"page": 1,
"first": 1,
"last": 14,
"hits": 14,
"carrier": 0,
"pageCount": 1,
"Items": [
{
"Item": {
"title": "もやしもん(11)",
"titleKana": "モヤシモン",
"subTitle": "",
"subTitleKana": "テイルズ オブ アグリカルチャー",
"seriesName": "イブニングKC",
"seriesNameKana": "イブニング ケイシー",
"contents": "",
"author": "石川雅之",
"authorKana": "イシカワ,マサユキ",
"publisherName": "講談社",
"size": "コミック",
"isbn": "9784063524086",
"itemCaption": "",
"salesDate": "2012年03月",
"itemPrice": 586,
"listPrice": 0,
"discountRate": 0,
"discountPrice": 0,
"itemUrl": "http://books.rakuten.co.jp/rb/11536505/",
"affiliateUrl": "",
"smallImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4086/9784063524086.jpg?_ex=64x64",
"mediumImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4086/9784063524086.jpg?_ex=120x120",
"largeImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4086/9784063524086.jpg?_ex=200x200",
"chirayomiUrl": "",
"availability": "1",
"postageFlag": 0,
"limitedFlag": 0,
"reviewCount": 71,
"reviewAverage": "4.14",
"booksGenreId": "001001003021"
}
},
{
"Item": {
"title": "もやしもん(12)",
"titleKana": "モヤシモン",
"subTitle": "TALES OF AGRICULTURE",
"subTitleKana": "テイルズ オブ アグリカルチャー",
"seriesName": "イブニングKC",
"seriesNameKana": "イブニング ケイシー",
"contents": "",
"author": "石川雅之",
"authorKana": "イシカワ,マサユキ",
"publisherName": "講談社",
"size": "コミック",
"isbn": "9784063524567",
"itemCaption": "",
"salesDate": "2013年04月",
"itemPrice": 606,
"listPrice": 0,
"discountRate": 0,
"discountPrice": 0,
"itemUrl": "http://books.rakuten.co.jp/rb/12235169/",
"affiliateUrl": "",
"smallImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4567/9784063524567.jpg?_ex=64x64",
"mediumImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4567/9784063524567.jpg?_ex=120x120",
"largeImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4567/9784063524567.jpg?_ex=200x200",
"chirayomiUrl": "",
"availability": "1",
"postageFlag": 0,
"limitedFlag": 0,
"reviewCount": 40,
"reviewAverage": "4.4",
"booksGenreId": "001001003021"
}
},
{
"Item": {
"title": "もやしもん(13)",
"titleKana": "モヤシモン",
"subTitle": "TALES OF AGRICULTURE",
"subTitleKana": "テイルズ オブ アグリカルチャー",
"seriesName": "モーニングKC",
"seriesNameKana": "モーニング ケイシー",
"contents": "",
"author": "石川雅之",
"authorKana": "イシカワ,マサユキ",
"publisherName": "講談社",
"size": "コミック",
"isbn": "9784063883060",
"itemCaption": "",
"salesDate": "2014年03月20日",
"itemPrice": 606,
"listPrice": 0,
"discountRate": 0,
"discountPrice": 0,
"itemUrl": "http://books.rakuten.co.jp/rb/12686581/",
"affiliateUrl": "",
"smallImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3060/9784063883060.jpg?_ex=64x64",
"mediumImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3060/9784063883060.jpg?_ex=120x120",
"largeImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3060/9784063883060.jpg?_ex=200x200",
"chirayomiUrl": "",
"availability": "1",
"postageFlag": 0,
"limitedFlag": 0,
"reviewCount": 20,
"reviewAverage": "4.55",
"booksGenreId": "001001003004"
}
},
//---以下略---
jsonを見ての通り、書籍データはItems>itemにある。
同じ書籍でも巻によっては著者や出版社のデータ内容が違うことがあるから、ある程度回して取り出したほうがいい。
FormのListBoxに値をセットして、その中から選ぶなどの方法がオススメ。
書籍データ
var books = jsonData.Items;
foreach (var book in books) {
Console.WriteLine("タイトル:" + book.Item.title);
Console.WriteLine("著者名:" + book.Item.author);
Console.WriteLine("出版社:" + book.Item.publisherName);
}
ListBoxを使ったサンプル
デザイナーは省略。
StrConvはVB.NETの関数。
using Microsoft.VisualBasic;
を追加しておく必要がある。
サンプル
var books = jsonData.Items;
titleList.Items.Add(title); //タイトルのListBoxに値をセット
foreach (var book in books) {
string titleKana = Strings.StrConv(book.Item.titleKana, VbStrConv.Hiragana, 0); //タイトルかなを平仮名に
string author = book.Item.author;
string authorKana = Strings.StrConv(book.Item.titleKana, VbStrConv.Hiragana, 0); //著者かなを平仮名に
string publisherName = book.Item.publisherName;
titleKanaList.Items.Add(titleKana); //タイトルかなのListBoxに値をセット
authorList.Items.Add(author); //著者のListBoxに値をセット
authorKanaList.Items.Add(authorKana); //著者かなのListBoxに値をセット
publisherList.Items.Add(publisherName); //出版社のListBoxに値をセット
}