乐趣区

关于java:SrpingBoot-后台接口文档-基于Swagger3

目录

  • 前言:什么是 Swagger
  • 起步:(只需简略的 3 步)

    • 加载依赖
    • 增加注解 @EnableOpenApi
    • 启动 SpringBoot,拜访 Swagger 后盾界面
  • 配置:基于 Java 的配置
  • 注解:Swagger2 和 Swagger3 做比照
  • 源码:https://github.com/Jalon2015/…
  • 问题:踩坑记录(前面再整顿)

前言

什么是 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/…

问题

目前只是简略地体验了下,其实外面还是有很多坑,等前面有空再整顿解决,上面列举几个:

  • @Paramters 参数有效
  • @ApiImplicitParamter 的 body 属性有效
  • @Tag 的 name 属性:如果 name 属性不是以后类名的小写连字符格局,则会被辨认为一个独自的接口分组
  • 等等

最近整顿了一份面试材料《Java 面试题 - 校招版》附答案,无明码无水印,感兴趣的能够关注公众号回复“面试”支付。

退出移动版