Rails で楽天APIを使ってみる(gem無し)

楽天apiを初めて使ったので忘れないようにメモとして残しときます。

<h1>前提条件</h1>
Ruby: 2.6.5
Rails: 5.2.6

使用するgem
インストールしてください

```
gem 'dotenv-rails' <- 環境変数を使えるようにする
gem 'faraday' <- httpクライアントとして導入する
gem 'faraday_middleware' 
```

<h1>楽天APIのセットアップ</h1>
まずはここから使いたいAPIを選んでください。
僕は商品検索APIを使いました。

https://webservice.rakuten.co.jp/document/

選んだら、APIの使用に必要なIDを発行します。
アプリ名とリンクを記載する必要があるので準備しておいてください。
ログインしてない人はログインを促されますのでログインしてください。

![スクリーンショット 2021-10-08 21.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/4c37b255-71df-0c2e-3fd6-ba86afdde8eb.png)

必要な情報を入れたら、作成されたIDを確認できます。
これで完了です。

![スクリーンショット 2021-10-08 21.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/e588010d-52af-ae2a-8124-b9fb9b81b5c5.png)

<h1>実装</h1>
必要なidを取得できたので、まずはenvファイルにidを設定します。

```ruby:env
RAKUTEN_APP_ID = 'xxxxxxxxxxxxxxxx'
RAKUTEN_AFFILIATE_ID = 'xxxxxxxxxxxxxxxx'　 #アフィリエイトidは任意
```

```
呼び出す時は以下のように書く
ENV['RAKUTEN_APP_ID'] と ENV['RAKUTEN_AFFILIATE_ID']
```

今回は動作確認できればいいので、適用にconfig/initializers配下に rakuten_api.rbを作ります。

コンソールでapiを通じて情報を取得できれば良いので、入力を自分でするようにします。

```ruby:config/initializers.rakuten_api.rb
puts '検索キーワードを入力してください'
search_keyword = gets.chomp
```

ファイルを実行すると,入力を促すような動作をします。

```ruby:config/initializers.rakuten_api.rb
puts '検索キーワードを入力してください'
search_keyword = gets.chomp

app_id = ENV['RAKUTEN_APP_ID']  一旦変数に入れます。
```

後はFaradayを使いますが、
Faradayはruby上でHTTPリクエストを実行できるようにしてくれるライブラリです。
rubyは標準でNet::HTTPというクライアントがありますが、簡単にFaradayを使ってみようと思います。

使い方としては、大雑把ですがこんな感じです。

```
res = Faraday.get('https://hoge.com')
```

こう書くと、サイトの情報が取得できます。
こんな感じで楽天のサイトにアクセスして対応する商品の情報をgetします。

```ruby:config/initializers.rakuten_api.rb
puts '検索キーワードを入力してください'
search_keyword = gets.chomp

app_id = ENV['RAKUTEN_APP_ID']
res = Faraday.get("https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?applicationId=#{app_id}&keyword=#{search_keyword}")
res_json = JSON.parse(res.body)
puts res_json
```

getの対象リンクにキーワードと発行したIDを展開します。
これで実際にviewから使う時もkeywordとしてformで送信を行えば使えます。
情報が取れているか確認したいので、一旦実行してみます。

```
ruby config/initializers.rakuten_api.rb
```

キーワードを入力したら、、

```
{"Item"=>
{"mediumImageUrls"=>
[{"imageUrl"=>
"http://thumbnail.image.rakuten.co.jp/@0_mall/ledled/cabinet/thumnail/wineset/felicity-set-041_1.jpg?_ex=128x128"}, 
{"imageUrl"=>"http://thumbnail.image.rakuten.co.jp/@0_mall/ledled/cabinet/thumnail/wineset/felicity-set-041_2.jpg?_ex=128x128"}, 
{"imageUrl"=>"http://thumbnail.image.rakuten.co.jp/@0_mall/ledled/cabinet/thumnail/wineset/felicity-set-041_3.jpg?_ex=128x128"}], 
"pointRate"=>5, "shopOfTheYearFlag"=>0, "affiliateRate"=>4, "shipOverseasFlag"=>0, "asurakuFlag"=>1, "endTime"=>"", "taxFlag"=>0, "startTime"=>"", "itemCaption"=>"【送料無料対象外地域について】 北海道・沖縄・離島のお客様は対象外とさせていただきます。 ご注文内容確認後、こちらで送料部分を修正して「御注文確認メール」にて、その旨ご連絡させていただきますのでお支払金額の変更を必ずご確認ください。 【クール便のご指定について】 送料無料商品のクール便のご指定に関しましては、お客様のご負担となります。 自動的にクール便代金が300円（税抜）が加算されます。 予めご了承ください。 【送料無料商品との同梱について】 1梱包
```

こんな感じでデータが取れました！

ただ、めちゃめちゃ見づらいのでどうにかします。
最後のputsの部分を

```
puts JSON.pretty_generate(res_json)
```

として再度実行します。
今更ですが、検索キーワードはワインです。笑

```
  "Item": {
        "mediumImageUrls": [
          {
            "imageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/ledled/cabinet/thumnail/wineset/felicity-set-038_1a.jpg?_ex=128x128"
          },
          {
            "imageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/ledled/cabinet/thumnail/wineset/felicity-set-038_2.jpg?_ex=128x128"
          },
          {
            "imageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/ledled/cabinet/thumnail/wineset/felicity-set-038_3a.jpg?_ex=128x128"
          }
        ],
        "pointRate": 5,
        "shopOfTheYearFlag": 0,
        "affiliateRate": 4,
        "shipOverseasFlag": 0,
        "asurakuFlag": 1,
        "endTime": "",
        "taxFlag": 0,
        "startTime": "",
        "itemCaption": "【送料無料対象外地域に
```

ちょっとjson形式の見やすいファイルになりましたね！
これで完了です。
後は用途に合わせてカスタマイズしてください。

<h1>あとがき</h1>
正直gem使った方が100倍早いです。
今回は試しにやってみようと思ったので使わずにやってみました。
おかげでfaradayやhttpリクエストを活用した使い方もできるようになったのでよかったです。

以下参考にさせていただいた記事を貼ります。
ありがとうございました！

https://nekorails.hatenablog.com/entry/2018/09/28/152745

https://nishinatoshiharu.com/faraday-apiclient/

https://blog.apitore.com/2017/02/27/ruby-api-call-faraday/