成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot集成Swagger3,還想來份離線文檔?真酷炫

開發 架構
隨著項目架構的演化,前后端分離是不可阻擋的趨勢。這種模式的協作在實踐的過程中經常會遇到的一個問題就是文檔。

 [[397948]]

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯系程序新視界公眾號。

前言

隨著項目架構的演化,前后端分離是不可阻擋的趨勢。這種模式的協作在實踐的過程中經常會遇到的一個問題就是文檔。

在《一位CTO告訴我,項目中至少需要這3類文檔》一文我們已經描述了文檔的重要性,而接口文檔便是其中之一,可以說是必不可少的。

但編寫接口文檔對開發人員來說是一大難題,而且接口還在不斷的變化,還要花費精力去維護接口文檔的更新。

既然存在痛點,那么必須會出現解決此痛點的產品,這就是Swagger,目前已經更新到Swagger3版本了。如果你還停留在Swagger2,建議升級到Swagger3,整體UI風格及交互友好了不少。

本篇將圍繞Swagger3與SpringBoot的集成和離線文檔的生成來進行講解。

Swagger簡介

Swagger是一個規范和完整的框架,用于生成、描述、調用和可視化RESTful風格的Web服務。總體目標是使客戶端和文件系統作為服務器以同樣的速度來更新。文件的方法,參數和模型緊密集成到服務器端的代碼,允許API來始終保持同步。

官網:https://swagger.io

Swagger解決的痛點

傳統方式提供文檔有以下痛點:

  • 接口眾多,實現細節復雜,編寫文檔耗費費力,需要持續維護;
  • 接口文檔需要隨時進行同步;
  • 接口返回的結果不明確,得構造返回結構體等;
  • 不能直接在線測試接口,通常需要額外的工具,比如PostMan等。

當引入Swagger之后,以上痛點迎刃而解,同時還帶來以下優點:

  • 及時性 (接口變更后,前后端人員可實時看到最新版本)
  • 規范性 (接口具體統一風格,如接口地址,請求方式,參數,響應格式和錯誤信息等)
  • 一致性 (接口信息一致,不會因接口文檔版本問題出現分歧)
  • 可測性 (可直接基于接口文檔進行測試)

Swagger3的改變

Swagger3.0的改動,官方文檔總結如下幾點:

  • 刪除了對springfox-swagger2的依賴;
  • 刪除所有@EnableSwagger2...注解;
  • 添加了springfox-boot-starter依賴項;
  • 移除了guava等第三方依賴;
  • 文檔訪問地址改為http://ip:port/project/swagger-ui/index.html。

下面就來實戰使用一下吧。

SpringBoot集成Swagger3

SpringBoot集成Swagger3與SpringBoot集成其他框架的套路基本一致,通常包括:引入依賴、指定配置文件、創建配置類和使用。

引入依賴

在SpringBoot項目的pom.xml中引入Swagger3依賴:

  1. <dependency> 
  2.     <groupId>io.springfox</groupId> 
  3.     <artifactId>springfox-boot-starter</artifactId> 
  4.     <version>3.0.0</version> 
  5. </dependency> 

 

指定配置文件

通常情況下swagger只能在開發環境或測試環境下開啟,生產環境下需要進行關閉的。而swagger的開啟與關閉可在application.properties中進行配置:

  1. # 生產環境需設置為false 
  2. springfox.documentation.swagger-ui.enabled=true 

配置類

通過@EnableOpenApi注解啟動用Swagger的使用,同時在配置類中對Swagger的通用參數進行配置。

  1. @Configuration 
  2. @EnableOpenApi 
  3. public class Swagger3Config { 
  4.  
  5.     @Bean 
  6.     public Docket createRestApi() { 
  7.         //返回文檔摘要信息 
  8.         return new Docket(DocumentationType.OAS_30) 
  9.                 .apiInfo(apiInfo()) 
  10.                 .select() 
  11.                 .apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class)) 
  12.                 .paths(PathSelectors.any()) 
  13.                 .build() 
  14.                 .globalRequestParameters(getGlobalRequestParameters()) 
  15.                 .globalResponses(HttpMethod.GET, getGlobalResponseMessage()) 
  16.                 .globalResponses(HttpMethod.POST, getGlobalResponseMessage()); 
  17.     } 
  18.  
  19.     /** 
  20.      * 生成接口信息,包括標題、聯系人等 
  21.      */ 
  22.     private ApiInfo apiInfo() { 
  23.         return new ApiInfoBuilder() 
  24.                 .title("Swagger3接口文檔"
  25.                 .description("如有疑問,可聯系二師兄,微信:zhuan2quan"
  26.                 .contact(new Contact("二師兄""https://www.choupangxia.com/""secbro2@gmail.com")) 
  27.                 .version("1.0"
  28.                 .build(); 
  29.     } 
  30.  
  31.     /** 
  32.      * 封裝全局通用參數 
  33.      */ 
  34.     private List<RequestParameter> getGlobalRequestParameters() { 
  35.         List<RequestParameter> parameters = new ArrayList<>(); 
  36.         parameters.add(new RequestParameterBuilder() 
  37.                 .name("uuid"
  38.                 .description("設備uuid"
  39.                 .required(true
  40.                 .in(ParameterType.QUERY) 
  41.                 .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) 
  42.                 .required(false
  43.                 .build()); 
  44.         return parameters; 
  45.     } 
  46.  
  47.     /** 
  48.      * 封裝通用響應信息 
  49.      */ 
  50.     private List<Response> getGlobalResponseMessage() { 
  51.         List<Response> responseList = new ArrayList<>(); 
  52.         responseList.add(new ResponseBuilder().code("404").description("未找到資源").build()); 
  53.         return responseList; 
  54.     } 

通過以上配置已經完成了Spring Boot與Swagger的集成,下面展示一下如何在業務邏輯中進行使用。

業務中使用

創建兩個實體類Goods(商品類)和CommonResult(通用返回結果類)。

Goods類:

  1. @ApiModel("商品模型"
  2. public class Goods { 
  3.  
  4.     /** 
  5.      * 商品id 
  6.      */ 
  7.     @ApiModelProperty("商品ID"
  8.     Long goodsId; 
  9.  
  10.     /** 
  11.      * 商品名稱 
  12.      */ 
  13.     @ApiModelProperty("商品名稱"
  14.     private String goodsName; 
  15.  
  16.     /** 
  17.      * 商品價格 
  18.      */ 
  19.     @ApiModelProperty("商品價格"
  20.     private BigDecimal price; 
  21.  
  22.     // 省略getter/setter 

CommonResult類:

  1. @ApiModel("API通用數據"
  2. public class CommonResult<T> { 
  3.  
  4.     /** 
  5.      * 標識代碼,0表示成功,非0表示出錯 
  6.      */ 
  7.     @ApiModelProperty("標識代碼,0表示成功,非0表示出錯"
  8.     private Integer code; 
  9.  
  10.     /** 
  11.      * 描述信息,通常錯時使用 
  12.      */ 
  13.     @ApiModelProperty("錯誤描述"
  14.     private String msg; 
  15.  
  16.     /** 
  17.      * 業務數據 
  18.      */ 
  19.     @ApiModelProperty("業務數據"
  20.     private T data; 
  21.  
  22.     public CommonResult(Integer status, String msg, T data) { 
  23.         this.code = status; 
  24.         this.msg = msg; 
  25.         this.data = data; 
  26.     } 
  27.  
  28.     /** 
  29.      * 成功 
  30.      */ 
  31.     public static <T> CommonResult<T> success(T data) { 
  32.         return new CommonResult<>(0, "成功", data); 
  33.     } 
  34.  
  35.     public static <T> CommonResult<T> success(Integer code, String msg) { 
  36.         return new CommonResult<>(code, msg, null); 
  37.     } 
  38.  
  39.     /** 
  40.      * 錯誤 
  41.      */ 
  42.     public static <T> CommonResult<T> error(int code, String msg) { 
  43.         return new CommonResult<>(code, msg, null); 
  44.     } 
  45.  
  46.     // 省略getter/setter 

下面針對Controller層的接口來使用Swagger對應的API。

GoodsController類:

  1. @Api(tags = "商品信息管理接口"
  2. @RestController 
  3. @RequestMapping("/goods"
  4. public class GoodsController { 
  5.  
  6.     @Operation(summary = "單個商品詳情"
  7.     @GetMapping("/findGoodsById"
  8.     public CommonResult<Goods> findGoodsById( 
  9.             @Parameter(description = "商品ID,正整數"
  10.             @RequestParam(value = "goodsId", required = false, defaultValue = "0"Integer goodsId) { 
  11.         System.out.println("根據商品ID=" + goodsId + "查詢商品詳情"); 
  12.         Goods goods = new Goods(); 
  13.         goods.setGoodsId(1L); 
  14.         goods.setGoodsName("筆記本"); 
  15.         goods.setPrice(new BigDecimal(8888)); 
  16.         return CommonResult.success(goods); 
  17.     } 

OrderController類:

  1. @Api(tags = "訂單管理接口"
  2. @RestController 
  3. @RequestMapping("/order"
  4. public class OrderController { 
  5.  
  6.     @Operation(summary = "提交訂單"
  7.     @PostMapping("/order"
  8.     @ApiImplicitParams({ 
  9.             @ApiImplicitParam(name = "userId", value = "用戶id", dataTypeClass = Long.class, paramType = "query", example = "123"), 
  10.             @ApiImplicitParam(name = "goodsId", value = "商品id", dataTypeClass = Integer.class, paramType = "query", example = "1"
  11.     }) 
  12.     public CommonResult<String> toBuy(@ApiIgnore @RequestParam Map<String, String> params) { 
  13.         System.out.println(params); 
  14.         return CommonResult.success("success"); 
  15.     } 

展示效果

完成集成,啟動SpringBoot項目,在訪問地址:

http://127.0.0.1:8080/swagger-ui/index.html

從整體上可以看到如下效果:

具體的商品信息管理接口,可以看到請求參數、返回結果數據結構等信息,點擊“Try it out”,可輸入參數請求參數,進行接口的調用:

調用之后會返回對應的處理結果:

在最下面的Schemas中還可以看到對應返回結果數據和被Swagger注解的實體類信息。

Swagger3注解使用說明

經過上述實例之后,我們知道大多數API是如何使用的了,這了再匯總一下相關API的功能:

  1. @Api:用在請求的類上,表示對類的說明 
  2.     tags="說明該類的作用,可以在UI界面上看到的注解" 
  3.     value="該參數沒什么意義,在UI界面上也看到,所以不需要配置" 
  4.  
  5. @ApiOperation:用在請求的方法上,說明方法的用途、作用 
  6.     value="說明方法的用途、作用" 
  7.     notes="方法的備注說明" 
  8.  
  9. @ApiImplicitParams:用在請求的方法上,表示一組參數說明 
  10.     @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一個請求參數的各個方面 
  11.         name:參數名 
  12.         value:參數的漢字說明、解釋 
  13.         required:參數是否必須傳 
  14.         paramType:參數放在哪個地方 
  15.             · header --> 請求參數的獲取:@RequestHeader 
  16.             · query --> 請求參數的獲取:@RequestParam 
  17.             · path(用于restful接口)--> 請求參數的獲取:@PathVariable 
  18.             · body(不常用) 
  19.             · form(不常用)     
  20.         dataType:參數類型,默認String,其它值dataType="Integer"        
  21.         defaultValue:參數的默認值 
  22.  
  23. @ApiResponses:用在請求的方法上,表示一組響應 
  24.     @ApiResponse:用在@ApiResponses中,一般用于表達一個錯誤的響應信息 
  25.         code:數字,例如400 
  26.         message:信息,例如"請求參數沒填好" 
  27.         response:拋出異常的類 
  28.  
  29. @ApiModel:用于響應類上,表示一個返回響應數據的信息 
  30.             (這種一般用在post創建的時候,使用@RequestBody這樣的場景, 
  31.             請求參數無法使用@ApiImplicitParam注解進行描述的時候) 
  32.     @ApiModelProperty:用在屬性上,描述響應類的屬性 

集成knife4j導出離線文檔

Swagger為我們提供了方便的在線文檔支持,但某些場景下我們需要把接口文檔提供給合作人員,而不是直接給一個地址。此時,我們就需要將接口文檔導出為離線文檔。

這里我們集成增強文檔knife4j來實現離線文檔的導出。

添加knife4j依賴

在pom.xml中增加knife4j的依賴:

  1. <dependency> 
  2.     <groupId>com.github.xiaoymin</groupId> 
  3.     <artifactId>knife4j-spring-boot-starter</artifactId> 
  4.     <version>3.0.2</version> 
  5. </dependency> 

 

啟動knife4j

在上面配置Swagger的Swagger3Config中添加@EnableKnife4j注解,該注解可以開啟knife4j的增強功能。

  1. @EnableKnife4j 
  2. @Configuration 
  3. @EnableOpenApi 
  4. public class Swagger3Config { 
  5.     // ... 

此時,如果依舊訪問http://localhost:8080/swagger-ui/index.html會發現顯示并沒有變化。這里我們需要訪問http://localhost:8088/doc.html。

整個項目源碼地址:https://github.com/secbr/springboot-all/tree/master/springboot-swagger3。

展示效果

此時啟動項目,訪問doc.html之后,你會發現現在文檔風格變得非常酷炫。展示幾個效果圖來看看:

其中在“離線文檔”一欄中可以看到四種形式的離線文檔下載:Markdown、HTML、Word、OpenAPI。

其中個人感覺HTML格式的文檔更具有沒敢,也更方便查看,來一張圖看看效果。

小結

文檔是項目中必須的,但隨著開源框架的發展,對技術人員來說文檔的痛點也在逐步解決。如果你還處于手寫文檔的階段,真的可以嘗試一下這類更友好的文檔展現形式。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2022-07-21 11:04:53

Swagger3Spring

2024-11-05 09:25:45

2022-02-16 08:21:11

JavaSwagger工具

2021-04-13 07:29:13

Swagger3接口Postman

2021-01-18 06:19:31

SpringbooSwagger2配置

2017-06-20 15:39:58

Koa2 應用動態Swagger文檔

2011-08-11 13:46:04

Xcode離線安裝

2024-09-10 08:15:33

Asp項目API

2023-03-08 08:48:50

Swag工具

2017-07-20 17:05:04

JavaScriptswagger-decSwagger

2023-03-06 08:53:13

2024-09-18 09:30:41

SpringBootGroovy動態編程

2023-08-09 08:37:44

2023-09-21 10:44:41

Web服務Swagger前端

2009-07-03 11:27:11

JSP編程思想

2011-07-26 17:39:53

Xcode iPhone 文檔

2020-12-07 06:05:34

apidocyapiknife4j

2020-03-06 11:00:00

戴爾

2021-06-09 08:30:52

CSS33D旋轉視圖3D動畫

2021-07-11 07:05:28

RedisSpringBoot用法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美a级成人淫片免费看 | 免费福利视频一区二区三区 | 九九九视频 | 成人黄在线观看 | 日本久久精品 | 国产乱码精品一区二区三区五月婷 | 日韩三级 | 99久久国产综合精品麻豆 | av黄色在线 | 亚洲欧美综合精品另类天天更新 | 怡红院免费的全部视频 | 国产精品美女视频 | 天天综合国产 | k8久久久一区二区三区 | 色综合天天天天做夜夜夜夜做 | 精品美女在线观看视频在线观看 | 91国在线 | 久久国产精品偷 | 久久国产欧美日韩精品 | 日韩欧美手机在线 | 成人视屏在线观看 | 久久精品国产精品青草 | 欧美激情第一区 | 日本一区二区在线视频 | 四虎永久在线精品免费一区二 | 青青草一区二区三区 | 国产美女网站 | 免费成人高清在线视频 | 成人免费黄色 | 国产视频二区 | 日韩国产在线 | 久久一区二区视频 | 久久久精品 | 成人h片在线观看 | 亚洲嫩草| 日韩视频一区二区在线 | 欧美不卡一区二区三区 | 日本在线精品视频 | 欧美日韩在线一区二区 | 成人av在线播放 | 久久精品播放 |