12
9

More than 5 years have passed since last update.

Playを起動させずにPlay WSのHttpクライアントを利用する

Posted at

外部のWeb APIにアクセスするためにPlay WSを使って下記のようなコードを実装していたのですが、

import play.api.libs.ws._
import play.api.Play.current
import scala.concurrent._
import scala.concurrent.duration.{ Duration, MILLISECONDS }

val futureResponse: Future[WSResponse] = WS.url("http://example.com").get()
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))

このコードをPlayアプリケーションが起動していないバッチ処理などから呼びだそうとするとRuntimeException: There is no started applicationというエラーが発生してしまいました。

そこで下のリンクなどを参考に
http://stackoverflow.com/questions/24881145/how-do-i-use-play-ws-library-in-normal-sbt-project-instead-of-play
下記のように修正することでHttpリクエストは正常に実行されるようになったのですが、

import play.api.libs.ws._
import com.ning.http.client.AsyncHttpClientConfig
import play.api.libs.ws.ning.NingWSClient
import scala.concurrent._
import scala.concurrent.duration.{ Duration, MILLISECONDS }
import scala.concurrent.ExecutionContext.Implicits.global

val builder = new AsyncHttpClientConfig.Builder()
val client = new NingWSClient(builder.build())
val futureResponse: Future[WSResponse] = client.url("http://example.com").get()
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))

このままだと処理が終了してもプログラムが終了してくれなかったため、上記のコードを下記のように修正し、

~~
val futureResponse: Future[WSResponse] = client.url("http://example.com").get()
futureResponse.onComplete(_ => client.close())
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))

作成したWSClientのcloseをHttpリクエスト終了後に呼び出してやることで、プログラムも正常に終了してくれるようになり、Playを起動していない状態でもPlay WSをHttpクライアントを利用することができました。

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9