美文网首页框架学习使用springbootJAVA
SpringBoot中的Swagger是如何实现的

SpringBoot中的Swagger是如何实现的

作者: 程序员札记 | 来源:发表于2021-12-20 10:43 被阅读0次

    开发者或多或少都被接口文档折磨过,经常会遇到接口文档与实际的情况不符,而接口开发人员又觉得编写及维护接口文档会耗费不少精力,经常来不及更新,所以无论是接口使用者或开发者都希望能有一个好的接口文档。而Swagger就是解决这一痛点的解决方案,也是很多开发者都接触过的一个方案。Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。

    那Swagger是如何实现这些功能的呢?这篇文章将介绍SpringBoot基于swagger-jersey2-jaxrs实现的Swagger,而不是Spring MVC。

    源码解析

    在SpringBoot启动的时候会添加注解来启动和配置Swagger,如下的例子

    
    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
      @Bean
      @Primary
      public SwaggerResourcesProvider getSwaggerResourcesProvider() {
        return () -> {
          SwaggerResource jerseySwaggerResource = new SwaggerResource();
          jerseySwaggerResource.setLocation("/api/swagger.json");
          jerseySwaggerResource.setSwaggerVersion("3.0");
          jerseySwaggerResource.setName("PatchConfig");
    
          return Collections.singletonList(jerseySwaggerResource);
        };
      }
    }
    

    配置接口扫描路径

    @Configuration
    @ApplicationPath("/api")
    public class PatchCfgResourceConfig extends ResourceConfig {
    
      private final Feature jerseyOperationalFeature;
      
      @Inject
      public PatchCfgResourceConfig(@Named("jersey-operational-feature") Feature jerseyOperationalFeature){
          this.jerseyOperationalFeature = jerseyOperationalFeature;
      }
    
      @PostConstruct
      public void init() {
        register(XXXCfgResource.class);
        register(JobResource.class);
        register(PatchCfgResource.class);
        configSwagger();
      }
    
      private void configSwagger() {
        this.register(ApiListingResource.class);
        this.register(SwaggerSerializers.class);
        BeanConfig config = new BeanConfig();
        config.setConfigId("patch-config");
        config.setTitle("Patch Config REST API");
        config.setVersion("v1");
        config.setSchemes(new String[]{"http", "https"});
        config.setBasePath("/api");
        config.setResourcePackage("com.sample.resources");
        config.setPrettyPrint(true);
        config.setScan(true);
      }
    }
    

    io.swagger.jaxrs.config.BeanConfig.setScan(true)方法会直接启动swagger去扫描相关的class,比如Path, SwaggerDefinition, Api等等,追踪代码后,会看到调用classes方法。


    classes方法

    在SpringBoot应用程序启动后,我们可以访问/swager-ui.html查看swagger的UI页面,会有相关的接口和文档信息


    Swagger UI例子

    这时我们打开浏览器开发者工具查看网络调用可以发现几个关键的http访问


    image.png

    /swagger-resource 的返回信息如下,这些其实就是上面配置过的信息


    swagger-resource

    springfox.documentation.swagger.web.ApiResourceController 定义了/swagger-resource相关的API接口来返回我们定义的配置类SwaggerResourcesProvider


    ApiResourceController

    第二个前端UI请求的接口为/api/swagger.json,这个也是上面配置过的url,这个API则由io.swagger.jaxrs.listing.ApiListingResource来处理


    swagger.json

    返回的信息如下


    swagger.json

    在ApiResourceController中有一个方法getListingJsonResponse,跟踪下去可以看到scan方法


    scan

    在上面我们配置过的io.swagger.jaxrs.config.BeanConfig是实现Scanner接口的,在启动时会调用classes,而这里也调用的classes,此时就会返回SpringBoot应用配置过的API接口信息给前端UI了。这就是Swagger在SpringBoot中从启动到UI展示接口信息的流程和原理了。

    相关文章

      网友评论

        本文标题:SpringBoot中的Swagger是如何实现的

        本文链接:https://www.haomeiwen.com/subject/uyxifrtx.html