【问题标题】:Forwarding request Spring RestController转发请求 Spring RestController
【发布时间】:2019-01-01 17:45:30
【问题描述】:

我有一个 Spring REST 控制器:

@RestController
@RequestMapping("v1/employee")
public class controller1 {
 getMethod(@PathVariable String param1, String param2){}
 postMethod(){}
}

我想介绍一个新的端点版本v2 来解析参数:param1,param2 并转发到v1 请求网址。

我希望新客户端能够调用v2,而旧客户端仍然能够调用v1 端点。我查看了拦截器和过滤器。所以我应该,

  1. 将请求转发到 v1,或者,
  2. 在内部调用控制器方法

有没有更好的方法来做到这一点?谢谢。

【问题讨论】:

    标签: spring rest spring-boot spring-restcontroller


    【解决方案1】:

    这实际上取决于您的应用程序的性质

    首先,控制器应该只封装HTTP相关的东西,所以业务逻辑可能是在Services中实现的。

    如果是这样,那么如果您谈论的是同一个 java 应用程序,则无需重定向请求,最好将服务注入新控制器并调用它。

    class OldController {
       MyService srv;
    
       @GetMapping(...)
       public oldGet() {
           srv.doSomething();
       }
    }
    
    class NewController {
       MyService srv;
    
       @GetMapping(...)
       public newGet() {
           srv.doSomething();
           //or 
           srv.doSomethingElse(); 
       }
    }
    

    现在,至于路由,您甚至可以在外部进行(例如在某种代理中为您重写 url 并重定向到甚至可以驻留在不同服务器上的正确控制器。 解决方案是:

    • NGNIX
    • 祖尔
    • HA 代理

    还有其他的

    【讨论】:

    • 我想避免重写控制器,而是想拦截来自新 API v2 的请求,附加 param1、param2 并将它们发送到现有控制器 v1。有没有办法做到这一点?
    • Controller 只是一个 bean,因此您可以将其注入新的控制器并直接调用,但这不是通常的设置,通常人们尝试通过在 zuul 中使用 Zuul 之类的代理以声明方式执行此操作(不同的微服务)你可以添加任何用 Java 编写的任意逻辑来“丰富”原始请求),其他解决方案也可以做到这一点,但在代码中提供较少的编程能力,更多的是关于外部配置
    • 是的,但我仍然必须为每个方法定义 URL 映射,对吗?假设 v1 控制器中有 5 个方法,那么我们需要为这 5 个方法编写 v2 版本吗?
    • 如果您知道必须以相同的方式丰富请求,您可以以声明方式进行(如添加标头、参数)。通常请求是只读的,因此您必须为此使用 HttpRequestWrapper,
    • 但是,路径不是这样的。当请求到达时,它已经“打算”由控制器(旧控制器)运行,因此您可以通过更改请求路径来更改目标控制器,这应该在请求到达您的应用程序之前完成(换句话说某种能够改变请求上下文路径的代理,也称为 url 重写)
    猜你喜欢
    • 1970-01-01
    • 2020-03-21
    • 2017-04-02
    • 2015-11-06
    • 2017-12-25
    • 1970-01-01
    • 2023-01-13
    • 2020-06-23
    • 2016-06-27
    相关资源
    最近更新 更多