• Swagger使用详解


    一、简介

    前言

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

    Why Swagger?

    当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成,在这种开发模式下,维持一份及时更新且完整的 Rest API 文档将会极大的提高我们的工作效率。传统意义上的文档都是后端开发人员手动编写的,这种方式很难保证文档的及时性,这种文档久而久之也就会失去其参考意义,反而还会加大我们的沟通成本。而 swagger 给我们提供了一个全新的维护 API 文档的方式

    作为后端开放人员,最烦的事就是自己写接口文档和别人没有写接口文档,不管是前端还是后端开发,多多少少都会被接口文档所折磨,前端会抱怨后端没有及时更新接口文档,而后端又会觉得编写接口文档太过麻烦。Swagger 可以较好的接口接口文档的交互问题,以一套标准的规范定义接口以及相关的信息,就能做到生成各种格式的接口文档,生成多种语言和客户端和服务端的代码,以及在线接口调试页面等等。只需要更新 Swagger 描述文件,就能自动生成接口文档,做到前端、后端联调接口文档的及时性和便利性

    作用
    1.支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便

    2.提供 Web 页面在线测试 API:Swagger 生成的文档支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口

    二、SwaggerTest项目搭建

    1. pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>com.swaggergroupId>
    7. <artifactId>SwaggerTestartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <maven.compiler.source>8maven.compiler.source>
    11. <maven.compiler.target>8maven.compiler.target>
    12. properties>
    13. <dependencies>
    14. <dependency>
    15. <groupId>org.springframework.bootgroupId>
    16. <artifactId>spring-boot-starterartifactId>
    17. <version>2.2.6.RELEASEversion>
    18. dependency>
    19. <dependency>
    20. <groupId>org.springframework.bootgroupId>
    21. <artifactId>spring-boot-starter-webartifactId>
    22. <version>2.2.6.RELEASEversion>
    23. dependency>
    24. <dependency>
    25. <groupId>org.projectlombokgroupId>
    26. <artifactId>lombokartifactId>
    27. <version>1.18.24version>
    28. dependency>
    29. <dependency>
    30. <groupId>io.springfoxgroupId>
    31. <artifactId>springfox-spring-webartifactId>
    32. <version>2.9.2version>
    33. dependency>
    34. <dependency>
    35. <groupId>io.springfoxgroupId>
    36. <artifactId>springfox-swagger2artifactId>
    37. <version>2.9.2version>
    38. dependency>
    39. <dependency>
    40. <groupId>io.springfoxgroupId>
    41. <artifactId>springfox-swagger-uiartifactId>
    42. <version>2.9.2version>
    43. dependency>
    44. dependencies>
    45. project>

    2. entity类

    1. package com.swagger.entity;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @Data
    6. @AllArgsConstructor
    7. @NoArgsConstructor
    8. public class User {
    9. private Long id;
    10. private String name;
    11. private int age;
    12. }

    3. controller层

    1. package com.swagger.controller;
    2. import com.swagger.entity.User;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.*;
    5. @RestController
    6. @RequestMapping("/user")
    7. public class UserController {
    8. @GetMapping("/getByName")
    9. public String getByName(){
    10. return "访问getByName成功";
    11. }
    12. @PostMapping("/login")
    13. public String login(@RequestBody User user){
    14. return "登录成功";
    15. }
    16. }

    三、基本使用

    1. 导入相关依赖

    1. <dependency>
    2. <groupId>io.springfoxgroupId>
    3. <artifactId>springfox-spring-webartifactId>
    4. <version>2.9.2version>
    5. dependency>
    6. <dependency>
    7. <groupId>io.springfoxgroupId>
    8. <artifactId>springfox-swagger2artifactId>
    9. <version>2.9.2version>
    10. dependency>
    11. <dependency>
    12. <groupId>io.springfoxgroupId>
    13. <artifactId>springfox-swagger-uiartifactId>
    14. <version>2.9.2version>
    15. dependency>

    2. 编写配置文件

    1. @Configuration // 配置类
    2. @EnableSwagger2 // 开启 swagger2 的自动配置
    3. public class SwaggerConfig {
    4. }

    这个时候 Swagger 已经算是整合到项目之中了,可以启动下服务,输入:http://localhost:8080/swagger-ui.html# 即可查看Swagger文档,可以看到如下信息

    • 基本信息
    • 接口信息
    • 实体类信息

    2.1 配置基本信息

    Swagger 在自己的实例Docket中可以设置自定义基本信息于ApiInfo对象中,下图为Swagger默认的基本信息

    ApiInfo中默认的基本信息

    • title:Api Documentation
    • description:Api Documentation
    • version:1.0
    • termsOfServiceUrl:urn:tos
    • contact:无
    • license:Apache 2.0
    • licenseUrl:http://www.apache.org/licenses/LICENSE-2.0

    这些信息都不是我们需求的,我们可以在Swagger配置文件中去配置属于我们自己项目的接口文档信息,代码如下

    1. package com.swagger.config;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import springfox.documentation.builders.ApiInfoBuilder;
    5. import springfox.documentation.service.ApiInfo;
    6. import springfox.documentation.service.Contact;
    7. import springfox.documentation.spi.DocumentationType;
    8. import springfox.documentation.spring.web.plugins.Docket;
    9. import springfox.documentation.swagger2.annotations.EnableSwagger2;
    10. @Configuration // 配置类
    11. @EnableSwagger2 // 开启 swagger2 的自动配置
    12. public class SwaggerConfig {
    13. @Bean
    14. public Docket docket() {
    15. // 创建一个 swagger 的 bean 实例
    16. return new Docket(DocumentationType.SWAGGER_2)
    17. // 配置基本信息
    18. .apiInfo(apiInfo());
    19. }
    20. // 基本信息设置
    21. private ApiInfo apiInfo() {
    22. Contact contact = new Contact(
    23. "Keke", // 作者姓名
    24. "https://blog.csdn.net/m0_63732435?spm=1011.2124.3001.5343", // 作者网址
    25. "1781125992@qq.com"); // 作者邮箱
    26. return new ApiInfoBuilder()
    27. .title("SwaggerTest-接口文档") // 标题
    28. .description("这是关于Swagger学习测试的接口文档") // 描述
    29. .termsOfServiceUrl("https://www.baidu.com") // 跳转连接
    30. .version("1.0") // 版本
    31. .license("Swagger-的使用(详细教程)")
    32. .licenseUrl("https://blog.csdn.net/m0_63732435/article/details/133689227?spm=1001.2014.3001.5501")
    33. .contact(contact)
    34. .build();
    35. }
    36. }

    重新启动服务,效果如下

    2.2 配置接口信息

    默认情况下,Swagger是会展示所有的接口信息的,包括最基础的basic-error相关接口

    有时候我们希望不要展示 basic-error-controller 相关的接口,或者有其他需求,可以看以下代码和注释理解运用

    1. @Bean
    2. public Docket docket() {
    3. // 创建一个 swagger 的 bean 实例
    4. return new Docket(DocumentationType.SWAGGER_2)
    5. //配置基本信息
    6. .apiInfo(apiInfo())
    7. // 配置接口信息
    8. .select() // 设置扫描接口
    9. // 配置如何扫描接口
    10. .apis(RequestHandlerSelectors
    11. //.any() // 扫描全部的接口,默认
    12. //.none() // 全部不扫描
    13. .basePackage("com.swagger.controller") // 扫描指定包下的接口,最为常用
    14. //.withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
    15. //.withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口
    16. )
    17. .paths(PathSelectors
    18. .any() // 满足条件的路径,该断言总为true
    19. //.none() // 不满足条件的路径,该断言总为false(可用于生成环境屏蔽 swagger)
    20. //.ant("/user/**") // 满足字符串表达式路径
    21. //.regex("") // 符合正则的路径
    22. )
    23. .build();
    24. }

    可以看到,basic-error相关接口我们已经去除了

    2.3 配置分组信息

    Swagger默认只有一个分组,名为default,如果不设置,所有的接口都会在这个分组下。在多模块项目下,我们通常会需要建立多个分组来分类管理这些接口,来防止接口混杂在一起

    2.3.1 分组名修改
    1. @Bean
    2. public Docket docket() {
    3. // 创建一个 swagger 的 bean 实例
    4. return new Docket(DocumentationType.SWAGGER_2)
    5. //设置分组名
    6. .groupName("admin")
    7. }

    可以看到分组名修改为admin

    2.3.2 设置多个分组

    实际上创建几个Docket对象,就有几个分组,代码如下

    1. package com.swagger.config;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import springfox.documentation.builders.ApiInfoBuilder;
    5. import springfox.documentation.builders.PathSelectors;
    6. import springfox.documentation.builders.RequestHandlerSelectors;
    7. import springfox.documentation.service.ApiInfo;
    8. import springfox.documentation.service.Contact;
    9. import springfox.documentation.spi.DocumentationType;
    10. import springfox.documentation.spring.web.plugins.Docket;
    11. import springfox.documentation.swagger2.annotations.EnableSwagger2;
    12. @Configuration // 配置类
    13. @EnableSwagger2 // 开启 swagger2 的自动配置
    14. public class SwaggerConfig {
    15. @Bean
    16. public Docket docket() {
    17. // 创建一个 swagger 的 bean 实例
    18. return new Docket(DocumentationType.SWAGGER_2)
    19. //设置分组名
    20. .groupName("admin")
    21. //配置基本信息
    22. .apiInfo(apiInfo())
    23. // 配置接口信息
    24. .select() // 设置扫描接口
    25. // 配置如何扫描接口
    26. .apis(RequestHandlerSelectors
    27. //.any() // 扫描全部的接口,默认
    28. //.none() // 全部不扫描
    29. .basePackage("com.swagger.controller") // 扫描指定包下的接口,最为常用
    30. //.withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
    31. //.withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口
    32. )
    33. .paths(PathSelectors
    34. .any() // 满足条件的路径,该断言总为true
    35. //.none() // 不满足条件的路径,该断言总为false(可用于生成环境屏蔽 swagger)
    36. //.ant("/user/**") // 满足字符串表达式路径
    37. //.regex("") // 符合正则的路径
    38. )
    39. .build();
    40. }
    41. @Bean
    42. public Docket docket1() {
    43. // 创建一个 swagger 的 bean 实例
    44. return new Docket(DocumentationType.SWAGGER_2)
    45. //设置分组名
    46. .groupName("blog")
    47. //配置基本信息
    48. .apiInfo(apiInfo())
    49. // 配置接口信息
    50. .select() // 设置扫描接口
    51. // 配置如何扫描接口
    52. .apis(RequestHandlerSelectors
    53. //.any() // 扫描全部的接口,默认
    54. //.none() // 全部不扫描
    55. .basePackage("com.swagger.controller") // 扫描指定包下的接口,最为常用
    56. //.withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
    57. //.withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口
    58. )
    59. .paths(PathSelectors
    60. .any() // 满足条件的路径,该断言总为true
    61. //.none() // 不满足条件的路径,该断言总为false(可用于生成环境屏蔽 swagger)
    62. //.ant("/user/**") // 满足字符串表达式路径
    63. //.regex("") // 符合正则的路径
    64. )
    65. .build();
    66. }
    67. // 基本信息设置
    68. private ApiInfo apiInfo() {
    69. Contact contact = new Contact(
    70. "Keke", // 作者姓名
    71. "https://blog.csdn.net/m0_63732435?spm=1011.2124.3001.5343", // 作者网址
    72. "1781125992@qq.com"); // 作者邮箱
    73. return new ApiInfoBuilder()
    74. .title("SwaggerTest-接口文档") // 标题
    75. .description("这是关于Swagger学习测试的接口文档") // 描述
    76. .termsOfServiceUrl("https://www.baidu.com") // 跳转连接
    77. .version("1.0") // 版本
    78. .license("Swagger-的使用(详细教程)")
    79. .licenseUrl("https://blog.csdn.net/m0_63732435/article/details/133689227?spm=1001.2014.3001.5501")
    80. .contact(contact)
    81. .build();
    82. }
    83. }

    可以看到blog模块分组的接口文档也在UI界面中展示出来

    四、常用注解使用

    1. @ApiModel

    该注解是作用在类上的,用来描述类的一些基本信息的

    相关属性:

    • value:提供类的一个备用名,如果不设置,默认情况下将使用 class 类的名称
    • description:对于类,提供一个详细的描述信息
    • parent:这个属性用于描述的是类的一些父类信息
    • discriminator:这个属性解释起来比较麻烦,因为这个类主要体现在断言当中
    • subTypes:可以通过这个属性,指定我们想要使用的子类

    2.@ApiModelProperty

    添加和操作属性模块的数据

    1. package com.swagger.entity;
    2. import io.swagger.annotations.ApiModel;
    3. import io.swagger.annotations.ApiModelProperty;
    4. import lombok.AllArgsConstructor;
    5. import lombok.Data;
    6. import lombok.NoArgsConstructor;
    7. @Data
    8. @AllArgsConstructor
    9. @NoArgsConstructor
    10. @ApiModel(value = "user实体类")
    11. public class User {
    12. @ApiModelProperty(value = "id主键")
    13. private Long id;
    14. @ApiModelProperty(value = "用户姓名")
    15. private String name;
    16. @ApiModelProperty(value = "用户年龄")
    17. private int age;
    18. }

    可以看到Model展示出来一些描述信息

    3.@ApiOperation

    该注解用来对某个方法/接口进行描述

    1. @GetMapping("/getByName")
    2. @ApiOperation(value = "根据姓名查询用户")
    3. public String getByName(){
    4. return "访问getByName成功";
    5. }

    可以看到接口文档这里多了 根据姓名查询用户 的描述

    4. @ApiParam

    该注解使用在方法上或者参数上,字段说明,表示对参数的添加元数据(说明或者是否必填等)

    相关属性:

    • name:参数名
    • value:参数说明
    • required:是否必填
    1. @GetMapping("/getByName/{id}")
    2. @ApiOperation(value = "根据id查询用户")
    3. public String getById(@ApiParam(value = "用户id",required = true) @PathVariable Long id){
    4. return "访问getById成功";
    5. }

    可以看到,添加@ApiParam注解后,接口文档多了对参数的相应描述说明

    五、Swagger接口调用

    swagger 除了让前后端交互变得方便,在swagger中也可以发起请求测试接口,只需要填写好请求所需要的参数信息即可

    点击Excute就可以看到接口响应的结果了

    六、添加请求头

    在登录注册类似涉及安全验证的业务,例如SpringSecurity框架中我们的接口是需要获取请求头信息的,这样的话就还需要在 swagger 配置中添加请求头的配置。

    1. @Bean
    2. public Docket docket() {
    3. // 设置请求头
    4. List parameters = new ArrayList<>();
    5. parameters.add(new ParameterBuilder()
    6. .name("token") // 字段名
    7. .description("token") // 描述
    8. .modelRef(new ModelRef("string")) // 数据类型
    9. .parameterType("header") // 参数类型
    10. .defaultValue("default value") // 默认值:可自己设置
    11. .hidden(true) // 是否隐藏
    12. .required(false) // 是否必须
    13. .build());
    14. // 创建一个 swagger 的 bean 实例
    15. return new Docket(DocumentationType.SWAGGER_2)
    16. .groupName("mike") // 修改组名为 "mike"
    17. // 配置接口信息
    18. .select() // 设置扫描接口
    19. // 配置如何扫描接口
    20. .apis(RequestHandlerSelectors
    21. .basePackage("com.duojiala.mikeboot.controller") // 扫描指定包下的接口,最为常用
    22. )
    23. .paths(PathSelectors
    24. .any() // 满足条件的路径,该断言总为true
    25. )
    26. .build()
    27. // 添加请求头参数
    28. .globalOperationParameters(parameters);
    29. }

    接口

    1. @GetMapping(value = "/getToken")
    2. @ApiOperation(value = "获取请求头中的token信息")
    3. public void getToken(
    4. @RequestHeader(value = "token",required = true) String token
    5. ) {
    6. // 直接获取 token 信息
    7. System.out.println("token = " + token);
    8. // 通过代码获取
    9. ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    10. if (servletRequestAttributes != null) {
    11. HttpServletRequest request = servletRequestAttributes.getRequest();
    12. String header = request.getHeader("token");
    13. System.err.println("header = " + header);
    14. }
    15. }

    这样重启服务,接口就可以设置请求头了

    执行后,后端控制台可以打印http请求带来的token的信息

  • 相关阅读:
    【通信】两层无线 Femtocell 网络上行链路中的最优功率分配附matlab代码
    【python】(一)字符串基本操作
    Qt开发_调用OpenCV(3.4.7)设计完成人脸检测系统
    vue 使用mapbox对当前行政区划进行反选遮罩
    基于粒子群优化的BP神经网络(分类应用) - 附代码
    DC-2靶场渗透测试实验整理
    130道基础OJ编程题之: 39 ~ 46 道
    Android Retrofit
    8-6选择排序-简单选择排序
    LeetCode刷题3:哈希篇
  • 原文地址:https://blog.csdn.net/m0_63732435/article/details/133689227