Я хочу узнать, как использовать 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?