目录
- 前言:什么是Swagger
-
起步:(只需简略的3步)
- 加载依赖
- 增加注解@EnableOpenApi
- 启动SpringBoot,拜访Swagger后盾界面
- 配置:基于Java的配置
- 注解:Swagger2 和 Swagger3做比照
- 源码:https://github.com/Jalon2015/…
- 问题:踩坑记录(前面再整顿)
前言
什么是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);
}
}
- 启动我的项目,拜访”http://localhost:8080/swagger-ui/index.html”
这样一个简略的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=”阐明办法的用处、作用”
- notes=”办法的备注阐明”
-
@ApiImplicitParams:用在申请的办法上,示意一组参数阐明
-
@ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个申请参数的各个方面(标注一个指定的参数,具体概括参数的各个方面,例如:参数名是什么?参数意义,是否必填等)
- name:属性值为办法参数名
- value:参数意义的汉字阐明、解释
- required:参数是否必须传
- paramType:参数放在哪个中央
- header –> 申请参数的获取:@RequestHeader
- query –> 申请参数的获取:@RequestParam
- path(用于restful接口)–> 申请参数的获取:@PathVariable
- dataType:参数类型,默认String,其它值dataType=”Integer”
- defaultValue:参数的默认值
-
-
@ApiResponses:用在申请的办法上,示意一组响应
-
@ApiResponse:用在@ApiResponses中,个别用于表白一个谬误的响应信息
- code:状态码数字,例如400
- message:信息,例如”申请参数没填好”
- response:抛出异样的类
-
-
@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/…
问题
目前只是简略地体验了下,其实外面还是有很多坑,等前面有空再整顿解决,上面列举几个:
- @Paramters参数有效
- @ApiImplicitParamter的body属性有效
- @Tag的name属性:如果name属性不是以后类名的小写连字符格局,则会被辨认为一个独自的接口分组
- 等等
最近整顿了一份面试材料《Java面试题-校招版》附答案,无明码无水印,感兴趣的能够关注公众号回复“面试”支付。
发表回复