概要
WEB APIで条件をGET・POSTしたらJSONでリストが返ってくることって多いですよね。
そういう時に便利なのがGroovy
わずか数行で簡単に処理できます。
例
Doorkeeperで現時刻から24時間以内に開催されるイベントを検索してみます。
コードは次のようになります。
@Grab('org.codehaus.groovy.modules.http-builder:http-builder')
import groovyx.net.http.HTTPBuilder
import java.time.*
def http = new HTTPBuilder('http://api.doorkeeper.jp')
def since = OffsetDateTime.now() //時差情報付き現在時刻(ISO8601)
def until = since.plusDays(1)
http.get(path:'/events', query:[since:since., until:until, locale:'ja']){
res, json -> json.each{ println it.event.title }
}
return
まずHTTP通信を簡単に行うためにHTTPBuilderを使用します。
Grapeで引っ張ってきてimportします。
検索する期間の文字列を生成するのですが、ISO8601形式なので簡単に処理するためにJava8のDate and Time APIを使いたいのでjava.time.*もimportします。
HTTPBuilderでGETするためにはgetメソッドを実行すればいいです。
第一引数はアクセス先をMapで指定します。第二引数はパラメータをMapで指定します。
レスポンスを処理するためのクロージャを書くことで受け取ったJSONを処理できます。
クロージャの第二引数がJSONオブジェクトでHTTPBuilderが良きに計らってくれているのでその後は楽です。
今回は各イベントのタイトルだけを抽出して表示させてみました。GroovyだとGetterやMapのKeyをフィールドのように扱えるので直感的でわかりやすいですよね。
このような感じで手軽にJSONを扱うことができます。
処理本体をワンライナーで書くと
@Grab('org.codehaus.groovy.modules.http-builder:http-builder')
import groovyx.net.http.HTTPBuilder
import java.time.*
new HTTPBuilder('http://api.doorkeeper.jp').get(path:'/events', query:[since:OffsetDateTime.now(), until:OffsetDateTime.now().plusDays(1), locale:'ja']){res,json -> json.each{ println it.event.title }}
こんなかんじになります。
何かおかしな点などありましたらご指摘お願いします。