ページ

2013年3月23日土曜日

Play2.1でHTTPのGETする

Playにはplay.api.libs.ws.WS(Web Service、WebSocketではない)というライブラリがあってHTTP通信をすることができる。
非同期にやってくれるので、レスポンスを同期的に使うには返り値をちょっとゴニョゴニョしないといけない。

で、Play2.0系のときはPromise[ws.Response]で返ってたんだけど、2.1からはFuture[ws.Response]で返ってくる。
ググって上の方に出てくるやつは大体2.0系の話なのでそのままでは動かない。

なので2.0系で以下のように書いていたものは
import play.api.libs.ws.WS
val response = WS.url(uri).get().await.get.body

2.1系では以下のように書く必要がある。
import play.api.libs.ws.WS
import scala.concurrent.Await
import scala.concurrent.duration._
val future = WS.url(uri).get()
val response = Await.result(future, Duration.Inf).body

本来これでいいと思うのだけど、
http://grokbase.com/t/gg/play-framework/131rzk6wcm/possible-ws-response-encoding-bug
とかで言及されているように<meta charset="utf-8">とか書かれてるHTMLでもISOで返ってきちゃう。

なので、文字コードを変換してやる
val converted_result = new String(response.getBytes("iso-8859-1"), "utf-8")
view raw iso2utf8.scala hosted with ❤ by GitHub

ちゃんと探してないけど、もしかしたらWSのオプションとかでエンコードを指定してやったりできるのかもしれない。