我想在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
所以你可以在你的应用程序加载器中写这样的东西:
文档中有一个示例: 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”).