微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

web-services – 为2.5.x播放WS standalone

我想在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.

不幸的是,我没有找到一个完整的例子来解释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?

解决方法

您可能正在使用编译时依赖注入,否则您只需使用@Inject()(ws:WSClient),对吧?
文档中有一个示例: 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注入您的控制器.我不是100%肯定这种方法,如果有一些Play大师可以验证这一点,我会很高兴.关于ActorSystem,您只需要获取用于解析Future的线程池.您也可以导入或注入认执行上下文:play.api.libs.concurrent.Execution.Implicits.defaultContext.或者您可以使用自己的:隐式val wsContext:ExecutionContext = actorSystem.dispatchers.lookup(“contexts.your-special-ws-config”).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐