Apache HttpComponentsをラップしてScalaから使うためのシンプルなHTTPクライアントを作ってみました。こんな感じで使います。
val content: String = new SimpleHttpClient("http://www.google.co.jp/").get()
パラメータや文字コードも指定できます。getメソッドの代わりにpostメソッドを使うとPOSTリクエストになります。
val content: String = new SimpleHttpClient("http://www.google.co.jp/search" Map("q" -> "scala"), "UTF-8").get()
getメソッドやpostメソッドの引数にはレスポンスのハンドリングを行うための関数を渡すことができます(省略するとレスポンスボディの内容を文字列で返却するデフォルトのハンドラが適用されます)。関数は引数にorg.apache.http.HttpResponseを取り、任意の型の戻り値を返します。HttpComponentsのAPIを使ってご自由にどうぞ、という感じです。
val content: Array[Byte] = new SimpleHttpClient("http://www.google.co.jp/").get { r: HttpResponse => EntityUtils.toByteArray(r.getEntity()) }
とりあえずこんなところ。30分くらいで作ったものなのでいろいろ課題があります。
- リクエストヘッダやクッキーを設定できるようにする
- プロキシ、認証の設定をできるようにする
- getメソッドやpostメソッド単位で処理が完結しているのでHttpClientのインスタンスを使いまわせるようにする
- デフォルトのレスポンスハンドラはレスポンスのContent-Typeヘッダのcharsetを見てエンコードを判別するようにする
もともとWeb APIを叩いたりスクレイピングのためのHTTP通信を簡単に行いたい、と思って作ったものなのでどこまで真面目に作りこむかはわかりません。
こんな感じでscala-utilsでは普通に使えるライブラリを作っていきたいです。