3.初めてのAPIサーバ

ココではサンプルとして、現在の日時をJSONで返すAPIサーバを構築していきます。
最終的には、指定されたタイムゾーンで日時を計算して返すようなちょっと便利なAPIにしていきましょう。 前提条件としてGradleをインストールしておいてください。
Gradleが入っていれば実はGroovyすら必要ありません。

3.1.準備

まずは必要なディレクトリを作成します。

[koji:ratpack]$ mkdir ratpackapp
[koji:ratpack]$ cd ratpackapp 
[koji:ratpackapp]$ mkdir -p src/ratpack/templates
[koji:ratpackapp]$ mkdir -p src/ratpack/public/images
[koji:ratpackapp]$ mkdir -p src/ratpack/public/scripts
[koji:ratpackapp]$ mkdir -p src/ratpack/public/styles
[koji:ratpackapp]$ mkdir -p src/ratpack/public/lib
[koji:ratpackapp]$ mkdir -p src/main/groovy
[koji:ratpackapp]$ mkdir -p src/src/groovy

Gradleの設定ファイルを作成します。

build.gradle

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "io.ratpack:ratpack-gradle:1.3.3"
  }
}

apply plugin: "io.ratpack.ratpack-groovy"
apply plugin: "idea"

repositories {
  jcenter()
}

dependencies {
  runtime "org.slf4j:slf4j-simple:1.7.12"
}

以下のファイルを作成します。
これは、Hello Worldで作成したhello-ratpack.groovyと同じものです。
先頭から、@Grapes、@Grabが無くなってシンプルになっていますね。

src/ratpack/Ratpack.groovy

import static ratpack.groovy.Groovy.ratpack

ratpack {
    handlers {
        path {
            render "Hello World!"
        }
        path(":name") {
            render "Hello $pathTokens.name!"
        }
    }
}

これで準備は整いました!
現在、ディレクトリ構成は以下のようになっているはずです。

ratpackapp
├── build.gradle
└── src
    ├── main
    │   └── groovy
    ├── ratpack
    │   ├── Ratpack.groovy
    │   ├── public
    │   │   ├── images
    │   │   ├── lib
    │   │   ├── scripts
    │   │   └── styles
    │   └── templates
    └── src
        └── groovy

3.2.実行

gradle run -tを実行します。

[koji:ratpackapp]$ gradle run -t
Continuous build is an incubating feature.
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources
:classes
:configureRun
:run
[main] INFO ratpack.server.RatpackServer - Starting server...
[main] INFO ratpack.server.RatpackServer - Building registry...
[main] INFO ratpack.server.RatpackServer - Ratpack started (development) for http://localhost:5050

BUILD SUCCESSFUL

Total time: 9.313 secs

Waiting for changes to input files of tasks... (ctrl-d to exit)

これで、http://localhost:5050にアクセスするとちゃんとRatpackが起動していることが分かります。
では、ソースコードのrender "Hello World!"の部分をrender "こんにちわRatpack!"に変更して保存しましょう。
保存すると、Gradleが自動的にファイルの変更を検知してくれて、コンパイル&再ロードしてくれます。
少し待つ、おmしくはGradleを実行しているコンソールでGradleが再ビルドした際のメッセージが流れたら、再度http://localhost:5050にアクセスしてみましょう。
自動で変更内容が反映されて、画面には こんにちわRatpack! と表示されていますね。
このように、Gradleを利用するとソースコードの修正が自動で繁栄冴えれるようになり、必要なライブラリ(当然Ratpack本体も)のダウンロード、設定をGradleがGroovyの代わりに受け持ってくれます。

3.3.実際のAPIを追加する

さて、では実際に日時を返すAPIを追加しましょう。

Ratpack.groovyを以下のように修正します。

import ratpack.jackson.Jackson

import static ratpack.groovy.Groovy.ratpack
import static ratpack.groovy.Groovy.groovyTemplate
import ratpack.groovy.template.TextTemplateModule

ratpack {
    handlers {
        path {
            render "こんにちわRatpack!"
        }

        path("date") {
            String date = new Date().format("yyyy/MM/dd HH:mm:ss")
            render Jackson.json(["date":date])
        }
    }
}

はい、出来ました!コレでだけで完了です! 実際にhttp://localhost:5050/dateにアクセスしてみてください。ちゃんとJSONで現在日時が返されているのが解ると思います。
本当にJSON?renderしてるからテキストで返されてない?と思われる方も居るかもしれません。
その場合はcurlコマンドで確認してみましょう。

[koji:ratpack]$ curl -X GET -i localhost:5050/date        
HTTP/1.1 200 OK
content-type: application/json
content-length: 30
connection: keep-alive

{"date":"2016/06/20 15:00:45"}%                                        

ちゃんとcontent-typeapplication/jsonになっていますね!

3.4.参考:テンプレートを使う

src/ratpack/Ratpack.groovy

import static ratpack.groovy.Groovy.ratpack
import static ratpack.groovy.Groovy.groovyTemplate
import ratpack.groovy.template.TextTemplateModule

ratpack {

    bindings {
        module TextTemplateModule // for groovyTemplate
    }

    handlers {
        path {
            render "こんにちわRatpack!"
        }
        path("showTemplate") {
            render groovyTemplate("index.html")
        }
    }
}

src/ratpack/public/scripts/sample.js

$(function(){
    $("#sample").text("This text is filled by jQuery");
});

src/ratpack/public/styles/sample.css

h1 {
    color:#abcdef;
}

src/ratpack/templates/index.html

<!DOCTYPE html>
<html>
<head>
<meta name="robots" content="noindex,nofollow" />
<meta charset="UTF-8">
<title>This is Template</title>
<!--** jQuery **-->
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.1.min.js"></script>
<!--** load CSS **-->
<link rel="stylesheet" type="text/css" href="/styles/sample.css">
<script type="text/javascript" src="/scripts/sample.js"></script>
</head>
<body>
    <h1>Hello Ratpack Template</h1>
    <div id="sample"></div>
</body>
</html>

上記のRatpack.groovyの修正、html、JavaScript、CSSの追加ができたら、http://localhost:5050/showTemplateにアクセスしてみましょう。
ちゃんとJavaScript、CSSが読み込めていることが確認できます。

なおディレクトリ構成は以下のようになrっています。

ratpackapp
├── build.gradle
└── src
    ├── main
    │   └── groovy
    ├── ratpack
    │   ├── Ratpack.groovy
    │   ├── public
    │   │   ├── images
    │   │   ├── lib
    │   │   ├── scripts
    │   │   │   └── sample.js
    │   │   └── styles
    │   │       └── sample.css
    │   └── templates
    │       └── index.html
    └── src
        └── groovy