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
で、簡単ではありますが、ちょっとしたサンプルを書いてみました。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に指定できる内容は、以下のもののようです。
- uri … URI、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とよいでしょう。
簡単に使えそうなので、ちょこちょこ活用していこうと思います。