SpringBoot: 后臺(tái)接口文檔 - 基于Swagger3

目錄

  • 前言:什么是Swagger
  • 起步:(只需簡(jiǎn)單的3步)
    • 加載依賴
    • 添加注解@EnableOpenApi
    • 啟動(dòng)SpringBoot,訪問(wèn)Swagger后臺(tái)界面
  • 配置:基于Java的配置
  • 注解:Swagger2 和 Swagger3做對(duì)比
  • 源碼:https://github.com/Jalon2015/spring-boot-demo/tree/master/demo-swagger3
  • 問(wèn)題:踩坑記錄(后面再整理)

前言

什么是Swagger:

Swagger 是最流行的 API 開發(fā)工具,它遵循 OpenAPI Specification(OpenAPI 規(guī)范,也簡(jiǎn)稱 OAS)。 

它最方便的地方就在于,API文檔可以和服務(wù)端保持同步,即服務(wù)端更新一個(gè)接口,前端的API文檔就可以實(shí)時(shí)更新,而且可以在線測(cè)試。

這樣一來(lái),Swagger就大大降低了前后端的溝通障礙,不用因?yàn)橐粋€(gè)接口調(diào)不通而爭(zhēng)論不休

之前用的看云文檔,不過(guò)這種第三方的都需要手動(dòng)維護(hù),還是不太方便

起步

  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. 啟動(dòng)項(xiàng)目,訪問(wèn)"http://localhost:8080/swagger-ui/index.html"
image-20210729112424407

這樣一個(gè)簡(jiǎn)單的Swagger后臺(tái)接口文檔就搭建完成了;

下面我們說(shuō)下配置和注解

配置

可以看到,上面那個(gè)界面中,默認(rèn)顯示了一個(gè)basic-error-controller接口分組,但是我們并沒(méi)有寫;

通過(guò)在項(xiàng)目中查找我們發(fā)現(xiàn),SpringBoot內(nèi)部確實(shí)有這樣一個(gè)控制器類,如下所示:

image-20210729113119350

這說(shuō)明Swagger默認(rèn)的配置,會(huì)自動(dòng)把@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協(xié)議
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .select()
                // 查找有@Tag注解的類,并生成一個(gè)對(duì)應(yīng)的分組;類下面的所有http請(qǐng)求方法,都會(huì)生成對(duì)應(yīng)的API接口
                // 通過(guò)這個(gè)配置,就可以將那些沒(méi)有添加@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();
    }

}

這樣上面那個(gè)basic-error-controller就看不見了

注解

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

  • @Api:用在控制器類上,表示對(duì)類的說(shuō)明

    • tags="說(shuō)明該類的作用,可以在UI界面上看到的說(shuō)明信息的一個(gè)好用注解"
    • value="該參數(shù)沒(méi)什么意義,在UI界面上也看到,所以不需要配置"
  • @ApiOperation:用在請(qǐng)求的方法上,說(shuō)明方法的用途、作用

    • value="說(shuō)明方法的用途、作用"
    • notes="方法的備注說(shuō)明"
  • @ApiImplicitParams:用在請(qǐng)求的方法上,表示一組參數(shù)說(shuō)明

    • @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一個(gè)請(qǐng)求參數(shù)的各個(gè)方面(標(biāo)注一個(gè)指定的參數(shù),詳細(xì)概括參數(shù)的各個(gè)方面,例如:參數(shù)名是什么?參數(shù)意義,是否必填等)
      • name:屬性值為方法參數(shù)名
      • value:參數(shù)意義的漢字說(shuō)明、解釋
      • required:參數(shù)是否必須傳
      • paramType:參數(shù)放在哪個(gè)地方
      • header --> 請(qǐng)求參數(shù)的獲?。篅RequestHeader
      • query --> 請(qǐng)求參數(shù)的獲取:@RequestParam
      • path(用于restful接口)--> 請(qǐng)求參數(shù)的獲?。篅PathVariable
      • dataType:參數(shù)類型,默認(rèn)String,其它值dataType="Integer"
      • defaultValue:參數(shù)的默認(rèn)值
  • @ApiResponses:用在請(qǐng)求的方法上,表示一組響應(yīng)

    • @ApiResponse:用在@ApiResponses中,一般用于表達(dá)一個(gè)錯(cuò)誤的響應(yīng)信息
      • code:狀態(tài)碼數(shù)字,例如400
      • message:信息,例如"請(qǐng)求參數(shù)沒(méi)填好"
      • response:拋出異常的類
  • @ApiModel:用于響應(yīng)類上(POJO實(shí)體類),描述一個(gè)返回響應(yīng)數(shù)據(jù)的信息(描述POJO類請(qǐng)求或響應(yīng)的實(shí)體說(shuō)明)
    (這種一般用在post接口的時(shí)候,使用@RequestBody接收J(rèn)SON格式的數(shù)據(jù)的場(chǎng)景,請(qǐng)求參數(shù)無(wú)法使用@ApiImplicitParam注解進(jìn)行描述的時(shí)候)

    • @ApiModelProperty:用在POJO屬性上,描述響應(yīng)類的屬性說(shuō)明
  • @ApiIgnore:使用該注解忽略這個(gè)某個(gè)API或者參數(shù);

上面這些是Swagger2的注解,下面我們看下Swagger3和它的簡(jiǎn)單對(duì)比

Swagger3注解

接下來(lái)我們就用Swagger3的注解來(lái)寫一個(gè)接口看下效果(其中穿插了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 {

    // 忽略這個(gè)api
    @Operation(hidden = true)
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }

    @Operation(summary = "用戶接口 - 獲取用戶詳情")
    @GetMapping("/user/detail")
    // 這里的@Parameter也可以不加,Swagger會(huì)自動(dòng)識(shí)別到這個(gè)name參數(shù)
    // 但是加@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會(huì)被Swagger自動(dòng)識(shí)別
    public User addUser(@RequestBody User user){
        System.out.println("添加用戶");
        return user;
    }

}

實(shí)體類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;

    // 隱藏這個(gè)屬性,這樣接口文檔的請(qǐng)求參數(shù)中就看不到這個(gè)屬性
    @Schema(hidden = true)
    private String email;

}

啟動(dòng)后運(yùn)行界面如下:

  • 首頁(yè)展示:
image-20210729132629924
  • /user/add接口展示:
image-20210729132730799
  • /user/detail接口展示

    image-20210729132849933

源碼

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

問(wèn)題

目前只是簡(jiǎn)單地體驗(yàn)了下,其實(shí)里面還是有很多坑,等后面有空再整理解決,下面列舉幾個(gè):

  • @Paramters參數(shù)無(wú)效
  • @ApiImplicitParamter的body屬性無(wú)效
  • @Tag的name屬性:如果name屬性不是當(dāng)前類名的小寫連字符格式,則會(huì)被識(shí)別為一個(gè)單獨(dú)的接口分組
  • 等等

最近整理了一份面試資料《Java面試題-校招版》附答案,無(wú)密碼無(wú)水印,感興趣的可以關(guān)注公眾號(hào)回復(fù)“面試”領(lǐng)取。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容