2016-04-12 10 views
4

Playアプリケーションの外部にPlay Webサービスクライアントを作成したいとします。プレイWSバージョン2.4.xのために、それはそれは次のように行われていることを見つけるのは簡単です:2.5.x用WSスタンドアロンを再生

val config = new NingAsyncHttpClientConfigBuilder().build() 
val builder = new AsyncHttpClientConfig.Builder(config) 
val client = new NingWSClient(builder.build) 

しかし2.5.XにNingWSClientが廃止される代わりに - AhcWSClientを使用する必要があります。

残念ながら、Play以外のAhcWsClientの作成と使用について説明する完全な例は見つかりませんでした。現在、私はこれで行く:

import play.api.libs.ws.ahc.AhcWSClient 
import akka.stream.ActorMaterializer 
import akka.actor.ActorSystem 

implicit val system = ActorSystem() 
implicit val materializer = ActorMaterializer() 
val ws = AhcWSClient() 

val req = ws.url("http://example.com").get().map{ 
    resp => resp.body 
}(system.dispatcher) 

これはAhcWsClientを作成するための正しい方法は何ですか?そして、ActorSystemなしでAhcWSClientを作成する方法はありますか?

答えて

5

を(スプレーはまた、アッカに基づいていますが、そうあなたにも俳優のシステムを作成しなければならない) - スカラ座のために利用可能、 右?。
https://www.playframework.com/documentation/2.5.x/ScalaWS#using-wsclientだから、あなたのアプリケーションのローダーにこのような何かを書くことができ:あなたのコントローラに

lazy val ws = { 
    import com.typesafe.config.ConfigFactory 
    import play.api._ 
    import play.api.libs.ws._ 
    import play.api.libs.ws.ahc.{AhcWSClient, AhcWSClientConfig} 
    import play.api.libs.ws.ahc.AhcConfigBuilder 
    import org.asynchttpclient.AsyncHttpClientConfig 

    val configuration = Configuration.reference ++ Configuration(ConfigFactory.parseString(
    """ 
     |ws.followRedirects = true 
    """.stripMargin)) 

    val parser = new WSConfigParser(configuration, environment) 
    val config = new AhcWSClientConfig(wsClientConfig = parser.parse()) 
    val builder = new AhcConfigBuilder(config) 
    val logging = new AsyncHttpClientConfig.AdditionalChannelInitializer() { 
    override def initChannel(channel: io.netty.channel.Channel): Unit = { 
     channel.pipeline.addFirst("log", new io.netty.handler.logging.LoggingHandler("debug")) 
    } 
    } 
    val ahcBuilder = builder.configure() 
    ahcBuilder.setHttpAdditionalChannelInitializer(logging) 
    val ahcConfig = ahcBuilder.build() 
    new AhcWSClient(ahcConfig) 
} 
applicationLifecycle.addStopHook(() => Future.successful(ws.close)) 

そして注入ws
は、ドキュメント内の1つの例があります。私はこのアプローチで100%確信しているわけではありませんが、Playの専門家がこれを検証できれば幸いです。
ActorSystemに関しては、それを解決するためのスレッドプールを取得する必要があります。Futureデフォルトの実行コンテキストをインポートまたは注入することもできます。
play.api.libs.concurrent.Execution.Implicits.defaultContext
または、独自のものを使用できます。
implicit val wsContext: ExecutionContext = actorSystem.dispatchers.lookup("contexts.your-special-ws-config")

+0

私は依存関係注入型Webサービスを使用しません。なぜなら、Playアプリケーションの外部でWebサービスを使用したいからです。ドキュメントへのリンクと、configパーサーの拡張は非常に便利です。 – Zwackelmann

2

私の知る限り、これはAhcWSClientを作成するための適切な方法である - 少なくとも2.5.0および2.5.1で - Scala API

に見られるようにあなたは、もちろん、常に別のHTTPクライアントを取ることができます - 多くがありますNewmanSpray client、などのようなそうでない場合は、あなただけの@Inject() (ws: WSClient)を使用することになり、あなたはおそらく、時間依存性の注入をコンパイル使用している

関連する問題