【问题标题】:Is it good practice to directly call REST endpoint (method) from another REST endpoint of same controller?从同一控制器的另一个 REST 端点直接调用 REST 端点(方法)是一种好习惯吗?
【发布时间】:2019-03-23 22:12:57
【问题描述】:

我有一个具有多个端点的 Spring REST 控制器类。直接从另一个端点调用端点方法是一种好习惯吗?

我在谷歌上搜索过,但没有找到任何解决此问题的最佳做法的答案。

@RestController
public class DataContoller {

    @GetMapping("/dataA/{param}")
    public ResponseEntity getDataA(@PathVariable String param) {
     // logic to fetch data A
     return ResponseEntity.ok("A");  
    }

    @GetMapping("/dataB/{param}")
    public ResponseEntity getDataB(@PathVariable String param) {
     ResponseEntity response = getDataA("test");
     String result = response.getBody();
     return ResponseEntity.ok("B" + result);  
    }

}

原则上它可以工作,因为它只是另一个方法的方法调用,但我想知道这是否是一个好习惯。如果它不是很好的做法,那么理想的方法是什么。一种选择是使用 RestTemplate。这是唯一的选择吗?

【问题讨论】:

  • 不,不是。而且我认为这没有任何意义。这就是你想要做的意味着你有两个端点做同样的事情
  • 嗨 Jens - 上面的代码可能不是一个很好的例子,但我遇到了实际情况,即一个端点需要调用另一个端点,因为它需要数据才能继续。
  • 你应该在服务层处理它
  • 如果两个方法需要获取相同的数据,方法相同,那么提取一个方法fetchData,放到一个服务中,将服务注入到你的控制器中,然后从两者中调用方法控制器方法。方法A不需要方法B创建的ResponseEntity。他们只需要获取相同的数据。

标签: java spring rest controller


【解决方案1】:

没那么糟,但也不好。

问题是直接调用getDataA("test") 会跳过通常在此控制器方法之前的所有内容:安全检查、验证、过滤、日志记录、映射或任何其他类型的数据操作。

它引入了不稳定性:您不确定来自什么数据,以及它真正来自哪里。它是来自我的内部方法,还是 HTTP 调用?

一个非常简单的建议是有一个服务方法getDataA 并从两个控制器的方法中调用它。但是,正如您已经注意到的,它并没有完全取代 HTTP 请求。

【讨论】:

  • 感谢安德鲁的评论。即使我将逻辑移动到服务层并调用服务层方法而不是控制器,这仍然意味着我正在跳过安全检查、验证、日志记录或映射。我的观点是从另一个控制器方法调用一个控制器方法看起来很难看,如果一个方法只对另一个方法的结果感兴趣,那么为什么不直接调用控制器方法。
  • 我同意你在评论中途所说的,但我不同意这部分skips everything that normally precedes this controller's method: security checks, validation, filtering, logging, mapping, or any other kind of data manipulation。理想情况下,控制器应该只处理将 http 请求委托给服务级别而不执行任何其他功能。还有其他组件可以达到此目的。
  • @Aris_Kortex 我们在说同样的事情。 “一切”是指“任何其他组件”——我强烈反对将安全/过滤/等责任放在控制器身上。
猜你喜欢
  • 2016-06-09
  • 2019-09-02
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多