认识界上最流行的Api框架——swagger
swagger简介
swagger是支持多种编程语言的Api框架。可以直接运行,在线测试API接口。有RestFul Api文档在线自动生成工具,并且能够达到Api文档与API定义同步更新。
由于前端和后端分离式开发的广泛应用,许多前端人员无法做到问题处理同步,为了提高问题的处理效率,以及避免工作中前后端工作人员的矛盾,就需要‘即时协商,目标同步’。对于这个问题,最早的解决方法是使用:指定schema并实时更新最新API、word计划文档、后端提供接口,前端用postman测试后端接口三种方法。但是这几种方法并不能达到即时的效果,所以swagger就应时而生。
作为世界上最流行的API框架,swagger在项目中使用时需要springfox(swagger2和swagger-ui)。这就需要在项目中导入以下两个依赖:
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
用SpringBoot集成swagger
-
新建SpringBoot web项目
-
导入swagger2和swagger-ui依赖
-
编写一个hello工程用于测试
-
配置swagger,编写config
@Configuration @EnableSwagger2 //开启Swagger2 public class SwaggerConfig { }
配置swagger信息
-
swagger的bean实例docket:
@Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2); }
-
配置swagger的信息:
//配置Swagger信息=apiInfo private ApiInfo apiInfo(){ //作者信息 Contact contact = new Contact("啊侠", "https://blog.csdn.net/weixin_44821160", "792228573@qq.com"); return new ApiInfo( "啊侠的SwaggerAPI测试文档", "不要因为任何事情忘记自己最初的动力", "v1.0", "https://blog.csdn.net/weixin_44821160", contact, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList() ); }
swagger配置扫描接口
Docket.select()
//配置了Swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//RequestHandlerSelectors,配置要扫描接口的方式
//basePackage:指定要扫描的包
//any():扫描全部
//none():不扫描
//withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象
//withMethodAnnotation:扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.david.swagger.controller"))
//paths()。过滤什么路径
.paths(PathSelectors.ant("/david/**"))
.build();
}
配置是否启动Swagger
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(false)//enable是否启动Swagger,如果为False,则Swagger不能再浏览器中访问
.select()
.apis(RequestHandlerSelectors.basePackage("com.david.swagger.controller"))
.build();
}
如果只希望我的Swagger在生产环境中使用,在发布的时候不使用就需要:
- 判断是不是生产环境 flag = false
- 注入enable(flag)
//配置了Swagger的Docket的bean实例
@Bean
public Docket docket(Environment environment){
//设置要显示的Swagger环境
Profiles profiles = Profiles.of("dev","test");
//通过environment.acceptsProfiles判断是否处在自己设定的环境当中
boolean flag = environment.acceptsProfiles(profiles);
System.out.println(flag);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(flag)
.select()
.apis(RequestHandlerSelectors.basePackage("com.david.swagger.controller"))
.build();
}
配置Api文档的分组
-
.groupName(“david”)
-
配置多个分组,多个docket实例
@Bean public Docket docket1(){ return new Docket(DocumentationType.SWAGGER_2).groupName("豪侠"); } @Bean public Docket docket2(){ return new Docket(DocumentationType.SWAGGER_2).groupName("真真"); } @Bean public Docket docket3(){ return new Docket(DocumentationType.SWAGGER_2).groupName("超强"); }
-
配置实体类
package com.david.swagger.pojo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; //@Api(注释) @ApiModel("用户实体类") public class User { @ApiModelProperty("用户名") public String username; @ApiModelProperty("密码") public String password; }
-
编写controller
package com.david.swagger.controller; import com.david.swagger.pojo.User; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping(value = "/hello") public String hello(){ return "hello"; } //只要我们的接口中,返回值中存在实体类,他就会被扫描到Swagger中 @PostMapping(value = "/user") public User user(){ return new User(); } //Operation接口,不是放在类上的,是方法 @ApiOperation("Hello控制类") @GetMapping(value = "/hello2") public String hello2(@ApiParam("用户名") String username){ return "hello"+username; } @ApiOperation("Post测试类") @PostMapping(value = "/posttest") public User posttest(@ApiParam("用户名") User user){ int i = 5/0;//;模拟代码错误 return user; } }
总结swagger的作用
通过Swagger可以给一些比较难理解的属性或者接口,增加注释信息。可以达到文档实时更新的效果,在线测试也方便理解api。swagger虽然是一个优秀的工具,但是出于安全考虑在正式发布之前关闭swagger,节省运行内存。