Spring Boot 从Sping Boot Web UI调用外部API

bq3bfh9z  于 2022-12-23  发布在  Spring
关注(0)|答案(1)|浏览(151)

我有Spring Boot WebMVC应用程序(使用Thymeleaf),它正在从直接数据库连接转向对另一个服务的API调用。我想知道调用API并向用户显示结果的最佳架构是什么。将RestTemplate放在Service类中更好,还是放在Controller类中更好(特别是在考虑错误处理的时候)?另外,即使WebClient没有使用WebFlux,它会比RestTemplate更好吗?
以下是我目前的想法:
实体:

public class Entity {
    public String id;
    public String name;
    ...
}

服务:

public class EntityService {
    @Autowired
    private RestTemplate restTemplate;

    public List<Entity> getAllEntities() {
        return restTemplate.getForObject("https://localhost.com:8081/entities", Entity.class);
    }
}

控制器:

public class EntityController {
    @Autowired
    private EntityService entityService;

    @GetMapping("/entities")
    public String getAllEntities(Model model) {
        model.addAttribute(entityList, entityService.getAllEntities())
        return "entity"
    }
}

超文本:

<!-- entity.html -->

<head>
...
</head>
<body>    
    <div th:each="entity : #{entityList}">
        <label th:text="${entity.id}"/>
        <label th:text="${entity.name}"/>
    </div>
</body>
qacovj5a

qacovj5a1#

“这要看情况”是你所有问题的答案:)
因此,要找到答案,你需要考虑你的应用程序,它会变得多大,以及在它成熟的时候你将如何控制它。我会考虑的事情是:

  • 您的应用将进行多少次上游API调用?如果只有1次且几乎没有业务逻辑,则Service层可能会增加干扰,然而,如果你开始做一些事情,而不仅仅是直接显示bean属性,那么Controller中的代码越少,应用程序对下一个人就越清晰。并处理响应代码、报头等内容,所以我通常将if移到服务层。
  • RestTemplateWebClient通常是一个很大的干扰。如果你使用传统的阻塞Sping Boot ,使用RestTemplate,如果你使用Reactive,则使用WebClient。从应用程序代码的Angular 来看,这并不重要,如果你已经考虑好了应用程序架构,用另一个替换一个通常不是一个巨大的工作。

另一件事-尽量避免controller包、service包和model包,将所有这些东西在业务上下文中组合在一起-在本例中是Entity,但我们都知道将有服务、控制器、模型等。
你真的不想在controller包中有300个控制器类,最好是以一种对用户或应用程序的产品所有者有意义的方式将它们分组在一起。
我最后的建议是,不要害怕随着应用程序的发展而改变。确保你的测试足够可靠,这样你就可以在应用程序发展的过程中重构应用程序。比如用其他东西替换RestTemplate,改变应用程序的结构等等。

相关问题