Нет данных, полученных от конечной точки при использовании Spring WebClient, но я могу использовать curl для извлечения данных - PullRequest
0 голосов
/ 23 мая 2019

У меня есть конечная точка, которая отправляет события на стороне сервера. В целях тестирования я сделал конечную точку детерминированной, и соединение с конечной точкой прерывается через 30 секунд. Если я сверну конечную точку, я получу все данные, как и ожидалось:

$ curl "my/end/point"
data: {"message": "event1"}

data: {"message": "event2"}

data: {"message": "event3"}

data: {"message": "event4"}

...

Однако, когда я использую Springs WebClient, данные не принимаются. Код, который я использую:

final WebClient webClient = WebClient.create("my/end/point");
final String result = webClient.get()
                               .retrieve()
                               .bodyToFlux(String.class)
                               .blockFirst();
System.out.println(result);

Когда я запускаю этот код, через 30 секунд я получаю следующий результат:

null

Код ответа на запрос - 200 OK.

Следующий пример

final StringBuilder result = new StringBuilder();
final URL url = new URL("my/end/point");
final URLConnection conn = url.openConnection();
final BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
    result.append(line);
}
rd.close();
System.out.println(result.toString());

показывает ожидаемый результат через 30 секунд при запуске

data: {"message": "event1"}

data: {"message": "event2"}

...

Кто-нибудь знает, почему результат из WebClient пуст, а другие методы извлечения данных из конечной точки - нет? Я использую Java 11 и Spring-WebFlux версии 5.1.5.

1 Ответ

0 голосов
/ 24 мая 2019

Я решил проблему, вместо того, чтобы

final WebClient webClient = WebClient.create("my/end/point");

делает

final WebClient webClient = WebClient.builder()
                                     .clientConnector(new ReactorClientHttpConnector(HttpClient.create()))
                                     .baseUrl(this.legalThingsSocketSettings.getUrl())
                                     .build();

работает, хотя я немного запутался, почему, потому что ReactorClientHttpConnector должен быть клиентским соединителем по умолчанию WebClient.

...