swagger

Swagger简介

前后端分离

  • 前端 -> 前端控制层、视图层
  • 后端 -> 后端控制层、服务层、数据访问层
  • 前后端通过API进行交互
  • 前后端相对独立且松耦合

产生的问题

  • 前后端集成,前端或者后端无法做到”及时协商,尽早解决”,最终导致问题集中爆发

解决方案

  • 首先定义schema [ 计划的提纲 ],并实时跟踪最新的API,降低集成风险

Swagger

  • 号称世界上最流行的API框架
  • Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新
  • 直接运行,在线测试API
  • 支持多种语言 (如:Java,PHP等)
  • 官网:https://swagger.io/

SpringBoot集成Swagger

SpringBoot集成Swagger=> springfox,两个jar包

  • Springfox-swagger2
  • swagger-springmvc

使用Swagger

要求:jdk 1.8 + 否则swagger2无法运行

步骤:

1、新建一个SpringBoot-web项目

2、添加Maven依赖

io.springfox   springfox-swagger2   2.9.2   io.springfox   springfox-swagger-ui   2.9.2

3、编写HelloController,测试确保运行成功!

4、要使用Swagger,我们需要编写一个配置类-SwaggerConfig来配置 Swagger

@Configuration //配置类@EnableSwagger2// 开启Swagger2的自动配置public class SwaggerConfig {  }

5、访问测试 :http://localhost:8080/swagger-ui.html ,可以看到swagger的界面;

swagger

配置Swagger

1、Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swaggger。

@Bean //配置docket以配置Swagger具体参数public Docket docket() {   return new Docket(DocumentationType.SWAGGER_2);}

2、可以通过apiInfo()属性配置文档信息

//配置文档信息private ApiInfo apiInfo() {   Contact contact = new Contact("联系人名字", "http://xxx.xxx.com/联系人访问链接", "联系人邮箱");   return new ApiInfo(           "Swagger学习", // 标题           "学习演示如何配置Swagger", // 描述           "v1.0", // 版本           "http://terms.service.url/组织链接", // 组织链接           contact, // 联系人信息           "Apach 2.0 许可", // 许可           "许可链接", // 许可连接           new ArrayList<>()// 扩展  );}

3、Docket 实例关联上 apiInfo()

@Beanpublic Docket docket() {   return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());}

4、重启项目,访问测试 http://localhost:8080/swagger-ui.html 看下效果;

配置扫描接口

1、构建Docket时通过select()方法配置怎么扫描接口。

@Beanpublic Docket docket() {   return new Docket(DocumentationType.SWAGGER_2)      .apiInfo(apiInfo())      .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口      .apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))      .build();}

2、重启项目测试,由于我们配置根据包的路径扫描接口,所以我们只能看到一个类

3、除了通过包路径配置扫描接口外,还可以通过配置其他方式扫描接口,这里注释一下所有的配置方式:

any() // 扫描所有,项目中的所有接口都会被扫描到none() // 不扫描接口// 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求withMethodAnnotation(final Class annotation)// 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有controller注解的类中的接口withClassAnnotation(final Class annotation)basePackage(final String basePackage) // 根据包路径扫描接口

4、除此之外,我们还可以配置接口扫描过滤:

@Beanpublic Docket docket() {   return new Docket(DocumentationType.SWAGGER_2)      .apiInfo(apiInfo())      .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口      .apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))       // 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口      .paths(PathSelectors.ant("/kuang/**"))      .build();}

5、这里的可选值还有

any() // 任何请求都扫描none() // 任何请求都不扫描regex(final String pathRegex) // 通过正则表达式控制ant(final String antPattern) // 通过ant()控制

swagger

配置Swagger开关

1、通过enable()方法配置是否启用swagger,如果是false,swagger将不能在浏览器中访问了

@Beanpublic Docket docket() {   return new Docket(DocumentationType.SWAGGER_2)      .apiInfo(apiInfo())      .enable(false) //配置是否启用Swagger,如果是false,在浏览器将无法访问      .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口      .apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))       // 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口      .paths(PathSelectors.ant("/kuang/**"))      .build();}

2、如何动态配置当项目处于test、dev环境时显示swagger,处于prod时不显示?

@Beanpublic Docket docket(Environment environment) {   // 设置要显示swagger的环境   Profiles of = Profiles.of("dev", "test");   // 判断当前是否处于该环境   // 通过 enable() 接收此参数判断是否要显示   boolean b = environment.acceptsProfiles(of);      return new Docket(DocumentationType.SWAGGER_2)      .apiInfo(apiInfo())      .enable(b) //配置是否启用Swagger,如果是false,在浏览器将无法访问      .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口      .apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))       // 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口      .paths(PathSelectors.ant("/kuang/**"))      .build();}

3、可以在项目中增加一个dev的配置文件查看效果!

swagger

配置API分组

swagger

1、如果没有配置分组,默认是default。通过groupName()方法即可配置分组:

@Beanpublic Docket docket(Environment environment) {   return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())      .groupName("hello") // 配置分组       // 省略配置....}

2、重启项目查看分组

3、如何配置多个分组?配置多个分组只需要配置多个docket即可:

@Beanpublic Docket docket1(){   return new Docket(DocumentationType.SWAGGER_2).groupName("group1");}@Beanpublic Docket docket2(){   return new Docket(DocumentationType.SWAGGER_2).groupName("group2");}@Beanpublic Docket docket3(){   return new Docket(DocumentationType.SWAGGER_2).groupName("group3");}

4、重启项目查看即可

实体配置

1、新建一个实体类

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

2、只要这个实体在 请求接口的返回值上(即使是泛型),都能映射到实体项中:

@RequestMapping("/getUser")public User getUser(){   return new User();}

3、重启查看测试

swagger

注:并不是因为@ApiModel这个注解让实体显示在这里了,而是只要出现在接口方法的返回值上的实体都会显示在这里,而@ApiModel和@ApiModelProperty这两个注解只是为实体添加注释的。

@ApiModel为类添加注释

@ApiModelProperty为类属性添加注释

常用注解

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

下面列一些经常用到的,未列举出来的可以另行查阅说明:
Swagger注解简单说明@Api(tags = “xxx模块说明”)作用在模块类上@ApiOperation(“xxx接口说明”)作用在接口方法上@ApiModel(“xxxPOJO说明”)作用在模型类上:如VO、BO @ApiModelProperty(value = “xxx属性说明”,hidden = true)作用在类方法和属性上,hidden设置为true可以隐藏该属性@ApiParam(“xxx参数说明”)作用在参数、方法和字段上,类似@ApiModelProperty

我们也可以给请求的接口配置一些注释

@ApiOperation("狂神的接口")@PostMapping("/kuang")@ResponseBodypublic String kuang(@ApiParam("这个名字会被返回")String username){   return username;}

这样的话,可以给一些比较难理解的属性或者接口,增加一些配置信息,让人更容易阅读!

相较于传统的Postman或Curl方式测试接口,使用swagger简直就是傻瓜式操作,不需要额外说明文档(写得好本身就是文档)而且更不容易出错,只需要录入数据然后点击Execute,如果再配合自动化框架,可以说基本就不需要人为操作了。

Swagger是个优秀的工具,现在国内已经有很多的中小型互联网公司都在使用它,相较于传统的要先出Word接口文档再测试的方式,显然这样也更符合现在的快速迭代开发行情。当然了,提醒下大家在正式环境要记得关闭Swagger,一来出于安全考虑二来也可以节省运行时内存。

Original: https://www.cnblogs.com/happy12123/p/16364979.html
Author: happy_in
Title: swagger

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592331/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mybatis中jdbcType和javaType的对应关系

    JDBC Type Java Type 2 CHAR String 3 VARCHAR String 4 LONGVARCHAR String 5 NUMERIC java.mat…

    Java 2023年5月29日
    0116
  • Springboot 生成验证码

    一、目录结构 二、功能讲解 (1)验证码配置文件 打开KaptchaConfig.java java;gutter:true @Component public class Kap…

    Java 2023年5月30日
    070
  • 拜托,面试官别问我「位图」了

    这是之前面试的时候面试官问到过的一个问题,今天正好看到 布隆过滤器,写篇文章总结一下 我们先看一下流程,流程懂了,问题就解决 90%了 我们都知道一个 int 占 4字节,一个字节…

    Java 2023年6月9日
    089
  • 实战篇:断点续传?文件秒传?手撸大文件上传

    各位看官大家好,今天给大家分享的又是一篇实战文章,希望大家能够喜欢。 开味菜 最近接到一个新的需求,需要上传 2G左右的视频文件,用测试环境的 OSS试了一下,上传需要十几分钟,再…

    Java 2023年6月5日
    083
  • Netty源码解读(一)-前置准备

    前置条件 源码版本netty4.1 了解Java NIO、Reactor模型和Netty的基本使用。 解释一下: Java NIO:了解BIO和NIO的区别以及Java NIO基础…

    Java 2023年6月16日
    067
  • 万字剖析Ribbon核心组件以及运行原理

    大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码。本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文…

    Java 2023年6月16日
    055
  • web项目访问引用jar内部的静态资源

    一、实现原理 在Servlet3协议规范中,包含在JAR文件 /META-INFO/resources/路径下的资源可以直接访问。 二、举例说明 如下图所示,是我新建的一个Spri…

    Java 2023年6月15日
    080
  • Java 泛型程序设计

    1. 泛型类 public class Pair<t> { private T first; private T second; public void setSeco…

    Java 2023年6月16日
    082
  • 力扣35题搜索插入位置Q35SearchInsertPosition

    Q35SearchInsertPosition 题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 …

    Java 2023年6月8日
    089
  • Spring Boot 如何干掉 if else?

    需求 这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。 订单实体: service接口: 传统实现 根据订单类型写一堆的…

    Java 2023年5月30日
    075
  • 03第三章:【1】_MQTT协议数据包结构

    一、MQTT协议数据包结构 在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成…

    Java 2023年5月29日
    055
  • 前端,单个文件下载或者分批压缩多个文件下载

    import JSZip from "jszip"; import fileSaver from "file-saver"; import …

    Java 2023年6月8日
    070
  • Linux下用Docker部署接口安全的运行环境

    背景:MySQL 数据库运行在宿主机上(Linux) 需求:Redis、服务、页面分别运行在独立的docker中,并处于同一网络,容器内部重要目录要挂载在物理目录,保证数据安全 方…

    Java 2023年6月8日
    094
  • Spring-Boot-Actuator

    1、Actuator 分布式导致部署服务的增多,运维人员压力倍增,传统的运维方法已经不适应相应的变化,需要对应的监控措施来确保衡量服务的运行情况。actuator为Spring B…

    Java 2023年6月8日
    078
  • Nginx作反向代理时超时重试配置

    nginx重置,nginx超时 这里只讨论作反向代理时,当上游服务发生如接口超时、返回指定状态码等状况时而导致nginx超时重试。 这里使用的nginx版本为 1.16.1,可通过…

    Java 2023年6月8日
    086
  • 一万了解 Gateway 知识点

    1.什么是 网关 API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等。 网关的核心作用就是路…

    Java 2023年6月5日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球