我想在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
的正确方法吗?有没有办法在没有AhcWSClient
的情况下创建ActorSystem
?
答案 0 :(得分:5)
您可能正在使用编译时依赖注入,否则您只需使用@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
注入您的控制器。我不是百分之百确定这种方法,如果有一位Play大师可以验证这一点,我会很高兴
关于ActorSystem
,您只需要获取用于解析Future
的线程池。您也可以导入或注入默认执行上下文:
play.api.libs.concurrent.Execution.Implicits.defaultContext
。
或者您可以使用自己的:
implicit val wsContext: ExecutionContext = actorSystem.dispatchers.lookup("contexts.your-special-ws-config")
。
答案 1 :(得分:2)
AFAIK这是创建AhcWSClient
的正确方法 - 至少在2.5.0和2.5.1中 - 如Scala API
当然,你可以随时使用另一个HTTP客户端 - 有很多可用于Scala的内容 - 例如Newman,Spray client等等(虽然Spray也是基于Akka所以你必须创建一个演员系统)