API版本控制的类型有哪些?

时间:2018-04-22 01:04:42

标签: java spring rest api web-services

API版本控制有哪些类型以及如何实现它们?

1 个答案:

答案 0 :(得分:0)

为了清楚起见,因为问题非常重要,因此answer绝不是only实现project structure and versioning的方法。可能还有很多其他方式,我只是分享我之前使用的相关内容。

显然,构建代码库有不同的方法,即

  • 基于图层的项目结构
  • 基于特征的项目结构

Layer-based project structure中,您的代码是根据您拥有的不同类型的图层(即控制器,服务等)构建的,而在Feature-based project structure中,您的代码是基于系统的features构建的,阅读here了解更多信息。

网上有很多资源可以展示不同类型的包结构,我个人坚持使用layer-based project structure因为我更喜欢根据layers而不是功能来组织我的代码库。

项目结构

开始使用项目框架的一个非常简单的方法是查看一些示例Spring webapps。例如,我转到Spring Initializer并选择以下

  • 项目名称(即myproj)
  • 组名(即com)
  • 选择模块(即REST,JPA等)
  • 生成

现在,我有一个基于REST的Spring Boot项目,我可以将其用作骨架,根据我的layers进行自定义。您不必使用Spring Boot,但我想要展示的是Spring Boot推荐REST网络服务的项目结构。

我通常有以下图层

  1. controller
  2. 服务
  3. 模型
  4. DTO
  5. 例外
  6. 验证
  7. util的
  8. 依此类推,这里是项目结构如何的截图

    src/main/java structure

    unit test包结构如下所示,您可以想象其他测试类的外观如何。

    src/test/java

    如果你有integration test或者你在java应用程序本身中引用它end to end test,那么你需要

    src/integ-test/java 
    src/integ-test/resources
    

    端点版本控制

    版本端点可能有不同的方法。我之前使用的一种方法是GSON's versioning support,它可能适用于您,也可能不适合您,但无论如何都要在此分享。 如果你在上面的截图中注意到有以下包

    com.myproj.dto.inbound 
    com.myproj.dto.outbound 
    

    DTO代表Data Transfer Object,如上所示,UserInDTO.java表示请求中包含的User.java对象,您将使用{{1}在控制器的端点中。 @RequestBody表示已发出的UserOutDTO.java对象。使用DTO时

    • 您可以针对系统使用者看到的内容以及您在模型中使用的内容采用不同的命名约定(例如User.java
    • 您的传出和传入User.java中的includeexclude字段可以不对您的模型/业务对象进行不必要的更改(即DTOs

    现在您已经拥有了DTO,如果您使用的是User.java,那么您可以将GSON功能用于Versioninginclude字段exclude 1}}使用UserOutDTO.java@Since(1.5)等注释。由于@Until(2.3)是序列化/反序列化库,或者换句话说它将GSON转换为JSON,反之亦然,因此它可以Java Objectinclude exclude之前的字段转换为Object,您可以在编写序列化和反序列化适配器的帮助下实现更多目标。

    以下是JSON的示例以及如何对字段进行版本化以在特定版本之后包含和排除

    UserOutDTO.java

    我希望这有帮助。你也可以查看这个问题,有很多非常有用的答案Package structure for a Java project?