SinatraをJerseyと比べながら試してみた

Ruby on Railsのintegrationテストを真面目に書いていたら挫折しそうになったので、色々と寄り道しながら調べていたら*1Ruby on Rails以外のRuby製WAFとしてSinatraを知ったので、試してみました。

簡単なRESTfulアプリケーションを作りたいという時の選択肢という点で、JavaでいうところのJerseyが近いかなと思ったので、それぞれで比べてみました。

作るのは、http://localhost:8888/helloにGETリクエストを送ったら、"Hello"というplain textを返す超簡単なHelloアプリケーションです。

Jersey(Java)の場合

昔のエントリーの使いまわしです。必要なのはjarをクラスパスに通すだけです。実行はコンパイルしてメインクラスを実行。

メインクラス(HelloServerMain.java)

package sample;

import com.sun.jersey.api.container.httpserver.HttpServerFactory;
import com.sun.net.httpserver.HttpServer;

public class HelloServerMain {

	public static void main(String[] args) throws Exception {
		HttpServer server = HttpServerFactory.create("http://localhost:8888/");
		server.start();
	}
}

リソースクラス(HelloResource.java)

package sample;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloResource {

	@GET
	@Path("/")
	@Consumes(MediaType.TEXT_PLAIN)
	public String hello() {
		return "Hello!";
	}
}

Sinatra(Ruby)の場合

必要なのはSinatraのGemのインストールのみ。


gem install sinatra

hello_server.rbとかの名前で以下のように書きます。

require 'sinatra'

get '/hello' do
  "Hello!"
end

実行は以下のような感じで。Webrickが起動します。


ruby hello_server.rb -p 8888

まとめ

サンプルほぼそのままの簡単な例ですが、あっという間に作れてしまいます。

Railsだと機能が豊富すぎるし、簡単に(DBも不要なくらいの)Webアプリケーションをちょいちょいっと作りたい、って時にはピッタリはまる印象。

あとは、HTTPリクエストをモックを使ってがんばって書くよりも、うまく使えばテストがシンプルになるかもしれないと思いました。昔、テスト用に似たようなダミーHTTPサーバをsocketライブラリを使って一から作っていたことがあるので、それからの置き換えはスムーズにできそう。

*1:結論としてcapybaraがよさそうだったので試してみようかと思います。