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 для всех.

Другие вопросы по тегам