gpt4 book ai didi

java - 使用 Spring 的 REST Api 实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:06 26 4
gpt4 key购买 nike

编写 RESTFul api 应用程序的最佳实践之一是添加版本控制。例如:

http://my-server/api/v1/getData
http://my-server/api/v2/getData

我们的应用程序使用 Spring 框架公开 REST api。我们将一个类标记为 Controller ,使用 RequestMapping 注释将 URL 映射到一个函数,并添加一些与 json 对象相互转换的对象。

例如:

@RequestMapping(method = RequestMethod.POST, value = "/api/v1/getData")
public @ResponseBody ResponseDataDTO getData(@RequestBody OperationsDetailsTDO details) {...}

现在,我们要提供第二个版本的 API。大约 2/3 的功能保持不变,1/3 正在改变。逻辑和 JSON 对象都发生了变化。

我想知道如何设计代码。我认为这种代码很难管理:

@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")
public @ResponseBody ResponseDataDTO createReleaseFromTemplate(@PathVariable("version-var") Integer version, @RequestBody OperationsDetailsTDO details) {
if (version == 1)
{
doForVersion1();
}
else if (version == 2)
{
doForVersion2();
}

}

这将很难管理,因为在每个功能中都会有不同的分支。只是为了演示这个问题,如果我有一个自动生成文档的工具——它将无法理解什么是 API。

其次,我想知道我应该如何处理绑定(bind)到 JSON 对象的类。我是否需要复制所有这些类以进行微小的更改?

谢谢。

最佳答案

我同意你将版本作为参数传递,就像

@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")

但是我认为添加很多分支不是一个好主意,我们应该将资源类中的所有方法提取到一个业务接口(interface)中,比如,

private IDataRetrieve dataRetriever;
@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")
public @ResponseBody ResponseDataDTO createReleaseFromTemplate(@PathVariable("version-var") Integer version, @RequestBody OperationsDetailsTDO details) {
dataRetiever = DataRetrieverFactory.getDataTrieverByVersion(version); //TODO, create a factory to get DataRetriever
return dataRetiever.getData();
}

然后您需要两个类来实现 IDataRetriver,(一个用于 V1,另一个用于 v2);当然,为了避免重复代码,可以为V1和V2添加一个抽象类,并使用Template Patern去除重复代码。

关于java - 使用 Spring 的 REST Api 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16693196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com