Jon*_*han 6 java spring spring-mvc
编写RESTFul api应用程序的最佳实践之一是添加版本控制.例如:
http://my-server/api/v1/getData
http://my-server/api/v2/getData
Run Code Online (Sandbox Code Playgroud)
我们的应用程序使用Spring框架公开REST api.我们将类标记为Controller,使用RequestMapping注释将URL映射到函数,并添加一些转换为json对象的对象.
例如:
@RequestMapping(method = RequestMethod.POST, value = "/api/v1/getData")
public @ResponseBody ResponseDataDTO getData(@RequestBody OperationsDetailsTDO details) {...}
Run Code Online (Sandbox Code Playgroud)
现在,我们想要提供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();
}
}
Run Code Online (Sandbox Code Playgroud)
它很难管理,因为在每个函数中都会有不同的分支.只是为了演示这个问题,如果我有一个生成文档的自动工具 - 它将无法理解什么是API.
其次,我想知道如何处理绑定到JSON对象的类.我是否需要复制所有这些类,以进行微小的更改?
谢谢.
我同意你将版本作为参数传递,就像
@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")
Run Code Online (Sandbox Code Playgroud)
但我认为添加大量分支不是一个好主意,我们应该将资源类中的所有方法提取到业务接口中,例如,
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();
}
Run Code Online (Sandbox Code Playgroud)
然后你需要两个类来实现 IDataRetriver(一个用于 V1,另一个用于 v2);当然,为了避免重复代码,可以为V1和V2添加一个抽象类,并使用Template Patern来去除重复代码。
| 归档时间: |
|
| 查看次数: |
2018 次 |
| 最近记录: |