1:认识Swagger

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

  1. 接口的文档在线自动生成。
    1. 功能测试。

Swagger是一组开源项目,其中主要要项目如下:

  1. Swagger-tools:提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger 2.0文档等功能。
  2. Swagger-core: 用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF…)、Servlets和Play框架进行集成。
  3. Swagger-js: 用于JavaScript的Swagger实现。
  4. Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
  5. Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
  6. Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。

2:Maven

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-swagger2</artifactId>
  4. <version>2.2.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>io.springfox</groupId>
  8. <artifactId>springfox-swagger-ui</artifactId>
  9. <version>2.2.2</version>
  10. </dependency>
  11. <!-- 下面这个界面更好看,更好用-->
  12. <dependency>
  13. <groupId>com.github.xiaoymin</groupId>
  14. <artifactId>swagger-bootstrap-ui</artifactId>
  15. <version>1.9.5</version>
  16. </dependency>

3:创建Swagger2配置类

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import springfox.documentation.builders.ApiInfoBuilder;
  4. import springfox.documentation.service.ApiInfo;
  5. import springfox.documentation.service.Contact;
  6. import springfox.documentation.spi.DocumentationType;
  7. import springfox.documentation.spring.web.plugins.Docket;
  8. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  9. @Configuration
  10. @EnableSwagger2 //swagger注解
  11. public class SwaggerConfig {
  12. @Bean
  13. public Docket webApiConfig(){
  14. return new Docket(DocumentationType.SWAGGER_2)
  15. .groupName("webApi")
  16. .apiInfo(webApiInfo())
  17. //指定扫描的包
  18. .select()
  19. //.paths(PathSelectors) //路径过滤
  20. .build();
  21. }
  22. private ApiInfo webApiInfo(){
  23. return new ApiInfoBuilder()
  24. .title("网站-课程中心API文档")
  25. .description("本文档描述了课程中心微服务接口定义")
  26. .version("2.0")
  27. .contact(new Contact("lvguorui","111","111"))
  28. .build();
  29. }
  30. }

4:添加文档内容

@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiError :发生错误返回的信息
@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数

5:具体配置

5.1 注解

  • @Api()用于类;
    表示标识这个类是swagger的资源
  • @ApiOperation()用于方法;
    表示一个http请求的操作
  • @ApiParam()用于方法,参数,字段说明;
    表示对参数的添加元数据(说明或是否必填等)
  • @ApiModel()用于类;
    表示对类进行说明,用于参数用实体类接收
  • @ApiModelProperty()用于方法,字段;
    表示对model属性的说明或者数据操作更改
  • @ApiIgnore()用于类,方法,方法参数;
    表示这个方法或者类被忽略
  • @ApiImplicitParam() 用于方法;
    表示单独的请求参数
  • @ApiImplicitParams() 用于方法;
    包含多个 @ApiImplicitParam

5.2 实践

@Api() - 用于类;表示标识这个类是swagger的资源

  • tags–表示说明
  • value–也是说明,可以使用tags替代
  • 但是tags如果有多个值,会生成多个list ```java @Api(value=”用户controller”,tags={“用户操作接口”}) @RestController public class UserController {

}

  1. @ApiOperation() - 用于方法;表示一个http请求的操作
  2. - value用于方法描述
  3. - notes用于提示内容
  4. - tags可以重新分组(视情况而用)
  5. @ApiParam() - 用于方法,参数,字段说明;表示对参数的添加元数据(说明或是否必填等)
  6. - name–参数名
  7. - value–参数说明
  8. - required–是否必填
  9. ```java
  10. @Api(value="UserController",tags={"用户接口"})
  11. @RestController
  12. public class UserController {
  13. @ApiOperation(value="获取用户信息",tags={"获取用户信息"},notes="注意")
  14. @GetMapping("/getUserInfo")
  15. public User getUserInfo(@ApiParam(name="id",value="用户id",required=true) Long id,@ApiParam(name="username",value="用户名") String username) {
  16. User user = userService.getUserInfo();
  17. return user;
  18. }
  19. }

@ApiModel() - 用于类 ;表示对类进行说明,用于参数用实体类接收

  • value–表示对象名
  • description–描述

@ApiModelProperty() - 用于方法,字段; 表示对model属性的说明或者数据操作更改

  • value–字段说明
  • name–重写属性名字
  • dataType–重写属性类型
  • required–是否必填
  • example–举例说明
  • hidden–隐藏 ```java @ApiModel(value=”user”,description=”用户对象”) @Data public class User implements Serializable{ private static final long serialVersionUID = 1L; @ApiModelProperty(value=”用户名”,name=”username”,example=”xingguo”) private String username; @ApiModelProperty(value=”状态”,name=”state”,required=true) private Integer state; private String password; private String nickName; private Integer isDeleted;
  1. @ApiModelProperty(value="ids",hidden=true)
  2. private String[] ids;
  3. private List<String> idList;

}

  1. ```java
  2. @ApiOperation("修改用户信息")
  3. @PostMapping("/updateUserInfo")
  4. public int updateUserInfo(@RequestBody @ApiParam(name="用户对象",value="json格式",required=true) User user){
  5. int num = userService.updateUserInfo(user);
  6. return num;
  7. }

5.3 配置类

@ApiIgnore() - 用于类或者方法上,可以不被swagger显示在页面上。
@ApiImplicitParam() - 用于方法,表示单独的请求参数
@ApiImplicitParams() - 用于方法,包含多个 @ApiImplicitParam
name–参数ming
value–参数说明
dataType–数据类型
paramType–参数类型
example–举例说明

  1. @ApiOperation("查询测试")
  2. @GetMapping("select")
  3. //@ApiImplicitParam(name="name",value="用户名",dataType="String", paramType = "query")
  4. @ApiImplicitParams({
  5. @ApiImplicitParam(name="name",value="用户名",dataType="string", paramType = "query",example="xingguo"),
  6. @ApiImplicitParam(name="id",value="用户id",dataType="long", paramType = "query")})
  7. public void select(){
  8. }
  1. import com.google.common.base.Predicates;
  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.ParameterBuilder;
  6. import springfox.documentation.builders.PathSelectors;
  7. import springfox.documentation.builders.RequestHandlerSelectors;
  8. import springfox.documentation.schema.ModelRef;
  9. import springfox.documentation.service.ApiInfo;
  10. import springfox.documentation.service.Contact;
  11. import springfox.documentation.service.Parameter;
  12. import springfox.documentation.spi.DocumentationType;
  13. import springfox.documentation.spring.web.plugins.Docket;
  14. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. /**
  18. * swagger-api 配置
  19. *
  20. * @author wzm
  21. * @version 1.0.0
  22. * @date 2019/6/15
  23. **/
  24. @Configuration
  25. @EnableSwagger2
  26. @EnableSwaggerBootstrapUI
  27. public class Swagger2 {
  28. /**
  29. * http://localhost:8085/fabric-net/swagger-ui.html
  30. * http://localhost:8085/fabric-net/doc.html
  31. */
  32. private static final String SWAGGER_SCAN_BUSINESS_PACKAGE = "com.thyc.fabric.controller.business";
  33. private static final String BUSINESS_VERSION = "1.0.0";
  34. private static final String SWAGGER_SCAN_FABRIC_PACKAGE = "com.thyc.fabric.controller.fabric";
  35. private static final String FABRIC_VERSION = "1.0.0";
  36. @Bean
  37. public Docket createBusinessApi() {
  38. List<Parameter> pars = new ArrayList<>();
  39. ParameterBuilder ticketPar1 = new ParameterBuilder();
  40. ticketPar1.name("Authorization").description("登录令牌")
  41. .modelRef(new ModelRef("string")).parameterType("header")
  42. .required(false).build();
  43. pars.add(ticketPar1.build());
  44. return new Docket(DocumentationType.SWAGGER_2)
  45. .globalOperationParameters(pars)
  46. //分组名不支持中文
  47. .groupName("business")
  48. .apiInfo(apiBusinessInfo())
  49. .pathMapping("/")
  50. .select()
  51. // 对所有api进行监控
  52. .apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BUSINESS_PACKAGE))
  53. // 错误路径不监控
  54. .paths(Predicates.not(PathSelectors.regex("/error.*")))
  55. // 对根下所有路径进行监控
  56. .paths(PathSelectors.regex("/.*"))
  57. .build();
  58. }
  59. private ApiInfo apiBusinessInfo() {
  60. Contact contact = new Contact("thyc","thyc.com","thyc@email");
  61. return new ApiInfoBuilder()
  62. //设置文档的标题
  63. .title("Business")
  64. //设置文档的描述->1.Overview
  65. .description("业务模块数据管理")
  66. //设置文档的版本信息-> 1.1 Version information
  67. .termsOfServiceUrl("http://localhost:8085/fabric-net")
  68. .contact(contact)
  69. .version(BUSINESS_VERSION)
  70. .build();
  71. }
  72. //------------------------------------------------------------------------------------------------------------------
  73. @Bean
  74. public Docket createFabricApi() {
  75. List<Parameter> pars = new ArrayList<Parameter>();
  76. ParameterBuilder ticketPar1 = new ParameterBuilder();
  77. ticketPar1.name("Authorization").description("登录令牌")
  78. .modelRef(new ModelRef("string")).parameterType("header")
  79. .required(false).build();
  80. pars.add(ticketPar1.build());
  81. return new Docket(DocumentationType.SWAGGER_2)
  82. .globalOperationParameters(pars)
  83. //分组名不支持中文
  84. .groupName("fabric")
  85. .apiInfo(apiFabricInfo())
  86. .pathMapping("/")
  87. .select()
  88. // 对所有api进行监控
  89. .apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_FABRIC_PACKAGE))
  90. // 错误路径不监控
  91. .paths(Predicates.not(PathSelectors.regex("/error.*")))
  92. // 对根下所有路径进行监控
  93. .paths(PathSelectors.regex("/.*"))
  94. .build();
  95. }
  96. private ApiInfo apiFabricInfo() {
  97. Contact contact = new Contact("thyc","thyc.com","thyc@email");
  98. return new ApiInfoBuilder()
  99. //设置文档的标题
  100. .title("Fabric-Network")
  101. //设置文档的描述->1.Overview
  102. .description("超级账本网络信息管理")
  103. //设置文档的版本信息-> 1.1 Version information
  104. .termsOfServiceUrl("http://localhost:8085/fabric-net")
  105. .contact(contact)
  106. .version(FABRIC_VERSION)
  107. .build();
  108. }
  109. }

6: 测试网址

http://localhost:8088/swagger-ui.html 原路径
http://localhost:8088/doc.html 新路径

image.png