目前,大多數系統都採用先後端分離。在享受先後端分離的好處的同時,接口聯調每每成爲團隊效率的瓶頸,甚至產生先後端的矛盾。簡單歸結來講,有幾方面的緣由:html
對於問題一和問題二,更可能是開發流程上的問題,因此不在本文的範圍內。固然話癆的艿艿,仍是要給點粗淺的建議,徹底攔不住我啊。前端
對於問題三,就進入了本文的主角 Swagger 。經過在 API 接口上,添加相應的 Swagger 提供的註解,自動生成 API 文檔。醬紫,API 接口和文檔就在一塊兒了,今後過上了幸福快樂的生活。java
FROM 《RESTful 風格的 Web 服務框架 Swagger》Swagger 是一個規範和完整的框架,用於生成、描述、調用和可視化 RESTful 風格的 Web 服務。web
整體目標是使客戶端和文件系統做爲服務器以一樣的速度來更新。文件的方法、參數和模型緊密集成到服務器端的代碼,容許 API 來始終保持同步。Swagger 讓部署管理和使用功能強大的 API 從未如此簡單。spring
預覽圖apache
示例代碼對應倉庫:lab-24-apidoc-swagger 。
在本小節,咱們來快速入門 Swagger ,能夠更加直觀的感覺到其提供的便利性。後端
在 pom.xml 文件中,引入相關依賴。api
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>lab-24-apidoc-swagger</artifactId> <dependencies> <!-- 實現對 Spring MVC 的自動化配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入 Swagger 依賴 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!-- 引入 Swagger UI 依賴,以實現 API 接口的 UI 界面 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> </dependencies></project>
具體每一個依賴的做用,胖友本身認真看下艿艿添加的全部註釋噢。數組
由於 Spring Boot 暫未提供 Swagger 內置的支持,因此咱們須要本身定義配置類。瀏覽器
在 cn.iocoder.springboot.lab24.apidoc.config 包路徑下,建立 SwaggerConfiguration 配置類,用於配置 Swagger 。代碼以下:
// SwaggerConfiguration.java@Configuration@EnableSwagger2 // 標記項目啓用 Swagger API 接口文檔public class SwaggerConfiguration { @Bean public Docket createRestApi() { // 建立 Docket 對象 return new Docket(DocumentationType.SWAGGER_2) // 文檔類型,使用 Swagger2 .apiInfo(this.apiInfo()) // 設置 API 信息 // 掃描 Controller 包路徑,得到 API 接口 .select() .apis(RequestHandlerSelectors.basePackage("cn.iocoder.springboot.lab24.apidoc.controller")) .paths(PathSelectors.any()) // 構建出 Docket 對象 .build(); } /** * 建立 API 信息 */ private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("測試接口文檔示例") .description("我是一段描述") .version("1.0.0") // 版本號 .contact(new Contact("芋艿", "http://www.iocoder.cn", "zhijiantianya@gmail.com")) // 聯繫人 .build(); }}
建立 Application.java 類,配置 @SpringBootApplication 註解便可。代碼以下:
// Application.java@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
先暫時不啓動項目。等咱們添加好 Controller 。
在 cn.iocoder.springboot.lab24.apidoc.controller 包路徑下,建立 UserController 類,提供用戶 API 接口。代碼以下:
// UserController.java@RestController@RequestMapping("/users")@Api(tags = "用戶 API 接口")public class UserController { @GetMapping("/list") @ApiOperation(value = "查詢用戶列表", notes = "目前僅僅是做爲測試,因此返回用戶全列表") public List<UserVO> list() { // 查詢列表 List<UserVO> result = new ArrayList<>(); result.add(new UserVO().setId(1).setUsername("yudaoyuanma")); result.add(new UserVO().setId(2).setUsername("woshiyutou")); result.add(new UserVO().setId(3).setUsername("chifanshuijiao")); // 返回列表 return result; } @GetMapping("/get") @ApiOperation("得到指定用戶編號的用戶") @ApiImplicitParam(name = "id", value = "用戶編號", paramType = "query", dataTypeClass = Integer.class, required = true, example = "1024") public UserVO get(@RequestParam("id") Integer id) { // 查詢並返回用戶 return new UserVO().setId(id).setUsername(UUID.randomUUID().toString()); } @PostMapping("add") @ApiOperation("添加用戶") public Integer add(UserAddDTO addDTO) { // 插入用戶記錄,返回編號 Integer returnId = UUID.randomUUID().hashCode(); // 返回用戶編號 return returnId; } @PostMapping("/update") @ApiOperation("更新指定用戶編號的用戶") public Boolean update(UserUpdateDTO updateDTO) { // 更新用戶記錄 Boolean success = true; // 返回更新是否成功 return success; } @PostMapping("/delete") @ApiOperation(value = "刪除指定用戶編號的用戶") @ApiImplicitParam(name = "id", value = "用戶編號", paramType = "query", dataTypeClass = Integer.class, required = true, example = "1024") public Boolean delete(@RequestParam("id") Integer id) { // 刪除用戶記錄 Boolean success = false; // 返回是否更新成功 return success; }}
執行 Application 啓動項目。而後瀏覽器訪問 http://127.0.0.1:8080/swagger-ui.html地址,就能夠看到 Swagger 生成的 API 接口文檔。以下圖所示:
至此,咱們已經完成了 Swagger 的快速入門。不過考慮到胖友可以更好的使用,咱們來一個一個註解瞭解。
在 swagger-annotations 庫中,在 io.swagger.annotations 包路徑下,提供了咱們會使用到的全部 Swagger 註解。Swagger 提供的註解仍是比較多的,大多數場景下,只須要使用到咱們在 「2.4 UserController」 中用到的註解。
@Api 註解,添加在 Controller 類上,標記它做爲 Swagger 文檔資源。
示例以下:
// UserController.java@RestController@RequestMapping("/users")@Api(tags = "用戶 API 接口")public class UserController { // ... 省略}
效果以下:
@Api 註解的經常使用屬性,以下:
@Api 註解的不經常使用屬性,以下:
@Api 註解的廢棄屬性,不建議使用,有value、description、basePath、position 。
@ApiOperation 註解,添加在 Controller 方法上,標記它是一個 API 操做。
示例以下:
// UserController.java@GetMapping("/list")@ApiOperation(value = "查詢用戶列表", notes = "目前僅僅是做爲測試,因此返回用戶全列表")public List<UserVO> list() { // 查詢列表 List<UserVO> result = new ArrayList<>(); result.add(new UserVO().setId(1).setUsername("yudaoyuanma")); result.add(new UserVO().setId(2).setUsername("woshiyutou")); result.add(new UserVO().setId(3).setUsername("chifanshuijiao")); // 返回列表 return result;}
效果以下:
@ApiOperation 註解的經常使用屬性,以下:
@ApiOperation 註解的不經常使用屬性,以下:
@ApiOperation 註解的廢棄屬性,不建議使用,有 position 。