加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – 使用Spring实现REST Api

发布时间:2020-12-15 01:28:53 所属栏目:大数据 来源:网络整理
导读:编写RESTFul api应用程序的最佳实践之一是添加版本控制.例如: http://my-server/api/v1/getDatahttp://my-server/api/v2/getData 我们的应用程序使用Spring框架公开REST api.我们将类标记为Controller,使用RequestMapping注释将URL映射到函数,并添加一些转

编写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.

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

谢谢.

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

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

但我不认为添加大量分支是个好主意,
我们应该将资源类中的所有方法提取到业务接口,例如,

private IDataRetrieve dataRetriever;
@RequestMapping(method = RequestMethod.POST,@RequestBody OperationsDetailsTDO details) {
    dataRetiever = DataRetrieverFactory.getDataTrieverByVersion(version);  //TODO,create a factory to get DataRetriever
    return dataRetiever.getData();
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读