WS в Play стал невероятно сложным для 2.6.X
Для Play 2.3.X модуль WS очень прост в использовании:
WS.url(s"http://$webEndpoint/hand/$handnumber").get()
Для такого простого и понятного использования.
Находясь в Play 2.6.x по ссылке: https://www.playframework.com/documentation/2.6.x/JavaWS Сначала нужно создать http-клиент.
WSClient customWSClient = play.libs.ws.ahc.AhcWSClient.create(
play.libs.ws.ahc.AhcWSClientConfigFactory.forConfig(
configuration.underlying(),
environment.classLoader()),
null, // no HTTP caching
materializer);
Более того, вам также понадобится материализатор и система Акка для поддержки материализатора.
String name = "wsclient";
ActorSystem system = ActorSystem.create(name);
ActorMaterializerSettings settings = ActorMaterializerSettings.create(system);
ActorMaterializer materializer = ActorMaterializer.create(settings, system, name);
// Set up AsyncHttpClient directly from config
AsyncHttpClientConfig asyncHttpClientConfig = new DefaultAsyncHttpClientConfig.Builder()
.setMaxRequestRetry(0)
.setShutdownQuietPeriod(0)
.setShutdownTimeout(0).build();
AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(asyncHttpClientConfig);
// Set up WSClient instance directly from asynchttpclient.
WSClient client = new AhcWSClient(
asyncHttpClient,
materializer
);
Я знал, что это добавит больше возможностей к клиенту WS, но когда я просто хочу простой http-клиент, использование становится неприемлемым сложным, оно настолько проводное.
3 ответа
На странице, на которую вы ссылаетесь, написано:
Мы рекомендуем вам получать экземпляры WSClient, используя внедрение зависимостей, как описано выше. Экземпляры WSClient, созданные с помощью внедрения зависимостей, проще в использовании, поскольку они автоматически создаются при запуске приложения и очищаются при его остановке.
Это не должно удивить вас, что создание экземпляра вручную WSClient
это утомительно.
И на этой же странице описано, как использовать инъецированную версию WSClient
:
import javax.inject.Inject;
import play.mvc.*;
import play.libs.ws.*;
import java.util.concurrent.CompletionStage;
public class MyClient implements WSBodyReadables, WSBodyWritables {
private final WSClient ws;
@Inject
public MyClient(WSClient ws) {
this.ws = ws;
}
// ...
}
Это так же просто, как и в предыдущих версиях. На самом деле, в предыдущих версиях Play вы также могли создать собственный экземпляр WSClient
и это раньше имело сравнимую сложность (по модулю акка).
Наконец я использую ScalaJ-http, https://github.com/scalaj/scalaj-http
Который очень прост в использовании:
import scalaj.http._
...
response= Http("http://localhost:5000/health").asString
Что просто, как WS в игре 2.3.6
Для Play 2.6.x фреймворк может не создавать ws по умолчанию для вас и посмотрите пример https://github.com/playframework/play-scala-tls-example/blob/2.6.x/app/Main.scala
Для людей, использующих Scala Play с полной поддержкой DI, одним из решений для создания экземпляра WSClient является Play.current.injector.instanceOf[WSClient]
, Это также полезно при обновлении до Scala Play 2.6 с небольшими изменениями без добавления поддержки DI для всех.