SpringBoot整合Swagger2實現接口文檔自動生成

一、爲什麼使用Swagger2

當下很多公司都採取前後端分離的開發模式,前端和後端的工作由不同的工程師完成。在這種開發模式下,維持一份及時更新且完整的 Rest API 文檔將會極大的提高我們的工作效率。傳統意義上的文檔都是後端開發人員手動編寫的,相信大家也都知道這種方式很難保證文檔的及時性,這種文檔久而久之也就會失去其參考意義,反而還會加大我們的溝通成本。而 Swagger 給我們提供了一個全新的維護 API 文檔的方式,下面我們就來了解一下它的優點:
1、代碼變,文檔變。只需要少量的註解,Swagger 就可以根據代碼自動生成 API 文檔,很好的保證了文檔的時效性。
2、跨語言性,支持 40 多種語言。
3、Swagger UI 呈現出來的是一份可交互式的 API 文檔,我們可以直接在文檔頁面嘗試 API 的調用,省去了準備複雜的調用參數的過程。
4、還可以將文檔規範導入相關的工具(例如 Postman、SoapUI), 這些工具將會爲我們自動地創建自動化測試。

二、Swagger2實用配置

1、工程創建

當然,首先是創建一個Spring Boot項目,加入web依賴,創建成功後,加入兩個Swagger2相關的依賴,完整的依賴如下:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、Swagger2配置

Swagger2的配置也是比較容易的,在項目創建成功之後,只需要開發者自己提供一個Docket的Bean即可,如下:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.nvn.controller"))
                .paths(PathSelectors.any())
                .build().apiInfo(new ApiInfoBuilder()
                        .title("SpringBoot整合Swagger")
                        .description("SpringBoot整合Swagger,詳細信息......")
                        .version("9.0")
                        .contact(new Contact("啊啊啊啊","blog.csdn.net","[email protected]"))
                        .license("The Apache License")
                        .licenseUrl("http://www.baidu.com")
                        .build());
    }
}

這裏提供一個配置類,首先通過@EnableSwagger2註解啓用Swagger2,然後配置一個Docket Bean,這個Bean中,配置映射路徑和要掃描的接口的位置,在apiInfo中,主要配置一下Swagger2文檔網站的信息,例如網站的title,網站的描述,聯繫人的信息,使用的協議等等。

如此,Swagger2就算配置成功了,非常方便。

此時啓動項目,輸入http://localhost:8080/swagger-ui.html,能夠看到如下頁面,說明已經配置成功了:

在這裏插入圖片描述

3、創建接口

接下來就是創建接口了,Swagger2相關的註解其實並不多,而且很容易懂,下面我來分別向小夥伴們舉例說明:

@RestController
@Api(tags = "用戶管理相關接口")
@RequestMapping("/user")
public class UserController {

    @PostMapping("/")
    @ApiOperation("添加用戶的接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "username", value = "用戶名", defaultValue = "李四"),
            @ApiImplicitParam(name = "address", value = "用戶地址", defaultValue = "深圳", required = true)
    }
    )
    public RespBean addUser(String username, @RequestParam(required = true) String address) {
        return new RespBean();
    }

    @GetMapping("/")
    @ApiOperation("根據id查詢用戶的接口")
    @ApiImplicitParam(name = "id", value = "用戶id", defaultValue = "99", required = true)
    public User getUserById(@PathVariable Integer id) {
        User user = new User();
        user.setId(id);
        return user;
    }
    @PutMapping("/{id}")
    @ApiOperation("根據id更新用戶的接口")
    public User updateUserById(@RequestBody User user) {
        return user;
    }
}

4、註解說明:

這裏邊涉及到多個API,我來向小夥伴們分別說明:

@Api註解可以用來標記當前Controller的功能。
@ApiOperation註解用來標記一個方法的作用。
@ApiImplicitParam註解用來描述一個參數,可以配置參數的中文含義,也可以給參數設置默認值,這樣在接口測試的時候可以避免手動輸入。
如果有多個參數,則需要使用多個@ApiImplicitParam註解來描述,多個@ApiImplicitParam註解需要放在一個@ApiImplicitParams註解中。
需要注意的是,@ApiImplicitParam註解中雖然可以指定參數是必填的,但是卻不能代替**@RequestParam(required = true)**,前者的必填只是在Swagger2框架內必填,拋棄了Swagger2,這個限制就沒用了,所以假如開發者需要指定一個參數必填,@RequestParam(required = true)註解還是不能省略。
如果參數是一個對象(例如上文的更新接口),對於參數的描述也可以放在實體類中。例如下面一段代碼:

@ApiModel
public class User {
    @ApiModelProperty(value = "用戶id")
    private Integer id;
    @ApiModelProperty(value = "用戶名")
    private String username;
    @ApiModelProperty(value = "用戶地址")
    private String address;
    //getter/setter
}

5、實例

在這裏插入圖片描述
可以看到,所有的接口這裏都列出來了,包括接口請求方式,接口地址以及接口的名字等,點開一個接口,可以看到如下信息:
在這裏插入圖片描述
可以看到,接口的參數,參數要求,參數默認值等等統統都展示出來了,參數類型下的query表示參數以key/value的形式傳遞,點擊右上角的Try it out,就可以進行接口測試:
在這裏插入圖片描述
點擊Execute按鈕,表示發送請求進行測試。測試結果會展示在下面的Response中。
小夥伴們注意,參數類型下面的query表示參數以key/value的形式傳遞,這裏的值也可能是body,body表示參數以請求體的方式傳遞,例如上文的更新接口,如下:
在這裏插入圖片描述
當然還有一種可能就是這裏的參數爲path,表示參數放在路徑中傳遞,例如根據id查詢用戶的接口:
在這裏插入圖片描述

三、把Swagger2的API接口導入到Postman中

1、訪問http://localhost:8080/swagger-ui.html 文檔的首頁,複製下面這個地址:
在這裏插入圖片描述
2、打開postman->import–>import Form Link
在這裏插入圖片描述

四、Swagger2註解詳解

1、@Api :請求類的說明

@Api:放在請求的類上,與 @Controller 並列,說明類的作用,如用戶模塊,訂單類等。
    tags="說明該類的作用"
    value="該參數沒什麼意義,所以不需要配置"

舉例


@RestController
@RequestMapping("/user")
@Api(tags = "用戶控制器")
public class UserController {
  //todo
}

2、@ApiOperation:方法的說明

@ApiOperation"用在請求的方法上,說明方法的作用"
    value="說明方法的作用"
    notes="方法的備註說明"

舉例

@GetMapping("/list")
    @ApiOperation("用戶列表接口")
    public Result<User> list(){
        //TODO
    }

3、@ApiImplicitParams、@ApiImplicitParam:方法參數的說明

@ApiImplicitParams:用在請求的方法上,包含一組參數說明
    @ApiImplicitParam:對單個參數的說明      
        name:參數名
        value:參數的漢字說明、解釋
        required:參數是否必須傳
        paramType:參數放在哪個地方
            · header --> 請求參數的獲取:@RequestHeader
            · query --> 請求參數的獲取:@RequestParam
            · path(用於restful接口)--> 請求參數的獲取:@PathVariable
            · body(請求體)-->  @RequestBody User user
            · form(普通表單提交)     
        dataType:參數類型,默認String,其它值dataType="int"       
        defaultValue:參數的默認值

舉例

@PostMapping("/edit")
    @ApiOperation(value = "用戶修改接口",notes = "根據用戶id修改用戶名和密碼",code = 0)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id",value = "用戶id",required = true,dataType = "int"),
            @ApiImplicitParam(name = "username",value = "用戶名",required = true,dataType = "string"),
            @ApiImplicitParam(name = "password",value = "用戶密碼",required = true,dataType = "string")
    })
    public boolean updateUser(@RequestParam("id")int id,@RequestParam("username") String username,@RequestParam("password") String password){
        return false;
    }

4、單個參數舉例:

@ApiOperation("根據Id刪除")
@ApiImplicitParam(name="userId",value="用戶id",required=true,paramType="query")
@GetMapping("/delete")
public AjaxResult delete(String userId) {
    //TODO
}

5、@ApiResponses、@ApiResponse:方法返回值的說明

@ApiResponses:方法返回對象的說明
    @ApiResponse:每個參數的說明
        code:數字,例如400
        message:信息,例如"請求參數沒填好"
        response:拋出異常的類

舉例

@ApiOperation(value = "修改密碼", notes = "方法的備註說明,如果有可以寫在這裏")
@ApiResponses({
        @ApiResponse(code = 400, message = "請求參數沒填好"),
        @ApiResponse(code = 404, message = "請求路徑找不到")
})
@PostMapping("/changepass")
public AjaxResult changePassword(@AutosetParam SessionInfo sessionInfo,
        @RequestBody @Valid PasswordModel passwordModel) {
    //TODO
}

6、@ApiModel:用於JavaBean上面,表示一個JavaBean

@ApiModel:用於JavaBean的類上面,表示此 JavaBean 整體的信息
    (這種一般用在post創建的時候,使用 @RequestBody 這樣的場景,請求參數無法使用 @ApiImplicitParam 註解進行描述的時候 )

7、@ApiModelProperty:用在JavaBean的屬性上面,說明屬性的含義


@ApiModel("修改密碼所需參數封裝類")
public class PasswordModel
{
    @ApiModelProperty("賬戶Id")
    private String accountId;
//TODO
}

五、總結

配置好Swagger2並適當添加註解後,啓動SpringBoot應用,訪問http://localhost:8080/swagger-ui.html 即可瀏覽API文檔。另外,我們需要爲了API文檔的可讀性,適當的使用以上幾種註解就可以。

源碼已上傳,地址:https://gitee.com/quiet_spring/SpringBoot-Swagger2.git
以上內容已發佈至“服務端技術精選”公衆號,搜索關注,共同交流
在這裏插入圖片描述

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