java - 使用 Spring 的 REST Api 实现

标签 java spring spring-mvc

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

相关文章:

java - Spring MVC 3中的表单提交-解释

spring - 使用 Spring security 配置 Spring MVC 应用程序的好习惯是什么?

java - Web 服务 - Tomcat - 代理后面 - wsdl 位置

java - where 子句中的未知列 'sunny'

java - 如何在 Java 中只接受具有特定字符的字符串

java - 如何为 Spring 数据 JPA REST 启用 Post/Put 方法? ("error 405 : method not allowed")

java - 在 Webview 上启用 GeoLocation

java - Spring Security - 角色在 HttpServletRequest 中不可访问,除非通过 mappableAuthorities 指定

spring - 通过向表添加行在 thymeleaf 中创建动态列表对象

java - 在服务层获取当前用户