如果我在服务器请求正文中有字符串列表并迭代它们,则获取 body 以流动



在我的路由中,我有一个 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?
    }
}

我终于通过以下代码解决了它:

@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);
    }
}

有很多方法可以实现它。

保持简单(根据需要修改(。

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"]
}

最新更新