前置き
楽天商品検索APIを使ってみます💫
登録してアプリIDを発行するだけで
すぐに商品情報が取得できます✨
商品は完全に見た目の可愛さで選びました❤️笑
(見るだけならタダだし…)
参考: https://qiita.com/mgr/items/f2193fd21765be1d34c2
登録
Rakuten Developersに登録
アプリIDを発行するだけです🌟
1分で終わります😁笑
規約はこちら
楽天ウェブサービス規約
普通に登録して個人的に使う分には
特別注意する問題はないですね💡
使い方
APIテストフォーム
テストを用意してくれているので
すぐに確認ができます✨🙆♀️
パタメータを入力し、
GETを押してItems
が表示されればOKです!
リクエストURLとパラメータ
テストで表示されるURLの仕組みはこちらです。
ベースとなるリクエストURLに
パラメータを追加しています。
1 |
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?[parameter]=[value]… |
parameter
設定必須のパラメーター
🌟アプリID(applicationId)
🌟検索キーワード、ジャンルID、商品コード、ショップコードのいずれか
これらのパラメーターを
先頭に&をつけて連結させます。
検索キーワード(keyword)と
ソート(sort)はvalue
の分類で、
ここのみエンコードが必要みたいですね💡
例
キーワードは「ピンク」
ショップは「tiarassic」
にしてみました。format
はデフォルトのjson
が入っています。
1 |
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?format=json&keyword=[エンコードされたキーワード]&shopCode=lassic&applicationId=[自分のアプリのID]' |
ショップコード
URLには2種類ありますが、
どちらのパターンでも
***の部分がショップコードです。
「http://www.rakuten.ne.jp/gold/***/」
「http://www.rakuten.co.jp/***/」
コード
まずはconsoleで表示
まずはURLのみで
情報の取得がきちんとできるか確認します。
出力パラメータのmediumImageUrls
などが
あるので大丈夫そうですね✨🙆♀️
非同期通信、API通信については
こちらをご覧ください👀
【Nuxt.js】Nuxt文法編:asyncData
【Nuxt.js】axios導入編:かんたん・お手軽API通信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<template> <div class="page"> </div> </template> <script> import axios from 'axios' export default { data () { return { } }, async asyncData() { const baseUrl = 'テストで作成したURLを入れてください' axios.get(baseUrl) .then((res) => console.log(res)) } } </script> <style lang="scss" scoped> </style> |
await
をすっかり忘れていました😀笑async
/await
でセット、await
がPromise
にあたる部分でしたね。
次で追加しましょう✍️
テンプレートで表示
とりあえず表示ができることが
確認できたので、
次は画像やタイトルなどを
見やすく調整していきましょう♪
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 |
<template> <div class="page"> <ul> <li v-for="result in results" :key="result.id" > {{ result }} </li> </ul> </div> </template> <script> import axios from 'axios' export default { data () { return { results: [], } }, async asyncData() { const baseUrl = 'テストで作成したURLを入れてください' const res = await axios.get(baseUrl) return { results: res } }, } </script> <style lang="scss" scoped> </style> |
ちなみにasyncData部分を
こうするとエラーです。
この辺はまた別記事にて。
Error
TypeError: Cannot set property 'results' of undefined
1 2 3 4 5 |
async asyncData() { const baseUrl = 'テストで作成したURLを入れてください' await axios.get(baseUrl) .then((res) => this.results = res) }, |
1 2 3 4 5 6 7 8 |
async asyncData() { const baseUrl = 'テストで作成したURLを入れてください' await axios.get(baseUrl) .then((res) => { this.results = res }) .catch((error) => { console.log(error) }) }, |
見やすく調整①
まずはitemName
だけ表示させてみます🍒
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 |
<template> <div class="page"> <ul> <li v-for="result in results" :key="result.id"> {{ result.Item.itemName }} </li> </ul> </div> </template> <script> import axios from 'axios' export default { data () { return { results: [], } }, async asyncData () { const baseUrl = 'テストで作成したURLを入れてください' const res = await axios.get(baseUrl) return { results: res.data.Items } }, } </script> |
データの加工について
私は最初に勘違いをしていて
consoleでres
のみを表示していた時は{ "Items": [{ "Item": { "itemName": "商品名" }}, { "Item": {"itemName": "商品名" }} ]}
となっていたのでres.Items
としていましたが、
本来はdataの中のItemsなので…data: { "Items": [{ "Item": {"itemName": "商品名"
}}, { "Item": {"itemName": "商品名"
}} ]}
res.data
にしなければ
いけないみたいですね🤔💭
ただ参考にさせていただいた記事ではres.Items
で表示できていたのでformat
によってできるのかもしれません💡
res.data.Items
の中のItem
1つ1つを並べたいのでresults: []
にはres.data.Items
までを入れます🎈🧸
表示はresult
のItem
の中のitemName
なのでresult.Item.itemName
です。
見やすく調整②
あとは好きなパラメータを追加するだけです❤️
とりあえず画像はいれましょう!
1 |
<img :src="result.Item.mediumImageUrls[0].imageUrl" alt=""> |
商品をリンクにしたいのでa
タグで囲ったりして完成!
(外部リンクなのでnuxt-linkは使えません)
CSSは最低限🌸
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
<template> <div class="page"> <h1>Rakuten Developers使ってみた</h1> <ul class="list"> <li v-for="result in results" :key="result.id" class="item" > <a :href="result.Item.itemUrl" class="link" > <img :src="result.Item.mediumImageUrls[0].imageUrl" alt="" class="img" > {{ result.Item.itemName }} </a> </li> </ul> </div> </template> <script> import axios from 'axios' export default { data () { return { results: [], } }, async asyncData () { const baseUrl = 'テストで作成したURLを入れてください' const res = await axios.get(baseUrl) return { results: res.data.Items } }, } </script> <style lang="scss" scoped> .page { > .list { list-style: none; display: flex; flex-wrap: wrap; > .item { width: 25%; > .link { color: #c6c6c6; text-decoration: none; display: flex; flex-direction: column; align-items: center; margin: 10px; > .img { width: 50%; } } } } } </style> |
まとめ
データの形が分かれば
簡単に表示させることができますね✨
勘違いをしていたと書きましたが、
それによって
テストの使い方が違うのか❓
パラメータの理解が間違っているのか❓
など色々想定していたら
時間を取られてしまいました…😂
そもそも.catch
でerrorがないなら
データの加工が違うと分かるんですけどね…
慣れです。慣れ。。。