saba1024のブログ

どうでも良い思いついた事とかプログラミング関係のメモとか書いていきます。

Ratpackを使ってJsonBuilderとJsonSlurperを試す

概要

GroovyでJSONを生成する(JsonBuilder)という記事と、 GroovyでJSONをパースする(JsonSlurper) という記事を書きました。

それぞれ独立して紹介しても実際にどういう場合に使うの?というイメージが湧きづらいので、実際にRatpackを使って簡単なWebアプリを作ってみました。
このWebアプリは単純に、localhost:5050に、{id:1, name:koji}というようなJSONをPOSTで送信すると、そのJSONに現在時刻を追加してクライアントにJSONとして返す、というものです。

なお、Ratpackは標準ではJacksonを使ってJSONを取り扱います。
今回はJsonBuilderとJsonSlurperを使ったサンプルを書きたかったので利用していませんが、通常であればRatpackではJacksonを利用します。

RatpackはNonBlockingなWebフレームワークであると共に、とても軽量かつシンプルに処理を記述する事が出来ます。
またGroovyとの相性も抜群で、Groovyをインストールしていれば、以下のコードを適当なファイルに保存して、groovyコマンドで実行すればRatpackが起動してポート番号5050で処理を待ち受けるようになります。

ソース

@Grab('io.ratpack:ratpack-groovy:1.4.5')
@Grab('org.slf4j:slf4j-simple:1.7.12')
import static ratpack.groovy.Groovy.ratpack
import groovy.json.*

ratpack {
    handlers {
       post() {
          it.request.body.then() { 
             // Ratpackのメモ。request.getBody()はPromise<TypedData>を返してくれている 
             assert it instanceof ratpack.http.TypedData
    
             // 受け取ったJSON(テキスト)をJsonSlurperでパース 
             def gotJson = new JsonSlurper().parseText(it.text)
    
             // レスポンス用のJSONをJsonBuilderで生成 
             def json = new JsonBuilder()
             json([id: "${gotJson.id}", name:"${gotJson.name}", accessedDate: new Date().format("yyyy/MM/dd HH:mm:ss")])
    
             // クライアントにJSONを返す
             // 通常Jacksonを利用するのであれば、態々ヘッダーを指定する必要なし
             response.headers.set 'Content-Type', 'application/json'
             render json.toString()
          } 
       }
    }
}

このソースを適当にtest.grovyというような名前で保存して、groovy test.groovyと実行するだけでRatpackが起動します。

実行結果

[koji:~]$ curl -v http://localhost:5050/ -H "Content-type: application/json" -X POST -d '{"id": 1, "name": "koji"}'
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 5050 (#0)
> POST / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:5050
> Accept: */*
> Content-type: application/json
> Content-Length: 25
> 
* upload completely sent off: 25 out of 25 bytes
< HTTP/1.1 200 OK
< Content-Type: application/json
< content-length: 61
< connection: keep-alive
< 
* Connection #0 to host localhost left intact
{"id":"1","name":"koji","accessedDate":"2017/07/05 12:04:28"}%                                                                                                                                                                                                                  [koji:~]$ 

ちゃんとJSONを投げて、JSONを受け取ることが出来ました。
実際にJsonBuilderとJsonSlurperを利用している部分は

// 受け取ったJSON(テキスト)をJsonSlurperでパース 
def gotJson = new JsonSlurper().parseText(it.text)
    
// レスポンス用のJSONをJsonBuilderで生成 
def json = new JsonBuilder()
json([id: "${gotJson.id}", name:"${gotJson.name}", accessedDate: new Date().format("yyyy/MM/dd HH:mm:ss")])

の2行です。とってもシンプルですね。

このように、Groovyを利用することで簡単にJSONを扱うことが出来、さらに巨大なエコシステムを利用してRatpackのような素晴らしいフレームワークもお手軽に利用することが出来ることが分かりますね。