Web services 在2.5.x版本中播放WS-standalone

Web services 在2.5.x版本中播放WS-standalone,web-services,scala,playframework,playframework-2.5,Web Services,Scala,Playframework,Playframework 2.5,我想在Play应用程序之外创建一个Play web服务客户端。对于Play WS 2.4.x版,很容易发现它是这样完成的: val config = new NingAsyncHttpClientConfigBuilder().build() val builder = new AsyncHttpClientConfig.Builder(config) val client = new NingWSClient(builder.build) 但是,在2.5.x中,NingWSClient现在已

我想在Play应用程序之外创建一个Play web服务客户端。对于Play WS 2.4.x版,很容易发现它是这样完成的:

val config = new NingAsyncHttpClientConfigBuilder().build()
val builder = new AsyncHttpClientConfig.Builder(config)
val client = new NingWSClient(builder.build)
但是,在2.5.x中,
NingWSClient
现在已被弃用,而应使用
AhcWSClient

不幸的是,我没有找到一个完整的例子来解释在游戏之外创建和使用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

AFAIK这是创建
AhcWSClient
的正确方法-至少在2.5.0和2.5.1中-如图所示


当然,您可以始终使用另一个HTTP客户机-有许多可用于Scala之类的应用程序(尽管Spray也基于Akka,因此您还必须创建一个actor系统)

您可能正在使用编译时依赖项注入,否则您只需使用
@Inject()(ws: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
注入控制器。我不能百分之百肯定这种方法,如果一些游戏大师能够验证这一点,我会很高兴。
对于
ActorSystem
,您只需要获得一个线程池来解析
未来的
。您也可以只导入或注入默认执行上下文:
play.api.libs.concurrent.Execution.Implicits.defaultContext

或者您可以使用自己的:

implicit val wsContext:ExecutionContext=actorSystem.dispatchers.lookup(“contexts.your special ws-config”)

我没有使用依赖注入web服务,因为我想在播放应用程序之外使用web服务。不过,指向配置解析器的文档和扩展的链接非常有用。