CLOVER🍀

That was when it all began.

GroovyのHTTPBuilderを試す

Groovyを使って、簡単にHTTPアクセスができないかなぁと思い、ビルダーが何かあるんだろうと調べたところ、やっぱりありました。

HTTPBuilder
http://groovy.codehaus.org/modules/http-builder/

みなさんご存知のApache HttpClientの、ラッパーみたいなもののようです。

HttpClient
http://hc.apache.org/httpcomponents-client-ga/

使い方は、各種ドキュメントにGETやPOSTの例などがあるので、とりあえずはそちらを参照してください。

Simplified GET Request
http://groovy.codehaus.org/modules/http-builder/doc/get.html

Simple POST
http://groovy.codehaus.org/modules/http-builder/doc/post.html

APIドキュメントは、こちら。

Javadoc
http://groovy.codehaus.org/modules/http-builder/apidocs/index.html

JSONXMLも扱えるようです。

で、簡単ではありますが、ちょっとしたサンプルを書いてみました。GETだけですけど。

このはてなダイアリーにアクセスする、Groovyスクリプトです。
http-builder.groovy

@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.6')
import groovyx.net.http.HTTPBuilder

def http = new HTTPBuilder('http://d.hatena.ne.jp')

http.get([path : '/Kazuhira']) { resp, reader ->
    assert resp instanceof groovyx.net.http.HttpResponseDecorator

    assert resp.statusLine.statusCode == 200
    assert resp.getHeaders('Server')[0].value == 'Apache'

    assert resp.entity instanceof org.apache.http.HttpEntity

    assert reader instanceof groovy.util.slurpersupport.NodeChild
    println(reader)
}

注)Grapeによる依存関係の解決で、「org.codehaus.groovy.control.MultipleCompilationErrorsException」を言われてコケる方は、こちらへ
GroovyのHTTPBuilderで、multipart/form-dataを送信する
http://d.hatena.ne.jp/Kazuhira/20140126/1390708336

依存関係は、Grapeを使用して定義しました。ドキュメントなどでは、なぜか0.5.2でよく書かれているのですが、現時点での0.6が最新版のようです。

最初に、デフォルトのURIを指定して、HTTPBuilderのインスタンスを作成します。

def http = new HTTPBuilder('http://d.hatena.ne.jp')

getメソッドやpostメソッドで、リクエストを実行します。今回は簡易に実行できるgetメソッドを使用しましたが

http.get([path : '/Kazuhira']) { resp , reader ->

もうちょっと汎用的に書く場合は、requestメソッドを使用するようです。詳しくは、APIドキュメントを。

HTTPBuilder
http://groovy.codehaus.org/modules/http-builder/apidocs/groovyx/net/http/HTTPBuilder.html

また、最後の引数はClosureですが、ここを指定しなかった場合はレスポンスの内容がHTTPBuilderによって解釈された形式で返却されるようです。最初にご紹介した、本家サイトのGETの例が、そのパターンで実装されています。

Closureを与えた場合は、第1引数がHttpResponseDecoratorとなり、第2引数は結果オブジェクトになります。

    assert resp instanceof groovyx.net.http.HttpResponseDecorator
    assert reader instanceof groovy.util.slurpersupport.NodeChild

HttpResponseDecoratorは、org.apache.http.HttpResponseのラッパーのようなものみたいです。第2引数がNodeChildになっているのは、今回のHTTPアクセスのレスポンスがHTMLだからでしょうね。

HttpResponseDecorator
http://groovy.codehaus.org/modules/http-builder/apidocs/groovyx/net/http/HttpResponseDecorator.html

で、getメソッドの引数をよくよく見ると

http.get([path : '/Kazuhira']) { resp , reader ->

とMapを渡しています。

このMapに指定できる内容は、以下のもののようです。

  • uriURI、URL、またはtoStringするとURIになるもの。指定しなかった場合は、デフォルトのURI(コンストラクタ引数に指定したもの)を使用します
  • path … URIに追加する、パスです
  • queryString … エスケープされたQueryStringを指定します
  • query … QueryパラメータをMapで指定します
  • headers … HTTPヘッダをMapで指定します
  • contentType … リクエストでのContent-Typ、Acceptヘッダを指定します
  • requestContentType … レスポンスのContent-Typeヘッダが期待と異なる場合に、リクエストのためのContent-Typeを指定します
  • body … 与えられたContent-Typeでエンコードされた、リクエストBodyを指定します

Request body that will be encoded based on the given contentType

以下のJavadocコメントを書いただけなので、気になるようならこちらをご覧ください。

HTTPBuilder.RequestConfigDelegate#setPropertiesFromMap(java.util.Map)
http://groovy.codehaus.org/modules/http-builder/apidocs/groovyx/net/http/HTTPBuilder.RequestConfigDelegate.html#setPropertiesFromMap%28java.util.Map%29

オフィシャルのGETやPOSTのサンプルでも、これらのパラメータを使用しているので、ドキュメントを見rとよいでしょう。

簡単に使えそうなので、ちょこちょこ活用していこうと思います。