Yahoo!ショッピングWeb APIを使ってみた

# はじめに

初めて「API」というものに触れたので記事にまとめてみようと思います！

ちなみにFlutterも初心者なのでそこは温かい目で見てください…

# Yahoo!ショッピングWeb APIを使えるようにするには

## Yahoo!デベロッパーネットワークにアクセスする

サイトのリンク↓
https://developer.yahoo.co.jp/

開いたサイトの画像↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/06acbb07-11c6-4ad4-a145-4af01408a7da.png)


## Yahoo!ショッピングWeb APIのサイトに飛ぶ

上部の「テクノロジー」タブ内の「APIドキュメント」ページに飛び、「ショッピング」を選択する

タブ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/cfa47a23-1c44-3e58-c633-b13af4559356.png)

「テクノロジー」タブを開いた↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/bdfcb198-e84b-a951-9fd0-90cd43b7a7e9.png)

「APIドキュメント」がある場所↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/fd2670cc-d68e-e949-02f1-cd54a0d5ab8a.png)

「APIドキュメント」を開いた後↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/523c24ca-116f-e75f-b673-a507d54c40d5.png)

「ショッピング」の見た目↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/17e9971e-893c-759b-4fdf-431664b23120.png)

「ショッピング」を押した後↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/472de5e8-e105-0da1-0bf6-a99944aa66cf.png)

ここでYahoo IDにログインしておくといいかもしれないです

## アプリケーションを登録する

「アプリケーションの管理」タブを押し「新しいアプリケーションを開発」ボタンを押す

タブ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/ed189d20-9936-6e65-7271-c5d9ed09029f.png)

「アプリケーションの管理」タブを押した↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/dbc389cc-4fb8-1807-ad00-4f2ecfc0cfb9.png)

「新しいアプリケーションを開発」ボタン↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/2ec8d249-82a0-251f-02a3-5af1ada334ee.png)

「新しいアプリケーションを開発」ボタンを押した後↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/bec04328-6aa2-5841-6158-a4e94272de18.png)

作る物に沿って情報を入力します

登録した後に表示される「Client ID」は後で利用するのでどこかにメモしておくと楽です

**これでYahoo!ショッピングWeb APIが使えるようになった**


# APIを使って作ったもの

## アプリの概要

**収録曲検索アプリ(search_song_contents)**

＜CDのJANコードをスキャンするとCDのタイトルと詳細を表示するアプリ＞

git hub : https://github.com/sato-na/search_song_contents

アプリの詳しい概要は[はてなブログ](https://sato-na.hatenablog.com/entry/2021/02/17/172606)で

## ステップ１：HTTPにリクエストできるようにする

今回は説明を省略します

制作の時に参考にさせていただいた記事は下記のものです（ありがとうございます<(_ _)>）

https://nzigen.com/flutter-reference/2018-04-19-http.html

## ステップ２：バーコードスキャナを使えるようにする

JANコードから商品を検索したいのでバーコードスキャナを使えるようにします

今回は説明を省略します

制作の時に参考にさせていただいた記事は下記のものです（ありがとうございます<(_ _)>）

https://pub.dev/packages/flutter_barcode_scanner

受け取ったJANコードをString型でbarcodeScanResという変数に入っているとします

## ステップ２：リクエストするurlを指定する

公式の使い方は↓
https://developer.yahoo.co.jp/webapi/shopping/shopping/v3/itemsearch.html

基本は

```
https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch?appid=<Client ID>
```

「Client ID」はアプリケーションを登録したときにメモしたものです

※もしメモしていなかったら

1. 「Yahoo!ショッピングWeb APIを使えるようにするには」の「Yahoo!ショッピングWeb APIのサイトに飛ぶ」までの工程を行う
2. 登録したアプリを選択する
↓のアプリ名を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/b0ed5649-d247-8b34-7326-3eaac889c229.png)
3. 「Client ID」が表示される
選択後の画面↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/1cd0b35b-bbd9-0fd1-bdf6-e9181a8155ec.png)

この基本のurlに条件を追加していきます

今回追加したい条件は

- お店
- JANコード

です

※お店を指定した理由
　詳細を表示したときに収録曲を見えるようにしたかったのですが、
　見えるお店と見えないお店があったので比較的見えるお店を選びたかったからです。

### お店の指定の仕方

お店にはseller_idというのが振り分けられています

指定したいお店のトップページを開くとurlが

```
https://store.shopping.yahoo.co.jp/<shop_id>/
```

もしくは

```
https://paypaymall.yahoo.co.jp/store/<shop_id>/top/
```

という風になっています

ここから指定したいお店のshop_idを見つけます

urlには

```
https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch?appid=<Client ID>&shop_id=<shop_id>
```

という風に最後にshop_idを指定します

ちなみにこのまま実行するとお店のトップページでキーワードに何も入れずに検索した結果が出ます

### JANコードの指定の仕方

JANコードはお店の指定のときと記述方法はほぼ同じです

しかし、プログラム上では変数で渡すので↓のようになります

```
https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch?appid=<Client ID>&jan_code=${barcodeScanRes}
```

これを実行するとそのJANコードでヒットしたものが一覧になります

よってまとめると

```
https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch?appid=<Client ID>&shop_id=<shop_id>&jan_code=${barcodeScanRes}
```

となります

## ステップ３：必要な情報を取ってくる

今回取ってくる情報は

- CDのタイトル
- 詳細

です

そもそも先ほど作ったurlを実行するとどんな風になるかというと

```json
{
  "totalResultsAvailable": a(int),
  "totalResultsReturned": b(int),
  "firstResultsPosition": c(int),
  "request": {
  "query": d(String)
  },
  "hits": [
    {
      "index": 1,
      "name": e(String),
      "description": f(String),
      "headLine": g(String),
      "url": h(url),
      "inStock": i(bool),
      "code": j(String),
      "condition": k(String),
      "imageId": l(String),
      "image": {
        "small": m(String),
        "medium": n(String)
      },
      "seller": {
        "sellerId": <seller_id>,
        "name": o(String),
        "url": p(url),
        "isBestSeller": q(bool),
        "isPMallSeller": r(bool),
        "payment": s(String),
        "review": {
          "rate": t(int),
          "count": u(int)
        },
        "imageId": v(String)
      },
    }
  ]
}
```

ここでさっき指定したseller_idも見ることができます

ココからはこのデータがMap型のdataという変数に入っているとします

### CDのタイトルの取り出し方

CDのタイトルは"hits"の中の0番目の要素の"name"という項目に入っています

したがってこのように取り出すことができます

``` :main.dart
// "data"中の"hits"の中身をList型のhitsという変数に入れる
List<dynamic> hits = data["hits"];

// "hits"中の0番目の要素の"name"をString型のnameという変数に入れる
name = hits[0]["name"];
```

これでCDのタイトルがnameという変数に格納されました

### 詳細の取り出し方

詳細は"hits"の中の0番目の要素の"description"という項目に入っています

したがってこのように取り出すことができます

``` :main.dart
// "data"中の"hits"の中身をList型のhitsという変数に入れる
// CDのタイトルをすでに取ってきている場合はこの文はいらない
List<dynamic> hits = data["hits"];

// "hits"中の0番目の要素の"name"をString型のdescriptionという変数に入れる
description = hits[0]["description"];
```

これで詳細がdescriptionという変数に格納されました

**よってAPIを通してアプリに必要な情報を得ることができた**

## アプリの画像

起動時↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/fdc36a15-d4f9-12ea-654c-b65414841762.png)

カメラ起動時（右下のボタンを押した後）↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/5cbc4a44-c6f3-d30c-e7cc-587225b02fde.png)

バーコードを読み取った後↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/3570a846-071d-231d-c6c4-97ed16ac6cc1.png)

検索結果がなかった時↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530073/48732d85-f904-b82e-8ad6-c3ff365c29bc.png)

# まとめ

ということでAPIの使い方についてまとめてみました

自分なりに細かく書いたので、わかりやすいと思ってもらったらうれしいです

（というのは建前で、
本当は自分で見直したときにこのくらい残しておかないと忘れてしまうからです…）