Swagger
是一套基于 OpenAPI 规范构建的开源工具
OpenAPI
规范是在2015年由OpenAPI Initiative 捐赠给 Linux 基金会
Swagger Editor
Swagger UI
Swagger Codegen
SpringBoot
项目整合 swagger
需要用到两个依赖(旧版)
springfox-swagger2
springfox-boot-starter
新版本和老版本的区别主要体现在以下 4 个方面
@EnableOpenApi
@EnableSwagger2
Docket
:文档摘要信息的文件类型配置不同:新版本配置的是 OAS_3
SWAGGER_2
Swagger UI
访问地址不同:新版本:http://localhost:8080/swagger-ui/
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>3.0.0version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-boot-starterartifactId>
<version>3.0.0version>
dependency>
@ApiModel
、@ApiModelProperty
注解以描述实体类属性、方法/*
用在请求的类上,表示对类的说明
tags="说明该类的作用,可以在UI界面上看到的注解"
value="该参数没什么意义,所以不需要配置"
*/
@Api(tags="APP用户注册Controller")
-----------------------------------------------------------
/*
用在请求的方法上,说明方法的用途、作用
value="说明方法的用途、作用"
notes="方法的备注说明"
*/
@ApiOperation(value="用户注册",notes="必须是数字")
-----------------------------------------------------------
/*
* @ApiImplicitParams:用在请求的方法上,表示一组参数说明
* 参数是 pojo 类型,不能使用 @ApiImplicitParams 注解
* @ApiImplicitParam:在 @ApiImplicitParams 注解内部,指定一个请求参数的各个方面
* name:参数名
* value:参数的汉字说明、解释
* required:参数是否必须存在
* paramType:参数位置
* · header:获取参数 @RequestHeader
* · query: 获取参数 @RequestParam
* · path:用于 restful 接口,获取参数 @PathVariable
* · body、form(不常用)
* dataType:参数类型,默认 String;dataType="Integer"
* defaultValue:参数的默认值
*/
@ApiImplicitParams({
@ApiImplicitParam(name="mobile", value="手机号", required=true, paramType="form"),
@ApiImplicitParam(name="password", value="密码", required=true, paramType="form"),
@ApiImplicitParam(name="age", value="年龄", required=true, paramType="form",dataType="Integer")
})
-----------------------------------------------------------
/*
* @ApiResponses:用在请求的方法上,表示一组响应
* @ApiResponse:在 @ApiResponses 内部,一般用于表达一个错误的响应信息
* code:状态码,例如:400
* message:返回信息,例如"请求参数没填好"
* response:抛出异常的类
*/
@ApiOperation(value = "select1请求",notes = "多参,多类型")
@ApiResponses({
@ApiResponse(code=400,message="请求参数没填好"),
@ApiResponse(code=404,message="路径没有或路径不对")
})
-----------------------------------------------------------
/*
* @ApiModel:描述实体类,一般用在 post 创建时,使用 @RequestBody 的场景,
* 请求参数无法使用 @ApiImplicitParam 注解进行描述的场景使用
* @ApiModelProperty:描述实体类属性
*/
@ApiModel(value = "Demo类",description = "测试")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Demo {
@ApiModelProperty("用户id")
private Integer id;
select().apis()
扫描接口方式
basePackage
: 指定要扫描的包any
: 扫描全部none
:都不扫描
withClassAnnotation
: 扫描类上注解,传入注解反射对象withMethodAnnotation
: 扫描方法上的注解.paths()
:过滤的请求路径
@EnableOpenApi //Swagger 3 使用此注解
@Configuration
public class Swagger2Config {
// 配置 docket 以配置 Swagger 具体参数
@Bean
public Docket docket(Environment environment){
// 获取当前环境是否是生产环境:pro
boolean flag = environment.acceptsProfiles(Profiles.of("pro"));
return new Docket(DocumentationType.OAS_30) // 文档类型:3.0 版本 OAS_30
// 是否开启 Swagger: 开发环境开启,生产环境关闭
.enable(!flag)
// api 的元信息设置
.apiInfo(apiInfo())
// 配置分组:多个分组需要配置多个docket
.groupName("测试1")
// 接口调试地址
.host()
// 配置扫描接口
.select()
// 扫描方式:RequestHandlerSelectors配置
.apis(RequestHandlerSelectors. basePackage("security.controller"))
// 过滤路径
.paths(PathSelectors.ant("/user/**"))
// 构建者模式
.build()
// 支持的通讯协议集合
.protocols(newHashSet("https", "http"))
// 授权信息设置,必要的header token等认证信息
.securitySchemes(securitySchemes())
// 授权信息全局应用
.securityContexts(securityContexts());;
}
// 配置 Swagger 基本信息:apiInfo
private ApiInfo apiInfo(){
// 只能使用构造方法创建或使用默认信息:所以一项都不能少
return new ApiInfo(
"Swagger 测试使用", // 标题
"初次学习 Swagger", // 描述
"v1.0", // 版本
"urn:tos", // 组织:termsOfServiceUrl
new Contact("demo", "http:localhost:8080/", "2417500668@qq.com"), // 作者信息
"Apache 2.0", // 许可证
"http://www.apache.org/licenses/LICENSE-2.0", // 许可证链接
new ArrayList<>()); // 拓展
}
/**
* 设置授权信息
*/
private List<SecurityScheme> securitySchemes() {
ApiKey apiKey = new ApiKey("BASE_TOKEN", "token", In.HEADER.toValue());
return Collections.singletonList(apiKey);
}
/**
* 授权信息全局应用
*/
private List<SecurityContext> securityContexts() {
return Collections.singletonList(
SecurityContext.builder()
.securityReferences(Collections.singletonList(
new SecurityReference("BASE_TOKEN",
new AuthorizationScope[]{
new AuthorizationScope("global", "")}))
).build());}
@SafeVarargs
private final <T> Set<T> newHashSet(T... ts) {
if (ts.length > 0) {
return new LinkedHashSet<>(Arrays.asList(ts));
}
return null;
}
/**
* 通用拦截器排除swagger设置,所有拦截器都会自动加 swagger 相关的资源排除信息
*/
@SuppressWarnings("unchecked")
@Override
public void addInterceptors(InterceptorRegistry registry) {
try {
Field registrationsField = FieldUtils.getField(InterceptorRegistry.class, "registrations", true);
List<InterceptorRegistration> registrations =
(List<InterceptorRegistration>) ReflectionUtils.getField(registrationsField, registry);
if (registrations != null) {
for (InterceptorRegistration interceptorRegistration : registrations) {
interceptorRegistration
.excludePathPatterns("/swagger**/**")
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/v3/**")
.excludePathPatterns("/doc.html");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
导入不同的包实现不同的皮肤定义
默认访问: http://localhost:8080/swagger-ui.html
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.9.2version>
dependency>
bootstrap-ui
: http://localhost:8080/doc.html
<dependency>
<groupId>com.github.xiaoymingroupId>
<artifactId>swagger-bootstrap-uiartifactId>
<version>1.9.1version>
dependency>
Layui-ui
:http://localhost:8080/docs.html
<dependency>
<groupId>com.github.caspar-chengroupId>
<artifactId>swagger-ui-layerartifactId>
<version>1.1.3version>
dependency>
mg-ui
:http://localhost:8080/document.html
<dependency>
<groupId>com.zyplayergroupId>
<artifactId>swagger-mg-uiartifactId>
<version>1.0.6version>
dependency>