SpringBoot: 后台接口文档 - 基于Swagger3
目录
- 前言:什么是Swagger
- 起步:(只需简单的3步) 加载依赖
- 添加注解@EnableOpenApi
- 启动SpringBoot,访问Swagger后台界面
前言
什么是Swagger:
Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS)。
它最方便的地方就在于,API文档可以和服务端保持同步,即服务端更新一个接口,前端的API文档就可以实时更新,而且可以在线测试。
这样一来,Swagger就大大降低了前后端的沟通障碍,不用因为一个接口调不通而争论不休
之前用的看云文档,不过这种第三方的都需要手动维护,还是不太方便
起步
- 加载依赖
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
- 添加@EnableOpenApi注解
@EnableOpenApi @SpringBootApplication public class SwaggerApplication { public static void main(String[] args) { SpringApplication.run(SwaggerApplication.class, args); } }
这样一个简单的Swagger后台接口文档就搭建完成了;
下面我们说下配置和注解
配置
可以看到,上面那个界面中,默认显示了一个
basic-error-controller接口分组,但是我们并没有写;
通过在项目中查找我们发现,SpringBoot内部确实有这样一个控制器类,如下所示:
这说明Swagger默认的配置,会自动把@Controller控制器类添加到接口文档中
下面我们就自己配置一下,如下所示:
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; @Configuration public class SwaggerConfig { @Bean public Docket createRestApi() { // 配置OAS 3.0协议 return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .select() // 查找有@Tag注解的类,并生成一个对应的分组;类下面的所有http请求方法,都会生成对应的API接口 // 通过这个配置,就可以将那些没有添加@Tag注解的控制器类排除掉 .apis(RequestHandlerSelectors.withClassAnnotation(Tag.class)) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("GPS Doc") .description("GPS Doc文档") .termsOfServiceUrl("http://www.javalover.com") .contact(new Contact("javalover", "http://www.javalover.cn", "1121263265@qq.com")) .version("2.0.0") .build(); } }
这样上面那个
basic-error-controller就看不见了
注解
我们先看下Swagger2中的注解,如下所示:
@Api:用在控制器类上,表示对类的说明
tags="说明该类的作用,可以在UI界面上看到的说明信息的一个好用注解"- value="该参数没什么意义,在UI界面上也看到,所以不需要配置"
@ApiOperation:用在请求的方法上,说明方法的用途、作用
-
value="说明方法的用途、作用"
@ApiImplicitParams:用在请求的方法上,表示一组参数说明
-
@ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面(标注一个指定的参数,详细概括参数的各个方面,例如:参数名是什么?参数意义,是否必填等)
name:属性值为方法参数名
@ApiResponses:用在请求的方法上,表示一组响应
-
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
code:状态码数字,例如400
@ApiModel:用于响应类上(POJO实体类),描述一个返回响应数据的信息(描述POJO类请求或响应的实体说明) (这种一般用在post接口的时候,使用@RequestBody接收JSON格式的数据的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)
-
@ApiModelProperty:用在POJO属性上,描述响应类的属性说明
@ApiIgnore:使用该注解忽略这个某个API或者参数;
上面这些是Swagger2的注解,下面我们看下Swagger3和它的简单对比
接下来我们就用Swagger3的注解来写一个接口看下效果(其中穿插了Swagger2的注解)
- 控制器UserController.java
import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @Tag(name = "user-controller", description = "用户接口") @RestController public class UserController { // 忽略这个api @Operation(hidden = true) @GetMapping("/hello") public String hello(){ return "hello"; } @Operation(summary = "用户接口 - 获取用户详情") @GetMapping("/user/detail") // 这里的@Parameter也可以不加,Swagger会自动识别到这个name参数 // 但是加@Parameter注解可以增加一些描述等有用的信息 public User getUser(@Parameter(in = ParameterIn.QUERY, name = "name", description = "用户名") String name){ User user = new User(); user.setUsername(name); user.setPassword("123"); return user; } @Operation(summary = "用户接口 - 添加用户") @PostMapping("/user/add") // 这里的user会被Swagger自动识别 public User addUser(@RequestBody User user){ System.out.println("添加用户"); return user; } }
实体类User.java:
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Schema @Data public class User { @Schema(name = "username", description = "用户名", example = "javalover") private String username; @Schema(name = "password", description = "密码", example = "123456") private String password; // 隐藏这个属性,这样接口文档的请求参数中就看不到这个属性 @Schema(hidden = true) private String email; }
启动后运行界面如下:
- 首页展示:
- /user/add接口展示:
/user/detail接口展示
源码
整理在Github上:https://github.com/Jalon2015/spring-boot-demo/tree/master/demo-swagger3
问题
目前只是简单地体验了下,其实里面还是有很多坑,等后面有空再整理解决,下面列举几个:
- @Paramters参数无效
- @ApiImplicitParamter的body属性无效
- @Tag的name属性:如果name属性不是当前类名的小写连字符格式,则会被识别为一个单独的接口分组
- 等等
最近整理了一份面试资料《Java面试题-校招版》附答案,无密码无水印,感兴趣的可以关注公众号回复“面试”领取。
- 企业级后台接口开发。环境基于spring+springboot+springmvc+mybatis。测试 junit4
- 基于SpringBoot的通用设备操作接口服务
- 基于spring boot 的前后端分离跨域问题在后台的配置
- 基于SpringBoot的文件文档在线预览项目解决方案
- springboot整合swagger2生成接口文档
- 基于springboot的文档管理
- SpringBoot后台接口的写法
- 基于springboot的freemarker创建指定格式的word文档
- 基于spring-boot使用Swagger构建restful api文档
- spring boot 整合swagger2 实现动态生成接口文档
- spring boot 后台访问接口
- Swagger自动接口文档生成框架————springboot整合swagger总结
- springboot结合jwt实现基于restful接口的身份认证
- 基于Spring Boot,Security和JWB的REST接口的无状态认证
- 基于SpringBoot的Restful接口开发
- Spring Boot 入门 Spring Boot 使用 swagger2 编写接口文档
- SpringBoot整合Swagger2,再也不用维护接口文档了!
- java之Websocket后台(基于Spring boot)
- spring boot 中使用swagger 来自动生成接口文档
- SpringBoot整合Swagger2,再也不用维护接口文档了!