• Swagger使用总结


    1. Swagger是什么?

    官方说法:Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

    个人觉得,swagger的一个最大的优点是能实时同步api与文档。在项目开发过程中,发生过多次:修改代码但是没有更新文档,前端还是按照老旧的文档进行开发,在联调过程中才发现问题的情况(当然依据开闭原则,对接口的修改是不允许的,但是在项目不稳定阶段,这种情况很难避免)。

    2. spring boot 集成 Swagger

    目前维护的系统是基于springboot框架开发的,因此本文会详细描述springboot与swagger集成的过程。

    spring-boot系统集成swagger需要进行如下操作:

    1. 添加maven依赖,需要在系统的pom中添加如下依赖:

      gradle:compile('io.springfox:springfox-swagger2:2.2.2')
       <dependency>
          <groupId>io.springfox</groupId>
          <artifactId>springfox-swagger2</artifactId>
          <version>2.2.2</version>
       </dependency>
      
    2. 添加swagger配置文件,配置文件如下:

    3. import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;

      import springfox.documentation.builders.PathSelectors;
      import springfox.documentation.builders.RequestHandlerSelectors;
      import springfox.documentation.spi.DocumentationType;
      import springfox.documentation.spring.web.plugins.Docket;
      import springfox.documentation.swagger2.annotations.EnableSwagger2;

      @Configuration
      @EnableSwagger2
      public class SwaggerConfig {
      
      <span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Bean</span></span>
      <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span><span class="hljs-function"> Docket </span></span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">api</span></span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">()</span></span></span><span class="hljs-function"> </span></span>{
          <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span> Docket(DocumentationType.SWAGGER_2)
                  .select()  <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 选择那些路径和api会生成document</span></span>
                  .apis(RequestHandlerSelectors.any()) <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 对所有api进行监控</span></span>
                  .paths(PathSelectors.any()) <span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 对所有路径进行监控</span></span>
                  .build();
      }
      

      }

      通过注解EnableSwagger2声明Swagger的可用性,此处会定义一个类型为Docket的bean,
      关于docket类的说明如下:

      A builder which is intended to be the primary interface into the swagger-springmvc framework.Provides sensible defaults and convenience methods for configuration.

      Docket的select()方法会提供给swagger-springmvc framework的一个默认构造器(ApiSelectorBuilder),这个构造器为配置swagger提供了一系列的默认属性和便利方法。

    4. 测试

      通过访问:http://localhost:8080/your-app-root/v2/api-docs ,能测试生成的api是否可用。此时返回的是一个json形式的页面,可读性不好。可以通过Swagger UI来生成一个可读性良好的api页面。具体做法就是,在pom中添加相关依赖。如下:

      <dependency>
          <groupId>io.springfox</groupId>
          <artifactId>springfox-swagger-ui</artifactId>
          <version>2.2.2</version>
      </dependency>
    5.   gradle:  compile('io.springfox:springfox-swagger-ui:2.2.2')
    6. 再次访问:http://localhost:8080/your-app-root/swagger-ui.html 就可以看到可读性较好的api文档页面。

    7. 注意:

      1. http://localhost:8080/your-app-root/v2/api-docs 中your-app-root指的你的wabapp的根路径,我目前的webapp就默认在根路径下,所以地址是:http://localhost:8080/v2/api-docs
      2. spring-mvc上引用swagger需要做其他相关的配置,具体请查看参考文献
      3. swagger对restful风格的api支持的比较好,非restful风格的api支持的不是很好,对于非restful风格的api或者其他语言(非java语言)可以采用 http://editor.swagger 编辑器来收工完成相关的API编写
      4. SpringBoot 配置SwaggerUI 访问404的小坑。

        在学习SpringBoot构建Restful API的时候遇到了一个小坑,配置Swagger UI的时候无法访问。

        首先在自己的pom文件中加入Swagger的依赖,如下所示:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger-ui</artifactId>
              <version>2.2.2</version>
            </dependency>
         
            <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger2</artifactId>
              <version>2.2.2</version>
        </dependency>

        然后在新建一个SwaggerConfig类:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        Configuration
        @EnableSwagger2
        public class SwaggerConfig {
          @Bean
          public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.nightowl"))
                .paths(PathSelectors.any())
                .build();
          }
          private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                .title("NightOwl RESTful APIs")
                .description("关注我 http://hwangfantasy.github.io/")
                .termsOfServiceUrl("http://hwangfantasy.github.io/")
                .contact("颜艺学长")
                .version("1.0")
                .build();
          }
        }

        最后在自己的Controller中加上一系列的API注解即可,其实不需要加上API注解也可以正常使用。 
        最后在localhost:8080/swagger-ui.html 访问即可看到swagger页面了。

        但是关键来了,我第一次按照这样的方法配置却提示如下错误:

        1
        2
        3
        4
        5
        6
        7
        Whitelabel Error Page
         
        This application has no explicit mapping for /error, so you are seeing this as a fallback.
         
        Thu Nov 24 19:57:13 CST 2016
        There was an unexpected error (type=Not Found, status=404).
        No message available

        但是我新建一个项目重新配置却没有任何问题,于是想到自己的项目中肯定有哪些配置与swagger冲突了, 
        最后发现在 application.properties 中把

        1
        spring.resources.static-locations=classpath:/static/

        这一行注释掉即可访问了。

        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

         

        原文链接:http://blog.csdn.net/hwangfantasy/article/details/66542602

    参考文献

    1. swagger-2-documentation-for-spring-rest-api
    原文地址:https://www.cnblogs.com/h9527/p/5506956.htm
  • 相关阅读:
    bzoj1045: [HAOI2008] 糖果传递(数论)
    bzoj1083: [SCOI2005]繁忙的都市(最小生成树)
    bzoj1079: [SCOI2008]着色方案(DP)
    BZOJ2467 [中山市选2010]生成树
    BZOJ4766 文艺计算姬
    BZOJ4894 天赋
    BZOJ2560 串珠子
    [SDOI2014]重建
    BZOJ3622 已经没有什么好害怕的了
    [SDOI2016]储能表
  • 原文地址:https://www.cnblogs.com/jpfss/p/11438372.html
Copyright © 2020-2023  润新知