繁体   English   中英

如何使用 Spring Reactive 和 WebFlux 将请求转发到不同的 rest controller

[英]How to forward a request to a different rest controller with Spring Reactive and WebFlux

我正在尝试将请求从 WebFlux RestContoller 转发到不同的内部端点。

我不想向客户端发送重定向,而是让不同的 controller 处理当前请求。 请参阅下面的代码:

@RestController
public class MyController {
  
   @PostMapping("/start")
   public Mono<MyReponse> start() {
          return myService.retrieveSomething().flatMap(something -> {
               if(something.isBlank()){
                  retrun createMyResponse(); // returns Mono<MyResponse>
               } else {
                  // forward to "/continue"
               }
           });
   }
}

@RestController
public class MyOtherController {
       
       @PostMapping("/continue")
       public Mono<MyReponse> continue() {
           // do something and return Mono<MyResponse> 
       }
}

使用 Spring Servlet,我会做类似的事情:

protected void start(HttpServletRequest req, HttpServletResponse resp) {
    RequestDispatcher dispatcher = getServletContext()
      .getRequestDispatcher("/continue");
    dispatcher.forward(req, resp);
}

是否可以在 Spring Reactive with WebFlux 中做同样的事情? 查看了官方文档,但找不到示例。 我尝试使用 DispatcherHandler、ServerWebExchange、ServerHttpRequest、ServerHttpResponse 等对象,但找不到解决方案。

您可以使用 Spring WebFlux 函数端点,它是“轻量级函数式编程 model,其中函数用于路由和处理请求”。

@Bean
RouterFunction<ServerResponse> startRoute() {
    return route(POST("/start"), req -> startHandler(req));
}

@Bean
RouterFunction<ServerResponse> continueRoute() {
    return route(POST("/continue"), req -> continueHandler(req));
}

Mono<ServerResponse> startHandler(ServerRequest serverRequest) {
    return myService.retrieveSomething()
            .flatMap(something -> {
                if (something.isBlank()){
                    ...
                } else {
                    return continueHandler(serverRequest);
                }
            });
}

Mono<ServerResponse> continueHandler(ServerRequest serverRequest) {
   ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM