1. 程式人生 > 其它 >Spring Boot 入門系列(二十二)使用Swagger2構建 RESTful API文件

Spring Boot 入門系列(二十二)使用Swagger2構建 RESTful API文件

前面介紹瞭如何Spring Boot 快速打造Restful API 介面,也介紹瞭如何優雅的實現 Api 版本控制,不清楚的可以看我之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html

在實際專案中,Api 介面系統對接過程中,Api 介面文件是非常重要的文件。一般是設計完成之後,同時編寫Api 介面文件,然後將介面文件發給相關人員,於是大家就按照該文件開發、整合並最終上線。但是,這是一種非常理想的狀態,實際開發中,介面不斷變化,介面文件也必須保持更新,這是一個非常麻煩的過程!為了解決這些問題,Swagger2 應運而生。接下來,就和大夥聊一聊 Spring Boot 如何整合Swagger2,使用Swagger2構建 RESTful API文件。

什麼是Swagger

Swagger 是一個規範和完整的框架,用於生成、描述、呼叫和視覺化 RESTful 風格的 Web 服務。是世界上最流行的 API 表達工具 。我們知道,RESTful API 可能要面對多個開發人員或多個開發團隊:IOS開發、Android開發或是Web前端開發等。為了減少與其他團隊平時開發期間的頻繁溝通成本,一般我們會建立一份API文件來記錄所有介面細節,但是api 介面文件存在以下問題:

  • 由於介面眾多,並且細節複雜(需要考慮不同的HTTP請求型別、HTTP頭部資訊、HTTP請求內容等),要建立這樣一份高質量的文件本身就是件非常吃力的事。
  • 隨著需求的不斷變化,介面文件也必須同步修改,這很容易導致文件和業務不一致情況出現。

為了解決這些問題,Swagger2 應運而生。它可以輕鬆的整合到Spring Boot 中,自動生成強大的 RESTful API文件。這樣既可以減少我們建立文件的工作量,同時說明內容又整合入實現程式碼中,讓維護文件和修改程式碼整合為一體,可以讓我們在修改程式碼邏輯的同時方便的修改文件說明。另外Swagger2也提供了完整的測試頁面,來除錯每個API 介面。

下面就以SpringBoot中整合Swagger為例做介紹說明Swagger2 的功能和作用。

Spring Boot 實現Swagger 2

Spring Boot 整合 Swagger 2很簡單,首先新建一個 SpringBoot 專案,這裡就不重新建立專案,直接使用之前的rest 測試專案。

然後引入依賴並做基礎配置即可:

1、配置Swagger2的依賴

在pom.xml 配置檔案中,增加Swagger 2 的相關依賴,具體如下:

<!-- swagger2 依賴配置-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>

注意,swagger 2 的版本號和 spring boot的版本號有些不匹配,最開始用2.2的版本和spring boot 的版本還不匹配,後來把 swagger 2 換成了2.8。

2、建立Swagger 2配置類

在com.weiz.config 包中,增加Swagger 2 的配置類,SwaggerConfig 類,具體程式碼如下:

package com.weiz.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class Swagger2Config implements WebMvcConfigurer {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.weiz.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2構建RESTful APIs")
                .description("Spring Boot相關文章請關注:https://www.cnblogs.com/zhangweizhong")
                .termsOfServiceUrl("https://www.cnblogs.com/zhangweizhong")
                .contact("架構師精進")
                .version("1.0")
                .build();
    }

    /**
     *  swagger增加url對映
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

說明:@Configuration 註解讓Spring boot來載入該類配置,@EnableSwagger2註解啟用Swagger 2,通過配置一個Docket Bean,配置對映路徑和要掃描的介面的位置。apiInfo,主要配置一下Swagger2文件網站的資訊,例如網站的title、網站的描述、使用的協議等等。

注意

  1、basePackage 可以在SwaggerConfig 裡面配置 com.weiz.controller,也可以在啟動器裡面 ComponentScan配置。

  2、需要在swaggerconfig 中配置swagger 的url 對映。

3、新增文件說明內容

上面配置完成之後,接下來需要在api 介面上增加內容說明。這裡方便起見,就直接在之前的UserController 中,增加相應的介面內容說明,程式碼如下所示:

package com.weiz.controller;

import com.weiz.pojo.SysUser;
import com.weiz.service.UserService;
import com.weiz.utils.JSONResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.n3r.idworker.Sid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@Api(tags = {"使用者介面"})
@RestController
@RequestMapping("/")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private Sid sid;

    @ApiOperation(value="建立使用者", notes="根據User物件建立使用者")
    @PostMapping(value = "user")
    public JSONResult create(@RequestBody SysUser user) throws Exception {
        String userId = sid.nextShort();
        user.setId(userId);
        userService.saveUser(user);
        return JSONResult.ok("儲存成功");
    }

    @ApiOperation(value="更新使用者詳細資訊", notes="根據id來指定更新物件,並根據傳過來的user資訊來更新使用者詳細資訊")
    @PutMapping(value = "user")
    public JSONResult update(@RequestBody SysUser user) {
        userService.updateUser(user);
        return JSONResult.ok("儲存成功");
    }

    @ApiOperation(value="刪除使用者", notes="根據url的id來指定刪除物件")
    @DeleteMapping("user/{userId}")
    public JSONResult delete(@PathVariable String userId) {
        userService.deleteUser(userId);
        return JSONResult.ok("刪除成功");
    }

    @ApiOperation(value="查詢使用者",notes = "通過使用者ID獲取使用者資訊")
    @GetMapping("user/{userId}")
    public JSONResult queryUserById(@PathVariable String userId) {
        return JSONResult.ok(userService.queryUserById(userId));
    }
}

說明:

  1、@Api註解,用來給整個controller 增加說明。
  2、@ApiOperation註解,用來給各個API 方法增加說明。
  3、@ApiImplicitParams、@ApiImplicitParam註解,用來給引數增加說明。

  4、Swagger 還有用於物件引數的註解,物件引數的描述也可以放在實體類中。這裡不細說,大家可以自行研究。

測試驗證

完成上面的配置和程式碼修改之後,Swagger 2 就整合到Spring boot 專案中了,接下來啟動Spring Boot程式,訪問:http://localhost:8088/swagger-ui.html

最後

以上,就把Spring Boot 如何整合Swagger2,使用Swagger2構建 RESTful API文件 介紹完了。實現還是比較簡單的,但是還是需要理解裡面的相關注解的用法。

這個系列課程的完整原始碼,也會提供給大家。大家關注我的微信公眾號(架構師精進),回覆:springboot原始碼。獲取這個系列課程的完整原始碼。


作者:章為忠
如有問題,可以微信:18618243664聯絡我,非常感謝。

關注我的微信公眾號,獲取相關的 原始碼及視訊資料