代码之家  ›  专栏  ›  技术社区  ›  Samet Baskıcı

API版本控制的类型是什么?[已关闭]

  •  1
  • Samet Baskıcı  · 技术社区  · 8 年前

    API版本控制的类型是什么?如何实现它们?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Raf    8 年前

    我想说清楚,因为这个问题很复杂,所以 answer 绝对不是 only 实现的方式 project structure and versioning 。可能还有很多其他方式,我只是分享我以前使用过的相关内容。

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

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

    在里面 Layer-based project structure 您的代码的结构基于您所拥有的不同类型的层,即控制器、服务等,而 Feature-based project structure 您的代码的结构基于 features 您的系统,请阅读 here 了解更多信息。

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

    项目结构

    开始项目框架的一个非常简单的方法是看一些示例 Spring 网络应用程序。例如,我去 Spring Initializer 并选择以下选项

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

    现在,我有一个基于休息的 Spring Boot 可以用作骨架的项目,以根据 图层 。您不必使用 弹簧防尘套 但是,我想展示的是 弹簧防尘套 建议的项目结构 REST web服务。

    我通常有以下几层

    1. 控制器
    2. dao公司
    3. 服务
    4. 模型
    5. dto公司
    6. 例外
    7. 验证器
    8. util公司

    以此类推,下面是项目结构的截图

    src/main/java structure

    以及 unit test 包结构如下所示,您可以想象其他测试类的样子。

    src/test/java

    如果你有 integration test 或者你会提到它吗 end to end test 在java应用程序本身中,您需要

    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 对象,您将使用它 @RequestBody 在控制器的端点中。这个 UserOutDTO.java 使用者JAVA 出去的对象。使用DTO时

    • 您可以为系统的使用者看到的内容和您在模型中使用的内容采用不同的命名约定(即。 使用者JAVA )
    • 你可以 include exclude 传出和传入中的字段 DTOs 无需对模型/业务对象进行不必要的更改(即。 使用者JAVA )

    现在您有了DTO,如果您正在使用 GSON 那么你可以用它 Versioning 功能到 包括 排除 中的字段 用户输出到。JAVA 使用注释,例如 @Since(1.5) @Until(2.3) 自从 GSON公司 是序列化/反序列化库,或者换句话说,它转换 JSON Java Object 反之亦然,那么它有能力 包括 排除 字段之前的字段 Object 已转换为 JSON 通过编写序列化和反序列化适配器,您可以实现更多的功能。

    以下是 用户输出到。JAVA 以及如何对字段进行版本控制,以在特定版本后包括和排除字段

    public class UserOutDTO {
        @Expose
        @SerializedName("User id")
        private int id; 
        @Expose
        private String firstName; 
        @Expose
        private String lastName;
    
        /*
         * This field will become available for all requests coming for version 2.0 onwards. For a request before 
         * version 2.0 the address field won't be available.
         */
        @Expose
        @Since(2.0)
        private String address; 
    
        /*
         * This field will become available after version 3.0 an example when you extend your model
         */
        @Expose
        @Until(3.0) 
        private String nickname; 
    
        //Getters and Setters
    }
    

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