こんにちは、やぎにいです。
やぎすけ Advent Calendar 2016の22日目です。
今日が終わればもう25日まで祝休日ですね。頑張っていきましょう。
昨日は僕がRuby on RailsでつくるAPI(導入編)を書きました。
今日は無事jsonデータを返すところまで作れたものに機能を追加します。
昨日はデータベースに流したアイマスのキャラ情報をすべて返すAPIを作ることが出来ました。
正直言えば、あとは使う側が要らないキャラ情報を使わなくすればいいのでこれで完成!と言っても良いのですが、データ通信量等々を考えると現実的ではありません。アイマスのキャラは300人位いますし、楽曲に至っては600曲くらいありますし今も増えてます(昨日も増えましたね)。
それに対して要素があるとしたらすべてを返すAPIを使おうとすると膨大なデータ量のやりとりになります。
使う側が欲しい分だけをリクエストして、それを返す形が理想です。
というわけで、今回は昨日作ったAPIに「絞り込む」機能を追加したいと思います。
完成形としては
これを目指していきます。
今回は「絞り込み」の機能を実装するわけですが、同時に全件返す昨日作った部分も残しておく形になります。
同時に2つの機能を両立させるためにURIを考えましょう。
僕がGitHubに立てたIssueはこれです。
いや、これは良くない設計だろうと思われるかもしれませんが、ペーペーなので許してください。
僕は以下のように作ろう!と決意しました。
characters/
characters/
から始まるAPIの使い方、リクエストとレスポンスの仕様などがHTMLで表示されるページを出すcharacters/search
characters/search?name="なまえ"
とかcharacters/all
このような形にしたいと思います。
ではルーティングを設定してあげましょう。
それぞれGETで叩き、それらはすべてcharacters_controller
に飛ばします。
config/routes.rb
がルーティングの設定を記述する場所です。
1 2 3 4 5 | Rails.application.routes.draw do get '/characters', to: 'characters#index' get '/characters/search', to: 'characters#search' get '/characters/all', to: 'characters#all' end |
/characters
にGETリクエストが来たらcharacters_controller
のindex
に飛ばす/characters/search
にGETリクエストが来たらcharacters_controller
のsearch
に飛ばす/characters/all
にGETリクエストが来たらcharacters_controller
のall
に飛ばすそんな感じです。
これでルーティングは完成です。
先ほどルーティングでcharacters_controller
に飛ばす部分は作りました。では次はそのコントローラーで受け取り、処理して返却する機能部分を作りましょう。
まずは/characters
にアクセスが来た時。
これはAPIの仕様を記述したHTMLを出力するようにする予定ですが、HTMLファイルを用意していないので、現時点では404エラーを返すようにしましょう
1 2 3 | def index head 404 end |
このdef index
のindex
が先ほどルーティングの設定で記述したto: characters#index
の部分になります。
これで/characters
にGETが来たら404が返ってくるようになりました。確認しましょう。
chromeで確認してみるとちゃんと404が返ってきていますね。
head 404
はヘッダーで404コードを返しておいてという記述です。
では次に先に全件返す/characters/all
を書きましょう。これはコントローラーのall
に飛ばされてきます。
1 2 3 4 | def all @characters = Character.all render json: @characters end |
Character.all
でデータを全部取得し、それをjsonとして返却する。
そんな感じの記述です(おそらく@はつけないほうが良い気がしている)
これも確認してみましょう。
どうやらちゃんと昨日追加した765プロのアイドルが全部返ってきていますね。大丈夫です。
それでは最後に絞り込む/characters/search
を作ってみましょう。
現在の仕様としてはname
というパラメータ(必須)で名前(一部でもOKだし漢字でもふりがなでもOK)を与えるとそれに合致した物を返す。という仕様で行きましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def search if params[:name].blank? render json: [{"error": "100", "msg": "必須パラメーターがありません", "required": {"key": "name"}}] else @result = Character.where("name like ?", "%" + params[:name] + "%") if @result.empty? @result = Character.where("phonetic like ?", "%" + params[:name] + "%") end render json: @result end end |
こんな感じにとりあえず作ってみました。
まず最初に必須パラメータのname
があるかチェック、ない場合はエラーなjsonを返却。
次にデータベースのname
にパラメータのname
で検索し、当てはまったものを@result
に持っておく。
もしそれが空なら、ふりがなでも検索してみる。という形を取っています。
正しく動いているか確認してみましょう。
パラメータを渡さないときにエラーなjsonが返ってきているか
大丈夫ですね、ベタ書きしたjsonが返ってきています。
名前で検索できているか
試しに天海
と海
で検索してみました。
天海
では天海春香
さんしか居ないわけですので、1件返ってきています。
海
では天海春香
さんと、名前に海が入っている双海亜美
双海真美
姉妹もいるので、合計3件返ってきています。
ふりがなで検索できているか
試しにあまみ
とまみ
で検索してみました。天海さん大人気ですね。
あまみ
では合致するのがあまみはるか
さんのみなので1件返ってきています。
まみ
ではあまみはるか
のまみ
とふたみまみ
のまみ
で2件返ってきています。
どれにも当てはまらないときは空で返ってきているか
試しに事務員である音無小鳥
で検索してみますと、ちゃんと空が返ってきていますね。
これで確認が完了しました。
絞り込むことに成功です、これで任意のアイドルの件数分だけ使う側は引っ張ってくることが出来ます。
ある程度APIの形が出来てきたので、次はテストなり、Railsについてなりここまでの悪い点の修正なりを明日やりたいと思います。
個人で使うレベルにはさくっとAPIを作れるので大変ステキなフレームワークですね。Railsを普通に触るのは初めてですが、とても楽しいです。
ちゃんとレスポンスが返ってくるのを自分で作って見れるのは成果がわかってモチベーションの向上にもつながりますね。
以上、やぎにいでした!
<< Ruby on RailsでつくってみるAPI(まとめと考察) Ruby on RailsでつくるAPI(導入編) >>
2018やぎ小屋