Получить тело в поток, если у меня есть список строк в теле запроса сервера и перебрать их - PullRequest
0 голосов
/ 06 апреля 2019

В моем маршруте у меня есть одна конечная точка Post, для которой я ожидаю принять список строк, которые я затем обработаю в обработчике.

У меня вопрос: как я могу получить этот список строк из тела ServerRequest и перебрать их с помощью Flux?

Мой маршрутизатор

@Configuration
public class TestUrlRouter {

    @Bean
    public RouterFunction<ServerResponse> routes(TestUrlHandler handler) {
        return RouterFunctions.route(
                RequestPredicates.POST("/urls").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),
                handler::testUrls
        );
    }
}

Мой обработчик

@Component
public class TestUrlHandler {

    @Autowired
    private TestUrlService testUrlService;

    public Mono<ServerResponse> testUrls(ServerRequest request) {

        request.bodyToFlux(List.class) // how to iterate over strings?
    }
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Я наконец решил это с помощью этого кода:

@Component
public class TestUrlHandler {

    @Autowired
    private TestUrlService testUrlService;

    public Mono<ServerResponse> testUrls(ServerRequest request) {

        ParallelFlux<TestUrlResult> results = request.bodyToMono(String[].class)
                .flatMapMany(Flux::fromArray)
                .flatMap(url -> testUrlService.testUrls(url))
                .doOnComplete(() -> System.out.println("Testing of URLS is done."));

        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(results, TestUrlResult.class);
    }
}
0 голосов
/ 06 апреля 2019

Существует множество способов достижения этого.

Сохранение простоты (изменение в соответствии с вашими потребностями).

protected static class WrapperList{

        private List<String> urls;

// getter & setter
}
public Mono<ServerResponse> testUrls(ServerRequest request) {       

        return request.bodyToFlux(WrapperList.class).flatMap(wrapperList -> {
            wrapperList.getUrls().stream().forEach(System.out::println);
            return ServerResponse.ok().build();
        }).take(1).next();

    }

полезная нагрузка запроса:

{
  "urls": ["url1","url2"]
}
...