专栏首页汤圆学JavaSpringBoot: 后台接口文档 - 基于Swagger3
原创

SpringBoot: 后台接口文档 - 基于Swagger3

目录

前言

什么是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"
image-20210729112424407

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

下面我们说下配置和注解

配置

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

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

image-20210729113119350

这说明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注解

接下来我们就用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;

}

启动后运行界面如下:

  • 首页展示:
image-20210729132629924
  • /user/add接口展示:
image-20210729132730799
  • /user/detail接口展示
image-20210729132849933

源码

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

问题

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

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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Swagger3.0官方starter诞生,可以扔掉那些野生starter了

    对于 Rest API 来说很重要的一部分内容就是文档,Swagger 为我们提供了一套通过代码和注解自动生成文档的方法,这一点对于保证 API 文档的及时性将...

    业余草
  • Swagger 3.0使用教程

    由于Spring的流行,Marty Pitt编写了一个基于Spring的组件swagger-springmvc,用于将swagger集成到springmvc中来...

    斑马
  • Swagger3就是比2简单粗暴

    接口文档总是很烦人,我曾经尝试过用Postman来编写和分享项目文档,感觉还不错。但是最近项目紧,我没有额外的时间可以花在它上面,这也导致我尝试YApi(另外一...

    码农小胖哥
  • MLVBLiveRoom 方案 - 管理后台RoomService接口文档

    本文用于介绍移动直播 MLVBLiveRoom 方案的管理后台部分,MLVBLiveRoom 方案包含了两部分内容:客户端 MLVBLiveRoom 组件 + ...

    腾讯云-chaoli
  • (九) SpringBoot起飞之路-整合/集成Swagger 2 And 3

    在最早的 JavaWeb 时代的时候,如果想要返回一个页面,你需要一行一行的去 print,如果遇到变量,还需要自己进行字符串的拼接

    BWH_Steven
  • 教育平台项目后台管理系统:接口文档

    RendaZhang
  • API管理-基于SpringBoot项目集成swagger实现接口文档自动生成

    上一次博客(API管理-使用开源xxl-api项目管理接口)中我也提到过接口文档在整个生命周期中的重要性以及使用开源xxl-api的优缺点,缺点就是没法自动完成...

    秋日芒草
  • SSM 单体框架 - 教育平台后台管理系统:接口文档

    接口地址: http://localhost:8080/ssm_web/course/findCourseByCondition

    RendaZhang
  • Jmeter基于webscoket测试后台服务接口实战

    本来就是web端+后台服务之间使用webscoket通信实现功能,通信格式用json,现在就是抛开web页面,使用接口工具,模拟web与后台服务通信。这里我使用...

    FunTester
  • 为了不写接口文档,我肝了个 IDEA 插件!

    写代码的快乐,在于通过一顿猛如虎的操作,实现了自己设计的逻辑流程。(也可能并不是很快乐!)

    程序员小航
  • 通过Swagger管理API:API Management学习第一篇

    3 Scale有个很好的功能,它提供ActiveDocs实时文档。它基于Swagger框架,提供了一种记录API的方法,并包含在Developer Portal...

    魏新宇
  • 【测试开发-1】基于Springboot+layui实现接口自动化平台

    接口自动化,与UI自动化相比,其维护成本更低,结果校验更精确。目前,接口自动化无论是使用testng框架者还是使用Jmeter,都有一定的局限性,前者需要一定代...

    云深i不知处
  • SpringBoot集成Swagger2

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来...

    用户2929716
  • 快速学习-Smart-Doc Project 基于JAVA-REST和dubbo的API接口文档

    smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型...

    cwl_java
  • 实习第一周

    前端使用Angular进行开发,后台使用springboot开发。 接下来主要就是学习Angularjs

    治电小白菜
  • 15 个优秀开源的 Spring Boot 学习项目,一网打尽!

    Spring Boot 算是目前 Java 领域最火的技术栈了,松哥年初出版的 《Spring Boot + Vue 全栈开发实战》迄今为止已经加印了 8 次,...

    江南一点雨
  • 【程序源代码】SpringBoot2.2.0版本开发框架

    系统?基于Spring Boot框架,前台框架为JUI的后台框架,功能会继续添加,欢迎大家star和fork!该项目是为了大家更好地运用Spring Boot的...

    程序源代码
  • 基于SpringCloud Finchley.SR1 、Spring Oauth2 SpringBoot 2.x、 vue、element-ui 微服务基础脚手架

    github 地址 跪求大家star panda微服务工程地址 panda-admin前台工程地址

    yukong
  • 推荐6个好评最高的前后端分离项目

    前后端分离的开发模式,前后端程序猿只需要提前约定好接口文档(参数、数据类型),然后并行开发即可,最后完成前后端集成,遇到问题同步修改即可,真正实现了前后端应用的...

    开源君

扫码关注云+社区

领取腾讯云代金券