如果我在服务器请求正文中有字符串列表并遍历它们,请让正文变得通量
Get body to flux if I have list of strings in server request body and iterate over them
在我的路线中,我有一个 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?
}
}
有很多方法可以实现它。
保持简单(根据需要修改)。
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"]
}
我终于用这段代码解决了:
@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);
}
}
在我的路线中,我有一个 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?
}
}
有很多方法可以实现它。
保持简单(根据需要修改)。
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"]
}
我终于用这段代码解决了:
@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);
}
}