簡體   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