Swagger 官方 Starter 配上這個增強方案是真的香!

Python實戰社羣

Java實戰社羣

長按識別下方二維碼,按需求添加

掃碼關注添加客服

進Python社羣▲

掃碼關注添加客服

進Java社羣

作者丨Guide哥

來源丨JavaGuide(ID:JavaGuide)

這篇文章,簡單給大家聊聊項目必備的 Swagger 該怎麼玩。

何爲 Swagger ? 簡單來說,Swagger 就是一套基於 OpenAPI 規範構建的開源工具,可以幫助我們設計、構建、記錄以及使用 Rest API。

爲何要用 Swagger ? 前後端分離的情況下,一份 Rest API 文檔將會極大的提高我們的工作效率。前端小夥伴只需要對照着 Rest API 文檔就可以搞清楚一個接口需要的參數以及返回值。通過 Swagger 我們只需要少量註解即可生成一份自帶 UI 界面的 Rest API 文檔,不需要我們後端手動編寫。並且,通過 UI 界面,我們還可以直接對相應的 API 進行調試,省去了準備複雜的調用參數的過程。

這篇文章的主要內容:

  1. SpringBoot 項目中如何使用?

  2. Spring Security 項目中如何使用?

  3. 使用 knife4j 增強 Swagger

以下演示所用代碼,你可以在這個倉庫找到:https://github.com/Snailclimb/spring-security-jwt-guide (從零入門 !Spring Security With JWT(含權限驗證)後端部分代碼)

SpringBoot 項目中如何使用?

Swagger3.0 官方已經有了自己的 Spring Boot Starter,只需要添加一個 jar 包即可(SpringBoot 版本 2.3.6.RELEASE)。。

<!-- swagger -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

什麼都不用配置!直接在瀏覽器中訪問 :http://ip:port/swagger-ui/ 即可。

Spring Security 項目中如何使用?

如果你的項目使用了 Spring Security 做權限認證的話,你需要爲 Swagger 相關 url 添加白名單。

    String[] SWAGGER_WHITELIST = {
            "/swagger-ui.html",
            "/swagger-ui/*",
            "/swagger-resources/**",
            "/v2/api-docs",
            "/v3/api-docs",
            "/webjars/**"
    };

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()
                // 禁用 CSRF
                .csrf().disable()
                .authorizeRequests()
                // swagger
                .antMatchers(SWAGGER_WHITELIST).permitAll()
          ......
    }

另外,某些請求需要認證之後纔可以訪問,爲此,我們需要對 Swagger 做一些簡單的配置。

配置的方式非常簡單,我提供兩種不同的方式給小夥伴們。

  1. 登錄後自動爲請求添加 token。

  2. 爲請求的 Header 添加一個認證參數,每次請求的時候,我們需要手動輸入 token。

登錄後自動爲請求添加 token

通過這種方式我們只需要授權一次即可使用所有需要授權的接口。

/**
 * @author shuang.kou
 * @description swagger 相關配置
 */
@Configuration
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("github.javaguide.springsecurityjwtguide"))
                .paths(PathSelectors.any())
                .build()
                .securityContexts(securityContext())
                .securitySchemes(securitySchemes());
    }

    private List<SecurityScheme> securitySchemes() {
        return Collections.singletonList(new ApiKey("JWT", SecurityConstants.TOKEN_HEADER, "header"));
    }

    private List<SecurityContext> securityContext() {
        SecurityContext securityContext = SecurityContext.builder()
                .securityReferences(defaultAuth())
                .build();
        return Collections.singletonList(securityContext);
    }

    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope
                = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Collections.singletonList(new SecurityReference("JWT", authorizationScopes));
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Security JWT Guide")
                .build();
    }
}

未登錄前:

登錄後:

爲請求的 Header 添加一個認證參數

每次請求的時候,我們需要手動輸入 token 到指定位置。

@Configuration
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("github.javaguide.springsecurityjwtguide"))
                .paths(PathSelectors.any())
                .build()
                .globalRequestParameters(authorizationParameter())
                .securitySchemes(securitySchemes());
    }

    private List<SecurityScheme> securitySchemes() {
        return Collections.singletonList(new ApiKey("JWT", SecurityConstants.TOKEN_HEADER, "header"));
    }

    private List<RequestParameter> authorizationParameter() {
        RequestParameterBuilder tokenBuilder = new RequestParameterBuilder();
        tokenBuilder
                .name("Authorization")
                .description("JWT")
                .required(false)
                .in("header")
                .accepts(Collections.singleton(MediaType.APPLICATION_JSON))
                .build();
        return Collections.singletonList(tokenBuilder.build());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Security JWT Guide")
                .build();
    }
}

使用 knife4j 增強 Swagger

Swagger 原生提供的界面使用體驗比較差。常用的增強 Swagger 的方案有下面兩種:

  1. YApi :YApi 是一個可本地部署的、打通前後端及 QA 的、可視化的接口管理平臺。可以幫助我們讓 swagger 頁面的體驗更加友好,目前很多大公司都在使用這個開源工具。項目地址:https://github.com/YMFE/yapi 。使用方法:當 Swagger 遇上 YApi,瞬間高大上了!

  2. Knife4j :Swagger 生成 Api 文檔的增強解決方案,前身是 swagger-bootstrap-ui 。官方文檔:https://xiaoym.gitee.io/knife4j/documentation/ 。

根據官網介紹,knife4j 是爲 Java MVC 框架集成 Swagger 生成 Api 文檔的增強解決方案。

項目地址:https://gitee.com/xiaoym/knife4j 。

使用方式非常簡單,添加到相關依賴即可(SpringBoot 版本 2.3.6.RELEASE)。

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>

完成之後,訪問:http://ip:port/doc.html 即可。

效果如下。可以看出,相比於 swagger 原生 ui 確實好看實用了很多。

除了 UI 上的增強之外,knife4j 還提供了一些開箱即用的功能。

比如:搜索 API 接口knife4j 版本>2.0.1 )

再比如:導出離線文檔

通過 Knife4j 我們可以非常方便地導出 Swagger 文檔 ,並且支持多種格式。

  • markdown:導出當前邏輯分組下所有接口的 Markdown 格式的文檔

  • Html:導出當前邏輯分組下所有接口的 Html 格式的文檔

  • Word:導出當前邏輯分組下所有接口的 Word 格式的文檔(自 2.0.5 版本開始)

  • OpenAPI:導出當前邏輯分組下的原始 OpenAPI 的規範 json 結構(自 2.0.6 版本開始)

  • PDF:未實現

以 HTML 格式導出的效果圖如下。

還等什麼?快去試試吧!

作者簡介:Guide哥,Java後端開發,會一點前端知識,喜歡烹飪,自由的少年。一個三觀比主角還正的技術人。

程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣

近期精彩內容推薦:  

 爲何說IT科技公司應該留住35歲員工?

 工友們!大家好,今天你摸魚了嗎?

 緩存穿透,雪崩,擊穿以及解決方案分析

 圖文詳解:如何給女朋友解釋什麼是微服務?


在看點這裏好文分享給更多人↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章