Sinatraで簡易APIサーバーを作ってみた

2014.06.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

最近、RubyでAPIサーバーの処理を記述する案件が多い、t.hondaです。Rubyでサーバー側の処理を記述すると言えばRuby on Railsを思い浮かべることが多いと思いますが、今回は別の選択肢となるSinatraを紹介したいと思います。

Sinatraについて

Sinatraについては、公式ページに以下のような記述があります。

Sinatra is a DSL for quickly creating web applications in Ruby with minimal effort:

Sinatra - Getting Started より

超訳すると「SinatraはRubyで最小限の労力で素早くWebアプリケーションを作るためのドメイン固有言語」という感じになるでしょうか・・・。この「ドメイン固有言語」であることが、Sinatraの特徴と言えると思います。これについては後述します。

簡易APIサーバーを作る

Sinatraで簡単なAPIサーバーを作成してみました。以下に手順とソースについて書いていきたいと思います。

1.事前準備

先ずは以下のコマンドを実行し、Sinatraをインストールします。

$ gem install sinatra

2.ソース

今回はGetとPostの処理を一つずつ書いてみました。以下、ソースです。

article.rb

require 'sinatra'
require 'json'

get '/show' do
  article = {
      id: 1,
      title: "today's dialy",
      content: "It's a sunny day."
  }

  article.to_json
end

post '/edit' do
  body = request.body.read

  if body == ''
    status 400
  else
    body.to_json
  end
end

4行目の「get '/show' 」では、URL「/show」でGetリクエストを受け付けることを定義しており、12行目までGetリクエスト時の処理を記述しています。同様に14行目の「post '/edit'」では、URL「/edit」でPostリクエストを受け付けることを定義しており、22行までPostリクエスト時の処理を記述しています。

それぞれの処理について簡単に説明すると、Getリクエスト時には「article」ハッシュに入れた値をJSON形式で返しています。Postリクエスト時にはrequest.bodyで送られてきた値をチェックし、空ならエラーとしてHTTPステータス400を返し、値があればJSON形式にして返しています。

このように、APIサーバーによくあるGet・Postリクエストの取得、Postされた値の取得、JSONの返却が、Sinatraでは簡潔なソースで記述することができます。

3.動作確認

最後に、実際に動かして動作を確認してみます。ソースがあるフォルダにコンソールで移動し、以下のコマンドを実行します。

$ ruby article.rb

まずはGetリクエストから動作を確認してみます。ブラウザを起動し、URLに「http://localhost:4567/show」を指定すると、以下のようにJSONが返却されました。

スクリーンショット 2014-06-05 20.33.42

次にPostリクエストです。コンソールを開き、curlコマンドでリクエストを投げてみます。

$ curl -X POST http://localhost:4567/edit -w "\n%{http_code}\n"

400

bodyを指定していないので、HTTPステータスとして400が返ってきました。今度はbodyを指定してリクエストを投げてみます。

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"title":"MyFavorite","content":"Color is Black."}' http://localhost:4567/edit -w "\n%{http_code}\n"

(略)
"{\"title\":\"MyFavorite\",\"content\":\"Color is Black.\"}"
200

リクエストのbodyに投げたJSONが、そのまま返却されました。

まとめ

以上のように、1ファイルでAPIサーバーの処理を実装できたり、get〜・Post〜で始まるメソッドがそのままURLになることなど、簡単な記述で実装することができました。

さて、最初に『「ドメイン固有言語」であることが、Sinatraの特徴』と書きました。確かに簡単な記述でWebアプリのソースを記述することができます。ですが「フレームワーク」ではないため、例えばログ出力周りやActiveRecordのような仕組みがデフォルトでは用意されていません。このことから、SinatraはシンプルなAPIサーバーやWebアプリを少ない記述量で作成するのに向いていると言えると思います。