как использовать конечную точку webflux для создания потоков json из React - PullRequest
0 голосов
/ 23 мая 2019

Я хочу узнать, как использовать WebFlux restcontroller, генерирующий потоки json из React.Моя первая попытка заставила меня разобраться с текстом вместо json, но у меня было ощущение, что я делаю что-то странное.Я решил посвятить себя чтению примеров и нашел пример, возвращающий org.reactivestreams.Publisher вместо WebFlux.

Я нашел немного старую тему, которая могла бы мне помочь ( Невозможно использовать потоковый ответ Webflux в клиенте React-Native ), но у него нет единственного ответа.Ну, это заставило меня где-то прочитать, что React может не соответствовать Reactive, но это был очень старый пост.

Взяв образец из интернета, если вы посмотрите на https://developer.okta.com/blog/2018/09/25/spring-webflux-websockets-react, в основном вы найдете:

WebFlux, производящий Json, НО НЕ СТРИММИНГ:

RestController producing MediaType.APPLICATION_JSON_VALUE and returning org.reactivestreams.Publisher<the relevant pojo> 

Реакция потребляет json:

 async componentDidMount() {
    const response = await fetch('relevant url');
    const data = await response.json();
  }

Я пробовал аналогичный подход, но с двумя существенными отличиями:

Я возвращаю MediaType.TEXT_EVENT_STREAM_VALUE, потому что считаю, что должен предпочесть возвратные потоки, так как я работаю с не блокирующим кодом и вместо возврата org.reactivestreams.Publisher я понимаю, что имеет больше смысла возвращать Webflux, чтобы правильно использовать преимуществаSpring 5 +.

мой контроллер покоя Webflux:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.mybank.web.model.Loans;
import com.mybank.web.service.LoansService;

import reactor.core.publisher.Flux;

@RestController
public class LoansController {
    @Autowired
    private LoansService loansService;

    @CrossOrigin
    @RequestMapping(method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @ResponseBody
    public Flux<Loans> findAll() {
        Flux<Loans> loans = loansService.findAll();
        return loans;
    }
}

Результат - поток, а не JSON (скопировано из Почтальона):

data:{"timestamp":1558126555269,"result":"8"}

data:{"timestamp":1558132444247,"result":"10"}

data:{"timestamp":1558132477916,"result":"10"}

data:{"timestamp":1558132596327,"result":"14"}

Стек основан на загрузке MongoDb и Spring, но я не собираюсь вставлять сюда, поскольку он не имеет отношения.

Реагирует

  async componentDidMount() {
    const response = await fetch('http://localhost:8080');
    const data = await response.json();
  }

Я получаю "Uncaught (в обещании) SyntaxError: Неожиданный токен d в JSON в позиции 0 "по очень очевидной причине: я не возвращаю допустимый json.

Затем, если я изменю контроллер Webflux для получения json (yield = MediaType.APPLICATION_JSON_VALUE) ответ контроллера остальной части звука не дает мне ни потока, ни результата из кода без блокировки.

[
    {
        "timestamp": 1558126555269,
        "result": "8"
    },
    {
        "timestamp": 1558132444247,
        "result": "10"
    },
    {
        "timestamp": 1558132477916,
        "result": "10"
    },
    {
        "timestamp": 1558132596327,
        "result": "14"
    }
]

С таким ответом интерфейс React может анализироваться, но я понимаю, что не использую преимущества потоковой передачи.Кто-то может поспорить, что для такого простого примера бесполезно мыслить в потоковом режиме, но моя цель обучения действительно сосредоточена на правильном понимании и кодировании с помощью webflux + реагирующих потребляющих потоков.

Наконец, после чтения https://spring.io/blog/2017/02/23/spring-framework-5-0-m5-update я изменилсяWebFlux Restcontroller, чтобы произвести APPLICATION_STREAM_JSON_VALUE, а также я попытался производит = "application / stream + json".Для обоих предположений ответ restcontroller кажется потоком json, но опять же React жалуется:

{"timestamp":1558126555269,"result":"8"}
{"timestamp":1558132444247,"result":"10"}
{"timestamp":1558132477916,"result":"10"}
{"timestamp":1558132596327,"result":"14"}

Ошибка в стороне реакции:

Unexpected token { in JSON at position 41

Подводя итог: я не нашел, как потреблятьот React Webflux Restcontroller, создающего потоки Json.

Возможно, возможный ответ «изменить React с помощью этой библиотеки и использовать его таким образом», или, возможно, ответ «закодируйте Webflux Restcontroller для возврата в этом формате».Кстати, после прочтения всех примеров, которые я нашел в теме React + Webflux, я застрял.

Другими словами, мой прямой вопрос: как использовать конечную точку webflux для создания потоков json из React?

...