一、爲什麼使用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
以上內容已發佈至“服務端技術精選”公衆號,搜索關注,共同交流