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のような素晴らしいフレームワークもお手軽に利用することが出来ることが分かりますね。