Swagger学习笔记

摘要:
P=1记住三次投币~~ Swagger学习目标:理解Swagger的角色和概念,理解前端和后端的分离,在SpringBoot中继承Swagger,介绍前端和后端分离,Vue+SpringBoot后端时代:前端只管理静态页面,然后将其交给后端——https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui--˃io。springfox</groupId><artifactId>springbox swagger ui</artifactId><version>2.9.2</version></dependency>3。写helloworld4。配置Swagger==˃Config@Configuration@EnableSwagger2//启用swagger2publicclassSwaggerConfig{}5。试运行:http://localhost:8080/swagger-Ui.html配置Swagger配置Swagger's bucket的bean实例@Configuration@EnableSwagger2//启动swagger 2publicclassSwagger Config{//swagger的bucket@BeanpublicDocketdocket(){returnnewDocket.apiInfo;}的bean实例配置swagger信息//配置swagger信息ApiInfoprivateApiInfoapiInfo(){//作者信息ContactCONTACT=newContact;//要返回的swagger消息=apiInforeturnnewApiInfo(“帅哥的swaggerAPI文档”、“帅哥真帅”、“1.0”)https://www.bilibili.com/video/BV1Y441197Lw?p=2“,联系人,”Apache2.0“,”http://www.apache.org/licenses/LICENSE-2.0“,newArrayList();}}之前的swagger信息是默认值。上面的代码是我们对swagger的重新定义!

查看swagger教学视频,请点击 《狂神说java》: https://www.bilibili.com/video/BV1Y441197Lw?p=1 记得投币三连呀~~

Swagger

学习目标:

  • 了解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:

  • swagger2
  • ui

SpringBoot集成Swagger

目录结构:
Swagger学习笔记第1张

1、新建springboot项目

2、导入依赖

Swagger学习笔记第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

4、配置Swagger===>Config

@Configuration
@EnableSwagger2      //开启swagger2
public class SwaggerConfig {

}

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

Swagger学习笔记第3张

配置Swagger

配置了Swagger的docket的bean实例

@Configuration
@EnableSwagger2      //开启swagger2
public class SwaggerConfig {

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

    

配置swagger的信息

    //配置swagger信息ApiInfo
    private ApiInfo apiInfo(){
        
        //作者信息
        Contact CONTACT = new Contact("ztx", "https://www.cnblogs.com/", "123445@qq.com");
        
		//要返回的swagger信息=apiInfo
        return new ApiInfo("小帅哥的swaggerAPI文档",
                "这个帅哥确实帅",
                "1.0",
                "https://www.bilibili.com/video/BV1Y441197Lw?p=2",
                CONTACT,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}

之前的swagger信息是默认的,以上代码是我们对swagger信息的重新定义!

自定义后的swagger信息,如下:

Swagger学习笔记第4张

Swagger配置扫描接口

Docket.select

用法:.select() + ( .apis(xxx) / .path(xxx) ) + .build() 必须要和 .build() 方法搭配使用!!!

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

Swagger学习笔记第5张

因为在配置扫描接口方式时,我们定义的是只扫描"com.ztx.swagger.controller"包下面的,所以页面中接口信息部分如下:

Swagger学习笔记第6张

配置是否开启Swagger

    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //enable:是否开启swagger,如果为false,则swagger不开启,不能在浏览器中访问到swagger页面
                .enable(false)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.ztx.swagger.controller"))
                .build();
    }

浏览器中访问不到swagger页面

Swagger学习笔记第7张

问题:如何做到我只希望我的swagger在生产环境中使用,在发布时不使用?

  • 判断是不是生产环境 flag = false or flag = true
  • 注入enable(flag)

Swagger学习笔记第8张

当前项目环境设为: 开发环境 !

Swagger学习笔记第9张

设置开发环境和生产环境服务器端口号!

Swagger学习笔记第10张

Swagger学习笔记第11张

判断当前环境是否开发环境,从而决定是否开启swagger!

    @Bean  //获取当前环境需要用到environment对象
    public Docket docket(Environment environment){

        //设置要显示的Swagger环境,是否处于dev或test环境
        Profiles profiles = Profiles.of("dev","test");
        //通过environment.acceptsProfiles判断是否处在自己设定的环境当中
        boolean flag = environment.acceptsProfiles(profiles);

        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //是否开启swagger
                .enable(flag)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.ztx.swagger.controller"))
                .build();
    }

可以发现swagger页面只有在开发环境下的8081端口才可以显示,在生产环境的8082端口无效:

Swagger学习笔记第12张
Swagger学习笔记第13张

配置swaggerAPI文档分组

当多人协作开发时,每个人负责各自不同的业务区,这时为了便于显示每个人的业务是否合规,就需要用到分组功能,一个docket对应一个人:

    @Bean   
    public Docket docket1(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("李华")
            	。。。。。
                .enable(false);
    }

    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("旺仔")
           		。。。。。
                .enable(true);
    }
    
    //配置了swagger的docket的bean实例
    @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())
                .groupName("狂神")
                .enable(flag)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.ztx.swagger.controller"))
                .build();
    }

前端页面展示:(可以看到有三个定义的组,且每个组对应的swagger页面内容也是不同的)

Swagger学习笔记第14张

配置文档注释

创建一个实体类User:

public class User {

    public String username;
    public String password;

}

在controller中添加如下方法:

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

在User实体类添加Api相关注解:

@ApiModel("用户实体类")
public class User {

    @ApiModelProperty("用户名")
    public String username;
    @ApiModelProperty("密码")
    public String password;

}

加与没加Api注解的对比,如下图:

Swagger学习笔记第15张
Swagger学习笔记第16张

发现@Api注解 主要起到注释的作用!

在HelloController下使用Api注解:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }

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

    //Operation接口,不是放在类上,是方法上
    @ApiOperation("这是一个hello2方法")
    @GetMapping("/hello2")
    public String hello2(@ApiParam("用户名") String username){
        return "hello2"+username;
    }
}

前端页面显示:发现使用api注解的地方都出现了注释!!!

Swagger学习笔记第17张

补充一点:

@Api(tags = "hello控制器")  //添加在类上,该控制器注释同样会出现在页面文档中,由于该处是后加的,故上面截图就没体现出来
@RestController
public class HelloController {....}

常用注解

Swagger的所有注解定义在io.swagger.annotations包下

下面列一些经常用到的,未列举出来的可以另行查阅说明:

Swagger注解简单说明
@Api(tags = "xxx模块说明")作用在模块类上
@ApiOperation("xxx接口说明")作用在接口方法上
@ApiModel("xxxPOJO说明")作用在模型类上:如VO、BO
@ApiModelProperty(value = "xxx属性说明",hidden = true)作用在类方法和属性上,hidden设置为true可以隐藏该属性
@ApiParam("xxx参数说明")作用在参数、方法和字段上,类似@ApiModelProperty

总结

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

免责声明:文章转载自《Swagger学习笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转载自:【聚类算法】谱聚类(Spectral Clustering)IDEA切换git分支下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UML类图一

转自:http://blog.csdn.net/lovelion/article/details/7838679 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。 1.类 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系...

(一)JIRA API 对接

系统要跟JIRA对接,将本系统数据发送给jira,jira数据返回给本系统。 开始一头雾水怎么让数据传过去已什么形式存在,是存数据库呢还是怎么显示呢。研究半天发现其实只要将原数据作为json数据提供给jira接口,jira接口进行创建issue。 但前提在于要先创建项目。 jira的API 有很多有创建项目的,创建问题等。在线找到了6.1版本的API,根据...

解决Entity 实体类中加了@Id 注解后仍然出现org.hibernate.AnnotationException: No identifier specified for entity 错误

启动报错如下图所示: 解决方案: 查看网上的资料,大部分都说在实体类中没有添加加主键的注解@Id,这个是必须的。但是我的实体类中明明已经添加了@Id,为什么还会报这个错误呢? 后来检查了很久,发现是我import的包出现了错误,正确的应该是import javax.persistence.Id 而我却导入了org.springframework.data...

Java实体类自动生成serialVersionUID的方法

介绍在 Eclipse 和 IntelliJ IDEA 两种IDE中实现自动生成serialVersionUID的方法。 Eclipse 在Eclipse中创建实体类且实现Serializable序列化接口后,在类名所在行左侧有“黄色三角形感叹号提示符”且类名有黄色下划线提示(见下图), 第1步:单击提示符,弹出对话框 第2步:选中对话框中的“Add de...

MyBatis 映射文件详解(六)

MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上篇讲解全局配置文件,这篇接着讲解Mapper 接口映射文件 Mapper XML 映射文件详解 CRUD 标签(或元素) select Map...

获取项目中所有URL--获取swagger上展示的接口信息

有时我们需要接口的一些基本信息,比如接口请求路径,接口请求方式等,我们用这些信息来做判断,或者入库。 我在开发接口权限的时候就遇到了这个问题,之前写的接口很多,现在需要将这些接口信息存到数据库中, 用来做接口的权限操作,经过一番查阅,在此汇总了一下: @Autowired WebApplicationContext applicationCont...