LoginSignup
14
14

More than 3 years have passed since last update.

[Rails] HTTParty gemによるAPIを簡単に利用できる方法

Last updated at Posted at 2019-02-04

参考:https://www.coursera.org/learn/ruby-on-rails-intro/

APIのほうは私が最近使っている映画のデータベースを例にします。
https://www.themoviedb.org/documentation/api

HTTPartyとは

  • RESTful Webサービス・クライアント
  • 自動的にJSON・XMLを解析しRuby hashesに変換する(素晴らしいw)
  • サポート: Basic HTTP認証、default request query parameters(共通パラメタex.API key)

APIデータサンプル分析(必要な情報)

まず、見やすくするために、ChromeかFirefoxでJSONViewという拡張をインストールする。
例えばとある映画のデータ:
Screen Shot 2019-02-04 at 5.57.05 AM_meitu_2.jpg
base uri: https://api.themoviedb.org/3/movie/
parameters(「?」の後ろの部分): api_key=1234abcd&language=ja-JP
リクエストのパラメタによってデータがJSONで返ってくる。URL上ではパラメタごとに「&」で繋いでる

実装手順(例:検索+映画詳細)

準備

Gemfile
gem 'httparty', '0.13.5' #インストールの後サーバ再起動
$ rails g controller movies search show

モデル

app/models/movie.rb
class Movie
  include HTTParty

  # default_options.update(verify: false) # disable SSL verification(必要に応じて)
  default_params api_key: '1234abcd', language: 'ja-JP' #共通パラメタ                 
  format :json

  # キーワードによる検索機能
  # https://developers.themoviedb.org/3/search/search-keywordsに参照
  def self.search term
    base_uri 'https://api.themoviedb.org/3/search/movie'
    get("", query: { query: term }) # {}の中身はパラメタ
  end

  # 指定の映画の詳細情報を取得
  # https://developers.themoviedb.org/3/movies/get-movie-detailsに参照
  def self.details id
    base_uri "https://api.themoviedb.org/3/movie/#{id}"
    get("", query: { } ) #パラメタなし
  end
end

コントローラー

movies_controller.rb
def search
  @search_term = params[:looking_for]
  @movie_results = Movie.search(@search_term)
end

def show
  @movie_info = Movie.details(params[:id])
end

ビュー

search.html.erb
<h1>映画検索</h1>

<div>
  <%= form_tag(movies_search_path, method: :get) do %>
    <%= search_field_tag :looking_for, nil, placeholder: 'Movie Title...' %>
    <%= submit_tag '検索' %>
  <% end %>
</div>

<div>
  <% if @movie_results.blank? %>
    <p>[<%= @search_term %>]と一致する情報が見つかりませんでした</p>
  <% else %>
    <p>[<%= @search_term %>]の検索結果</p>
    <table border="1">
      <tr>
        <th>ポスター</th>
        <th>タイトル</th>
        <th>上映日</th>
        <th>あらすじ</th>
      </tr>
      <% @movie_results.each do |movie| %>
        <tr>
          <td><%= image_tag("https://image.tmdb.org/t/p/w200#{movie["poster_path"]}", :alt => 'poster') %></td>
          <td><%= link_to movie['title'], action: 'show', id: "#{movie["id"]}" %></td>
          <td><%= movie['release_date'] %></td>
          <td><%= movie['overview'] %></td>
        </tr>
      <% end %>
    </table>
  <% end %>
</div>
show.html.erb
<h1><%= @movie_info['title'] %></h1>

<p><strong>上映日:</strong><%= @movie_info['release_date'] %></p>

<p><strong>上映時間:</strong><%= @movie_info['runtime'] %></p>

<p>
    <strong>ジャンル:</strong>
    <% @movie_info['genres'].each do |genre| %>
        <% if genre == @movie_info['genres'].last %>
            <span><%= genre['name'] %></span>
        <% else %>
            <span><%= genre['name'] %></span>
        <% end %>
    <% end %>
</p>

<p><strong>ストーリ:</strong><%= @movie_info['overview'] %></p>

<%= image_tag("https://image.tmdb.org/t/p/original#{@movie_info['poster_path']}", :alt => 'poster') %>

結果画面

Screen Shot 2019-02-04 at 8.01.21 AM_meitu_3.jpg
Screen Shot 2019-02-04 at 8.04.52 AM_meitu_5.jpg
Screen Shot 2019-02-04 at 8.07.16 AM_meitu_6.jpg

14
14
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14