学习目标:

  • 了解Swagger的作用和概念
  • 了解前后端分离
  • 在SpringBoot中集成Swagger

 

Swagger简介

前后端分离

Vue+SpringBoot

后端时代:前端只用管理静态页面;HTML==》后端。模板引擎JSP=》后端是主力

 

前后端分离时代:

  • 后端:后端控制层,服务层,数据访问层【后端团队】
  • 前端:前端控制层,视图层【前端团队】

。伪造后端数据,json。已经存在了,不需要后端,前端依然能跑起来。

  • 前后端如何交互?===》API
  • 前后端相对独立,松耦合;
  • 前后端甚至可以部署在不同的服务器上;

产生一个问题:

  • 前后端集成联调,前端人员和后端人员无法做到,及时协商,尽早解决,最终导致问题集中爆发;
  • 首先制定schema【计划的提纲】,实时更新最新API,降低集成的风险;
  • 早些年:制定word计划文档;
  • 前后端分离:

。前端测试后端接口:postman

。后端提纲接口,需要实时更新最新的消息及改动!

Swagger

  • 号称世界上最流行的API框架
  • RestFul API文档在线自动生成工具=》API文档与API定义同步更新
  • 直接运行,可以在线测试API接口
  • 支持多种语言:(java,PHP.......)

官网:https://swagger.io/

 

在项目使用Swagger需要springfox-swagger;

  • swagger2
  • UI

SpringBoot集成Swagger

1.新建一个SpringBoot-web项目

2.导入相关依赖

<!-- 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>

3.编写一个HelloWorld

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}

4.配置Swagger==》config

@Configuration
@EnableSwagger2   //开启Swagger
public class SwaggerConfig {
}

5.测试运行http://localhost:8080/swagger-ui.html

 

6.配置Swagger

Swagger的bean实例Docket;

//配置了Swagger的bean实例
@Bean
public Docket docket() {
    return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
}

//配置Swagger信息=apiinfo
private ApiInfo apiInfo() {
    //作者信息
    Contact contact = new Contact("宋海波", "https://blog.csdn.net/qq_41453424", "594859595@qq.com");
    return new ApiInfo(
            "宋海波的SwaggerAPI文档",
            "勤于学知,细于做事",
            "v1.0",
            "https://blog.csdn.net/qq_41453424",
            contact,
            "Apache 2.0",
            "http://www.apache.org/licenses/LICENSE-2.0",
            new ArrayList());
}

 

Swagger配置扫描接口

Docket.select();

@Bean
public Docket docket() {
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            //RequestHandlerSelectors,配置要扫描接口的方式
            //basePackage:指定扫描的包,例如:"com.shb.swagger.controller"
            //any():扫描全部
            //none():都不扫描
            //withClassAnnotation():扫描类上注解,参数是注解的反射对象
            //withMethodAnnotation():扫描方法上的注解
            .apis(RequestHandlerSelectors.basePackage("com.shb.swagger.controller"))
            //paths()。过滤什么路径
            .paths(PathSelectors.ant("/shb/**"))
            .build();
}

配置是否启动Swagger

//配置了Swagger的bean实例
@Bean
public Docket docket() {

    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .enable(false)//enable():是否启动Swagger默认是true启动
            .select()
            //RequestHandlerSelectors,配置要扫描接口的方式
            //basePackage:指定扫描的包,例如:"com.shb.swagger.controller"
            //any():扫描全部
            //none():都不扫描
            //withClassAnnotation():扫描类上注解,参数是注解的反射对象
            //withMethodAnnotation():扫描方法上的注解
            .apis(RequestHandlerSelectors.basePackage("com.shb.swagger.controller"))
            //paths()。过滤什么路径
            //.paths(PathSelectors.ant("/shb/**"))
            .build();
}

我只希望我的Swagger在生产环境中使用,在发布的时候不使用

  • 判断是否生产环境
  • 注入enable()值
//配置了Swagger的bean实例
@Bean
public Docket docket(Environment environment) {
    //设置要显示的Swagger环境
    Profiles profiles=Profiles.of("dev");
    //获取项目环境
    boolean flag = environment.acceptsProfiles(profiles);
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .enable(flag)//enable():是否启动Swagger默认是true启动
            .select()
            //RequestHandlerSelectors,配置要扫描接口的方式
            //basePackage:指定扫描的包,例如:"com.shb.swagger.controller"
            //any():扫描全部
            //none():都不扫描
            //withClassAnnotation():扫描类上注解,参数是注解的反射对象
            //withMethodAnnotation():扫描方法上的注解
            .apis(RequestHandlerSelectors.basePackage("com.shb.swagger.controller"))
            //paths()。过滤什么路径
            //.paths(PathSelectors.ant("/shb/**"))
            .build();
}

配置API文档的分组

.groupName("宋海波")

如何配置多个分组

@Bean
public Docket docket1(){
    return new Docket(DocumentationType.SWAGGER_2).groupName("A");
}
@Bean
public Docket docket2(){
    return new Docket(DocumentationType.SWAGGER_2).groupName("B");
}
@Bean
public Docket docket3(){
    return new Docket(DocumentationType.SWAGGER_2).groupName("C");
}

 

实体类配置

@ApiModel("用户实体类")
@Data
public class User {
    @ApiModelProperty("用户名")
    public String username;
    @ApiModelProperty("密码")
    public String password;

}

总结:

  1. 我们可以通过Swagger给一些比较难理解的属性或者接口,增加注释信息
  2. 接口文档实时更新
  3. 可以在线测试

Swagger是一个优秀的工具,几乎所有大公司都有使用它

【注意点】在正式发布的时候,关闭Swagger!!!(enable(false))出于安全考虑,而且还能节省内存

 

最后补一下本人的Swagger测试GitHub仓库地址,有兴趣的可以down下来玩玩

https://github.com/songhaiboGitHub/swagger-demo.git

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐