概要
楽天GORAのAPIを用いた アプリを作成した時に起こったことを残しておく記事になります。
あまりGORAに関する記事がなかったためもし間違いに気がついてご指摘いただける様でしたら
なおありがたいです。
記述はrailsで作成したものになります。
要件
楽天GORAのAPIを導入する
手順一覧
1. まずは楽天に登録して、APIを利用するためのIDを発行してもらう
これに登録して専用のIDを発行してもらい、それを用いてAPIとの通信を許諾してもらいます。
2. 発行してもらったIDを環境設定に配置する
config > initializer > rakuten.rb
[rakuten.rb]は既存ファイルではないので、自分で作成する(名称は何でも可)
・rakuten.rb
RakutenWebService.configure do |c|
# (必須) アプリケーションID
c.application_id = '発行してもらったID'
# (任意) 楽天アフィリエイトID
c.affiliate_id = '発行してもらったID'
# (任意) リクエストのリトライ回数
# 一定期間の間のリクエスト数が制限を超えた時、APIはリクエスト過多のエラーを返す。
# その後、クライアントは少し間を空けた後に同じリクエストを再度送る。
c.max_retries = 3 # default: 5
# (任意) デバッグモード
# trueの時、クライアントはすべてのHTTPリクエストとレスポンスを標準エラー出力に流す。
c.debug = true # default: false
end
2. 'rakuten_web_service'というGemファイルをインストールする
GemFileでもLinuxでもいいので、下記ファイルをインストールしてください。
railsのバージョンで指定が必要そうな記述は見つけましたので、注意してください。
gem 'rakuten_web_service'
bundle install で読み込んで、関連しているファイルも入れるようにしましょう。
3. 操作するルーティング、コントローラー、ビューを用意する
controller > rakuten_controller.rb
class RakutensController < ApplicationController
def search
@items = RakutenWebService::Gora::Course.search(keyword: params[:keyword])
end
end
このRakutenWebService::Gora::Courseにsearchメソッドを用いることで検索ができます。
config > routes.rb
Rails.application.routes.draw do
省略
get 'rakuten_search' => 'rakutens#search'
end
views > rakuten > search.html.erb
<div class="main">
<div class="course-search-box">
<%= form_tag(rakuten_search_path, method: :get, class:"corse-search-form") do %>
<%= label_tag :keyword, '楽天GORA キーワード検索', class:"course-search-title" %>
<%= text_field_tag 'keyword', params[:keyword], class:"course-search-area" %>
<%= submit_tag "検索", class:"course-search-btn" %>
<% end %>
<div class="search-result-box">
<div class="search-title"><検索結果> ※URLはコピー&ペーストで検索してください!</div>
<% @items.each do |item| %>
<div class="search-result">
<div class="right">コース名:<%= item.golf_course_name %></div>
<div class="right">住所:<%= item.address %></div>
<div class="right">詳細ページ:<%= link_to "#{item.golf_course_detail_url}", "#{item.golf_course_detail_url}", method: :get, target:"_blank", rel:"noopener noreferrer" %></div>
</div>
<% end %>
</div>
</div>
</div>
これらを持って楽天APIの利用ができます。
構造としてはフォームから送られてくる[:keyword]を持ってsearchメソッドを実行し
検索結果を@itemsに格納して、each doで検索結果を添加します。
4. 抱えた問題点と応急処置
検索結果がある場合は、しっかりと表示されましたが検索結果がない場合に
「Not Found」 のエラー画面に遷移してしまいます。。。
@itemsの中身がない場合は「検索結果がありません」となるように
コントローラーに if @items.present?を設けもて、ビューファイルのeach doの前に設けてもダメでした。。。
エラー画面に遷移してしまうままではまずいので、応急処理として下記対策をコントローラーに設けました。
controller > rakuten_controller.rb
class RakutensController < ApplicationController
rescue_from StandardError, with: :error500
def search
@items = RakutenWebService::Gora::Course.search(keyword: params[:keyword])
end
def error500(error)
@items = nil
redirect_to root_path
end
end
これで楽天API関連でエラーが起こる場合はトップページに戻すように退避。。。
もう少しやり方はありますがあくまで応急処置です。
まとめ
どのように利用するかわかりませんが、正常に情報が取得できていればこの記述でゴルフ場の情報が拾えます。
楽天APIのGitHubや公式のテストなども確認してみて、記述や取得データを見ていただければと思います!
参考
https://qiita.com/nabenomoto/items/6453c4577647cb8995d3
https://github.com/rakuten-ws/rws-ruby-sdk/blob/master/README.ja.md
https://webservice.rakuten.co.jp/explorer/api