代码之家  ›  专栏  ›  技术社区  ›  Dherik Pascal Sancho

如何设置SpringFox以使用SpringBoot显示两个(或更多)版本的RESTAPI?

  •  1
  • Dherik Pascal Sancho  · 技术社区  · 5 年前

    我正在尝试找出如何使用SpringFox管理两个(或更多)版本的API端点。

    为了版本我的API,我正在使用 Versioning through content negotiation 也知道 Versioning using Accept header . 使用头信息单独控制每个端点的版本。例如,对于版本1,我使用属性 produces :

    @Override
    @PostMapping(
            produces = "application/vnd.company.v1+json")
    public ResponseEntity<User> createUser(
    

    对于第二版,我使用:

    @Override
    @PostMapping(
            produces = "application/vnd.company.v2+json",
            consumes = "application/vnd.company.v2+json")
    public ResponseEntity<User> createUserVersion2(
    

    我不使用 consumes 对于第一个(v1)版本,因此如果客户端仅使用 application/json 调用时,默认情况下将调用第一个版本。

    我想在招摇过市的用户界面上显示这两个版本。如何做到这一点?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Dherik Pascal Sancho    5 年前

    这很简单。只需为每个版本创建一个摘要。

    例如,第一个版本:

    @Bean
    public Docket customImplementation(
            @Value("${springfox.documentation.info.title}") String title,
            @Value("${springfox.documentation.info.description}") String description) {
    
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo(title, description, "1.0"))
                .groupName("v1")
                .useDefaultResponseMessages(false)
                .securitySchemes(newArrayList(apiKey()))
                .pathMapping("/api")
                .securityContexts(newArrayList(securityContext())).select()
                .apis(e -> Objects.requireNonNull(e).produces().parallelStream()
                        .anyMatch(p -> "application/vnd.company.v1+json".equals(p.toString())))
                .paths(PathSelectors.any())
                .build();
    }
    

    对于第二版:

    @Bean
    public Docket customImplementationV2(
            @Value("${springfox.documentation.info.title}") String title,
            @Value("${springfox.documentation.info.description}") String description) {
    
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo(title, description, "2.0"))
                    .groupName("v2")
                    .select()
                    .apis(e -> Objects.requireNonNull(e).produces()
                            .parallelStream()
                            .anyMatch(p -> "application/vnd.company.v2+json".equals(p.toString())))
                    .build();
    }
    

    这里的秘密是按 produces 属性。

    Swagger UI将在组合框中显示两个版本:

    enter image description here

    此代码需要在用注释的类上 @Configuration . 你还需要用 @EnableSwagger2 .