Railsサーバーを使ってjsonを返すAPIを作る!

Ruby on railsを趣味としている私ですが、今回はRailsをサーバー側アプリとして使用して、json形式のデータを返すAPIを構築してみました。ということで今回はViewは一切触りません!!!

RailsでAPIを作るメリットは??

APIと言うと、グーグルマップやiTunesなど、著名なものもたくさんありますが、基本的な構造は「HTTPリクエスト」を受けて結果を返すというものです。使ったことはあるけど作ったことはないと言う人も多いのではないでしょうか?

APIを自分で作るメリットというのは、Rails以外のアプリケーションと連携できるという点です。データベース周りなどをRailsでいじって、データを返すということができるので、最近必須とされてきているスマートフォンアプリを作るときなんかに重宝します。iPhoneなどのアプリに使われているSwiftなんかは、単体では外部と通信することができないので、Http通信を使ってAPIでデータベースと通信を行うなんてことができちゃいます。

1.まずはRailsのプロジェクトを作る。

Railsでプロジェクトを作りましょう。そのあと、scaffoldなんかを使って最低限のデータベースを一気に構築しちゃいます。

(この辺を本当は使いたいデータベース構造にしちゃえばいい)

$rails new Api_app
$cd Api_app
$rails g scaffold Product name:string price:integer category_id:integer
$rails g model Category name

これでデータベースが構築され、各モデルファイルは以下のようになります。
・category.rb

class Category < ActiveRecord::Base
  has_many :products
end

・product.rb

class Product < ActiveRecord::Base
  belongs_to :category
end

2.jbuilderというgemをインストールする。

railsに来たリクエストに対して、レスポンスをjson形式で返すためには、jsonbuilderと言うgemを使えば簡単です。

Gem fileに

gem ‘jbuilder’

と記述して、

$bundle install

を実行すれば、jbuilderのgemがインストールされるはずです。

3.ルーティング設定

scaffoldメソッドを使ったので自動でルーティングは設定されているとは思いますが、一応確認のために。
・routes.rb

Rails.application.routes.draw do
  resources :products
end

4.jsonを返すためのアクションを記述

今回は、productのindexにアクセスした際に全データを返すことを目標とします。よって、indexアクションには以下のように記述します。

class Api::ProductsController < ApplicationController
  def index
    @products = Product.all
    respond_to do |format|
      format.html
      format.json
    end
  end

  ...
end

format.htmlの部分を記述すれば、通常のurlでアクセスされた場合はhtmlを返す設定になります。format.jsonと記述すれば.jsonへアクセスされた場合json形式でデータを返す設定となります。

5.最後にjbuilderファイルを作成する。

最後に、json形式でデータを返すために、jbuilderファイルを作ります。view/product/index.json.jbuilderを作成し、以下のように記述します。
・index.json.jbuilder

 
json.array!(@products) do |product|
  json.extract! product, :id, :name, :price, :publised_at, :category_id
  json.url product_url(product, format: :json)
end

まとめ

以上の手順で、$rails sをしサーバーを起動後、http://localhost:3000/products.jsonにアクセスすれば、データベースの中身がjson形式で帰ってきていることが確認できるかと思います。とても便利なので是非挑戦してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です