目录

前言

什么是Swagger:

​ Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS)。

​ 它最方便的地方就在于,API文档可以和服务端保持同步,即服务端更新一个接口,前端的API文档就可以实时更新,而且可以在线测试。

​ 这样一来,Swagger就大大降低了前后端的沟通障碍,不用因为一个接口调不通而争论不休

之前用的看云文档,不过这种第三方的都需要手动维护,还是不太方便

起步

  1. 加载依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
  1. 添加@EnableOpenApi注解
@EnableOpenApi
@SpringBootApplication
public class SwaggerApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerApplication.class, args);
}
}
  1. 启动项目,访问"http://localhost:8080/swagger-ui/index.html"

这样一个简单的Swagger后台接口文档就搭建完成了;

下面我们说下配置和注解

配置

可以看到,上面那个界面中,默认显示了一个basic-error-controller接口分组,但是我们并没有写;

通过在项目中查找我们发现,SpringBoot内部确实有这样一个控制器类,如下所示:

这说明Swagger默认的配置,会自动把@Controller控制器类添加到接口文档中

下面我们就自己配置一下,如下所示:

import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; @Configuration
public class SwaggerConfig { @Bean
public Docket createRestApi() {
// 配置OAS 3.0协议
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
// 查找有@Tag注解的类,并生成一个对应的分组;类下面的所有http请求方法,都会生成对应的API接口
// 通过这个配置,就可以将那些没有添加@Tag注解的控制器类排除掉
.apis(RequestHandlerSelectors.withClassAnnotation(Tag.class))
.paths(PathSelectors.any())
.build();
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("GPS Doc")
.description("GPS Doc文档")
.termsOfServiceUrl("http://www.javalover.com")
.contact(new Contact("javalover", "http://www.javalover.cn", "1121263265@qq.com"))
.version("2.0.0")
.build();
} }

这样上面那个basic-error-controller就看不见了

注解

我们先看下Swagger2中的注解,如下所示:

  • @Api:用在控制器类上,表示对类的说明

    • tags="说明该类的作用,可以在UI界面上看到的说明信息的一个好用注解"
    • value="该参数没什么意义,在UI界面上也看到,所以不需要配置"
  • @ApiOperation:用在请求的方法上,说明方法的用途、作用

    • value="说明方法的用途、作用"
    • notes="方法的备注说明"
  • @ApiImplicitParams:用在请求的方法上,表示一组参数说明

    • @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面(标注一个指定的参数,详细概括参数的各个方面,例如:参数名是什么?参数意义,是否必填等)

      • name:属性值为方法参数名
      • value:参数意义的汉字说明、解释
      • required:参数是否必须传
      • paramType:参数放在哪个地方
      • header --> 请求参数的获取:@RequestHeader
      • query --> 请求参数的获取:@RequestParam
      • path(用于restful接口)--> 请求参数的获取:@PathVariable
      • dataType:参数类型,默认String,其它值dataType="Integer"
      • defaultValue:参数的默认值
  • @ApiResponses:用在请求的方法上,表示一组响应

    • @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息

      • code:状态码数字,例如400
      • message:信息,例如"请求参数没填好"
      • response:抛出异常的类
  • @ApiModel:用于响应类上(POJO实体类),描述一个返回响应数据的信息(描述POJO类请求或响应的实体说明)

    (这种一般用在post接口的时候,使用@RequestBody接收JSON格式的数据的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)

    • @ApiModelProperty:用在POJO属性上,描述响应类的属性说明
  • @ApiIgnore:使用该注解忽略这个某个API或者参数;

上面这些是Swagger2的注解,下面我们看下Swagger3和它的简单对比

接下来我们就用Swagger3的注解来写一个接口看下效果(其中穿插了Swagger2的注解)

  • 控制器UserController.java
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore; @Tag(name = "user-controller", description = "用户接口")
@RestController
public class UserController { // 忽略这个api
@Operation(hidden = true)
@GetMapping("/hello")
public String hello(){
return "hello";
} @Operation(summary = "用户接口 - 获取用户详情")
@GetMapping("/user/detail")
// 这里的@Parameter也可以不加,Swagger会自动识别到这个name参数
// 但是加@Parameter注解可以增加一些描述等有用的信息
public User getUser(@Parameter(in = ParameterIn.QUERY, name = "name", description = "用户名") String name){
User user = new User();
user.setUsername(name);
user.setPassword("123");
return user;
} @Operation(summary = "用户接口 - 添加用户")
@PostMapping("/user/add")
// 这里的user会被Swagger自动识别
public User addUser(@RequestBody User user){
System.out.println("添加用户");
return user;
} }

实体类User.java:


import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; @Schema
@Data
public class User { @Schema(name = "username", description = "用户名", example = "javalover")
private String username; @Schema(name = "password", description = "密码", example = "123456")
private String password; // 隐藏这个属性,这样接口文档的请求参数中就看不到这个属性
@Schema(hidden = true)
private String email; }

启动后运行界面如下:

  • 首页展示:

  • /user/add接口展示:

  • /user/detail接口展示

源码

整理在Github上:https://github.com/Jalon2015/spring-boot-demo/tree/master/demo-swagger3

问题

目前只是简单地体验了下,其实里面还是有很多坑,等后面有空再整理解决,下面列举几个:

  • @Paramters参数无效
  • @ApiImplicitParamter的body属性无效
  • @Tag的name属性:如果name属性不是当前类名的小写连字符格式,则会被识别为一个单独的接口分组
  • 等等

最近整理了一份面试资料《Java面试题-校招版》附答案,无密码无水印,感兴趣的可以关注公众号回复“面试”领取。

SpringBoot: 后台接口文档 - 基于Swagger3的更多相关文章

  1. springboot+swagger接口文档企业实践(下)

    目录 1.引言 2. swagger接口过滤 2.1 按包过滤(package) 2.2 按类注解过滤 2.3 按方法注解过滤 2.4 按分组过滤 2.4.1 定义注解ApiVersion 2.4.2 ...

  2. springboot+swagger接口文档企业实践(上)

    目录 1.引言 2.swagger简介 2.1 swagger 介绍 2.2 springfox.swagger与springboot 3. 使用springboot+swagger构建接口文档 3. ...

  3. springBoot Swagger2 接口文档生成

    // 生成配置类 package com.irm.jd.config.swagger; import org.springframework.context.annotation.Bean; impo ...

  4. Springboot系列(七) 集成接口文档swagger,使用,测试

    Springboot 配置接口文档swagger 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配 ...

  5. SpringBoot整合Swagger3生成接口文档

    前后端分离的项目,接口文档的存在十分重要.与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低.与swagger2相比新版的swagg ...

  6. SpringBoot + Swagger2 自动生成API接口文档

    spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端 ...

  7. 如何让接口文档自动生成,SpringBoot中Swagger的使用

    目录 一.在SpringBoot项目中配置Swagger2 1.pom.xml中对Swagger2的依赖 2.编写配置类启用Swagger 3.配置实体类的文档 4.配置接口的文档 5.访问文档 二. ...

  8. SpringBoot 如何生成接口文档,老鸟们都这么玩的!

    大家好,我是飘渺. SpringBoot老鸟系列的文章已经写了两篇,每篇的阅读反响都还不错,果然大家还是对SpringBoot比较感兴趣.那今天我们就带来老鸟系列的第三篇:集成Swagger接口文档以 ...

  9. 电商管理后台 API 接口文档

    1. 电商管理后台 API 接口文档 1.1. API V1 接口说明 接口基准地址:http://127.0.0.1:8888/api/private/v1/ 服务端已开启 CORS 跨域支持 AP ...

随机推荐

  1. 『居善地』接口测试 — 13、Moco框架的使用

    目录 1.Moco框架第一个练习 2.Get方法的Mock实现 3.Post方法的Mock实现 4.请求中加入Cookies 5.请求中加入Header 6.Moco模拟重定向 7.综合练习 8.总结 ...

  2. Spring Boot WebFlux-10——WebFlux 实战图书管理系统

    前言 本篇内容我们会实现如下图所示的城市管理系统,因为上面案例都用的是 City,所以这里直接使用城市作为对象,写一个简单的城市管理系统,如图所示: 结构 类似上面讲的工程搭建,新建一个工程编写此案例 ...

  3. GetModuleFileName函数的用法

    函数的功能 获取exe可执行文件的绝对路径. 用法 通过获取到exe的路径,可以获取到程序路径下(父路径或者子路径)的一些其它文件路径. 函数原型 DWORD WINAPI GetModuleFile ...

  4. 每日三道面试题,通往自由的道路10——JMM篇

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们还是继续聊聊多线程的一些其他话题吧! ...

  5. centos7 安装最新的 wiki confluence

    41.1 下载confluence Confluence是一个企业级的Wiki,可用于企业.部门.团队内部进行信息共享和协同编辑. 下载地址: https://www.atlassian.com/so ...

  6. 如何使用「mkvtoolnix」和「GoldWave」仅保留视频中左、右声道的其中一个声道?

    为什么要这样做? 我手上有一部电视剧的视频文件(.rmvb),每个视频文件都是"国/粤双语"的,与其他双语视频的两种语言的音频保存在两个音轨上不同,我这里的视频文件的双语是分别保存 ...

  7. 关于VIM的迁移

    将Gvim7.3从我笔记本拷到公司的电脑上面时, 这问题留了好久没有去解决.语法高亮无效不管我怎么设置 syntax enable,还是遇到这个问题. 后来在偶然的情况下,将我笔记本上面的文件在拷一份 ...

  8. 关于vue告警 More than 1 blank line not allowed

    开发vue-cli脚手架工程,eslint规范检查工具告警笔记 More than 1 blank line not allowed 代码空格不允许超过1行,把多余的空行删除就可以了

  9. POJ 1572 Automatic Editing 字符串替换,replace就够了

    题意不难理解,但是一开始还是没有看清楚题目.Replace the first occurrence of the find string within the text by the replace ...

  10. k8s部署docker容器

    一.环境 需机器已部署好k8s和docker的环境 二.操作步骤 1.将制作好的镜像推送到docker仓库 docker tag nginx:test harbor:test-nginx docker ...