楽天APIでタイトルから書籍情報(著者、出版社等)を取得する

#やりたいこと
タイトルを元に書籍情報を調べる
今回使うAPIはこれ → [楽天ブックス書籍検索API](https://webservice.rakuten.co.jp/api/booksbooksearch/)

#環境
+ 楽天ブックス書籍検索API
+ Visual Studio
+ C#

#API利用方法
##アプリIDを発行
楽天に登録後、アプリIDを発行してアプリIDをメモ。
![楽天apiinfo.PNG](https://qiita-image-store.s3.amazonaws.com/0/138354/a5a4d240-1e8c-8a2c-40a9-db14d0a48f0f.png)
##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を使う。
他にも著者名や、出版社を指定する方法もある。詳細は[こちら](https://webservice.rakuten.co.jp/api/booksbooksearch/)。
#ソースコード
##リクエスト
注意すべき点として、<b>リクエストは1秒に1回以下でないといけない。</b>[各APIの利用制限に関して](https://webservice.faq.rakuten.co.jp/app/answers/detail/a_id/14261/kw/%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E5%88%B6%E9%99%90)

```csharp:リクエスト

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(); //リクエストして格納。
```
##レスポンス
```csharp:レスポンス
Stream s = res.GetResponseStream(); //レスポンスのストリームを取得
StreamReader sr = new StreamReader(s);
string str = sr.ReadToEnd(); //ストリームの内容を全てstrに格納
```
NuGetが利用できる環境であれば、DynamicJsonを導入することによって、jsonを簡単に扱うことが出来る。

```csharp:DynamicJson
var jsonData = DynamicJson.Parse(str); //先にNuGetを利用してDynamicJsonを導入している必要がある
```
```json:レスポンスの中身の一部
{
  "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に値をセットして、その中から選ぶなどの方法がオススメ。

```csharp:書籍データ
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;`
を追加しておく必要がある。

```csharp:サンプル
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に値をセット
}
```
![listbox.PNG](https://qiita-image-store.s3.amazonaws.com/0/138354/990dbaf6-3754-85e4-255b-9069e901742e.png)