Swagger学习笔记

Swagger简介

前后端分离

Vue+Springboot

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

前后端分离时代:

  • 后端:控制层,服务层,数据访问层

  • 前端:前端控制层,视图层

    • 伪造后端数据,json已经存在了,不需要后端,前端工成依旧能跑起来
  • 前后端如何交互====>API

  • 前后端相对独立,并且松耦合

  • 前后端甚至可以部署在不同的服务器上

产生一个问题:

  • 前后端集成联调,前端人员和后端人员无法做到,及时协商,尽早解决,最终导致问题集中爆发

解决方案:

  • 首先制定一个schema(计划提纲),实时更新最新API,降低集成风险
  • 早些年:指定word计划文档
  • 前后端分离:
    • 前端测试后端接口:postman
    • 后端提供接口,需要实时更新最新的消息及改动

Swagger

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

在项目中使用Swagger需要使用springfox

  • swagger2
  • ui

SpringBoot继承Swagger

1.新建一个springboot=web项目

2.导入相关依赖(3.0.0版本访问不了)

<!-- 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>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.5.21</version>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-models</artifactId>
    <version>1.5.21</version>
</dependency>

3.编写Hello World工程

4.配置Swagger===>Config

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

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

以上为集成swagger

配置Swagger

Swagger的bean实例Docket

Swagger配置扫描接口

Docket.select()

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    //配置了Swagger的Docket的bean实例
    //enable:是否启用swagger,如果为false,则swagger不能在浏览器中访问
    @Bean
    public Docket docket(Environment environment){
//设置要显示的swagger环境
        Profiles profiles = Profiles.of("dev","test");
        //获取项目的环境:通过environment.acceptsProfiles判断是否处在设定的环境当中
        boolean flag = environment.acceptsProfiles(profiles);
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .enable(flag)
                .select()//select和build是一对,中间只有两个方法
                //RequestHandlerSelectors:配置要扫描接口的方式
                //basePackage:指定扫描的包
                //any():扫描全部
                //none:都不扫描
                //withMethodAnnotation:扫描方法上的注解
                //withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象
                .apis(RequestHandlerSelectors.basePackage("com.jmc.controller"))
                //paths():过滤什么路径
                //.paths(PathSelectors.ant("/hbxy/**")) 只访问hbxy包下的
                .build();
    }
    //配置Swagger信息=apiInfo
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("jmc的SwaggerAPI文档")
                .contact(new Contact("jmc","https://cnblogs.com/henrystudy","2645738794@qq.com"))
                .description("即使再小的帆也能远航")
                .version("1.0")
                .build();
    }
}

application.properties

spring.profiles.active=dev

application-dev.properties(开发环境)

server.port=8081

application-pro.properties(生产环境)

server.port=8082

配置API文档的分组

.groupName("Jack")

如何配置多个分组:多个Docket实例即可

@Bean
    public Docket docket1(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("Tom");
    }
    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("June");
    }
    @Bean
    public Docket docket3(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("July");
    }

实体类配置;

RequestMethod.POST---》@RequestBody 一般用来处理 Content-Type: 为application/json 接收对象类型

RequestMethod.POST---》@RequestParam 这个也是从body中获取 用来处理 multipart/form-data (表单上传的)

RequestMethod.GET---》这种可以有参数用模型驱动,或者属性驱动获取,但是不可以用@注解从body获取

User.java

//@Api("注释")和@ApiModel("用户实体类")等价
@ApiModel("用户实体类")
public class User {
    @ApiModelProperty("用户名")
    public String username;
    @ApiModelProperty("密码")
    public String password;
}

HelloController.java

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
    //只要我们的接口中,返回值中存在实体类,它就会被扫描到Swagger中
    @PostMapping("/user")
    public User user(){
        return new User();
    }

    //iOperation接口,不是放在类上的,是放在方法上
    @ApiOperation("Hello控制类")
    @GetMapping("/hello2")
    public String hello(@ApiParam("用户名") String username){
        return "hello"+username;
    }
    @ApiOperation("Post测试类")
    @PostMapping("/postt")
    public User postt(@ApiParam("用户名") User user){
        return user;
    }
}

Swagger皮肤设置

  1. bootstrap-ui 访问 http://localhost:8080/doc.html

    <!-- 引入swagger-bootstrap-ui包 /doc.html-->
    <dependency>
       <groupId>com.github.xiaoymin</groupId>
       <artifactId>swagger-bootstrap-ui</artifactId>
       <version>1.9.1</version>
    </dependency>
    

  1. Layui-ui 访问 http://localhost:8080/docs.html

    <!-- 引入swagger-ui-layer包 /docs.html-->
    <dependency>
       <groupId>com.github.caspar-chen</groupId>
       <artifactId>swagger-ui-layer</artifactId>
       <version>1.1.3</version>
    </dependency>
    

总结:

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

Swagger是一个优秀的工具

【注意点】在项目正式发布的时候,关闭Swagger!!!处于安全考虑并且节省内存

posted @ 2021-10-06 16:54  Henry`  阅读(50)  评论(0编辑  收藏  举报