動かざることバグの如し

近づきたいよ 君の理想に

SinatraでJSON形式で返却するAPIを作成してみる

まずはHello Worldを表示する

  • bundle initでGemfile生成
  • Gemfileに以下を追加
gem 'sinatra'
gem 'json'
gem 'sinatra-contrib'
  • bundle install --path vendor/bundleでインストール

適当にapi.rbでも作って

require 'sinatra'
require 'json'
require "sinatra/reloader" if development?

get '/hello' do
    content_type :json
    data= {
        message: "Hello"
    }
    data.to_json
end

最後に実行

bundle exec ruby api.rb -o 0.0.0.0

ActiveRecordを使ってMySQLデータベースと連携してみる

CRUDを実現してみる

まずはGemfileを以下に変更

source "https://rubygems.org"

gem 'sinatra'
gem 'json'
gem 'sinatra-contrib'
gem "activerecord"
gem "mysql2"

そのあとにbundle install --path vendor/bundleで再度インストールを実行

MySQLを操作してデータベースを作成 Railsの流儀でテーブル名は複数形でなければならない

mysql> drop database hoge;
Query OK, 1 row affected (0.04 sec)

mysql> create database hoge;
Query OK, 1 row affected (0.00 sec)

mysql> use hoge
Database changed

mysql> create table users(
    -> id int unsigned not null auto_increment,
    -> name varchar(255) not null,
    -> loc varchar(255) not null,
    -> created_at datetime not null,
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.10 sec)

mysql> desc users;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255)     | NO   |     | NULL    |                |
| loc        | varchar(255)     | NO   |     | NULL    |                |
| created_at | datetime         | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

テストでデータを追加してみる

mysql> insert into users values(1, "taro", "Tokyo", now());
Query OK, 1 row affected (0.05 sec)

mysql> select * from users;
+----+------+-------+---------------------+
| id | name | loc   | created_at          |
+----+------+-------+---------------------+
|  1 | taro | Tokyo | 2014-10-22 19:03:34 |
+----+------+-------+---------------------+
1 row in set (0.00 sec)

次にRubyからデータベースにアクセスできるようにdatabase.ymlを作成

development:
  adapter: mysql2
  database: hoge
  host: localhost
  username: root
  password: xxxxxxxxxxx
  encoding: utf8

最後にapi.rb

# encoding: utf-8
require 'active_record'
require 'mysql2'
require 'sinatra'
require 'json'
require "sinatra/reloader" if development?

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection('development')

class User < ActiveRecord::Base
end

get '/users.json' do
    content_type :json
    users = User.all
    users.to_json
end

# ユーザー新規追加
post '/add' do
    name = params[:name]
    loc = params[:loc]

    # データ保存
    user = User.new
    user.name = name
    user.loc = loc
    
    if user.save
        user.to_json
    else
        halt 500
    end
end

これでbundle exec ruby api.rb -o 0.0.0.0した状態でhttp://*****:4567/users.jsonにアクセスすると全ユーザーがJSON形式で表示される