偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SpringBoot集成Swagger3,還想來(lái)份離線文檔?真酷炫

開(kāi)發(fā) 架構(gòu)
隨著項(xiàng)目架構(gòu)的演化,前后端分離是不可阻擋的趨勢(shì)。這種模式的協(xié)作在實(shí)踐的過(guò)程中經(jīng)常會(huì)遇到的一個(gè)問(wèn)題就是文檔。

 [[397948]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序新視界」,作者二師兄。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序新視界公眾號(hào)。

前言

隨著項(xiàng)目架構(gòu)的演化,前后端分離是不可阻擋的趨勢(shì)。這種模式的協(xié)作在實(shí)踐的過(guò)程中經(jīng)常會(huì)遇到的一個(gè)問(wèn)題就是文檔。

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

但編寫(xiě)接口文檔對(duì)開(kāi)發(fā)人員來(lái)說(shuō)是一大難題,而且接口還在不斷的變化,還要花費(fèi)精力去維護(hù)接口文檔的更新。

既然存在痛點(diǎn),那么必須會(huì)出現(xiàn)解決此痛點(diǎn)的產(chǎn)品,這就是Swagger,目前已經(jīng)更新到Swagger3版本了。如果你還停留在Swagger2,建議升級(jí)到Swagger3,整體UI風(fēng)格及交互友好了不少。

本篇將圍繞Swagger3與SpringBoot的集成和離線文檔的生成來(lái)進(jìn)行講解。

Swagger簡(jiǎn)介

Swagger是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化RESTful風(fēng)格的Web服務(wù)??傮w目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來(lái)更新。文件的方法,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來(lái)始終保持同步。

官網(wǎng):https://swagger.io

Swagger解決的痛點(diǎn)

傳統(tǒng)方式提供文檔有以下痛點(diǎn):

  • 接口眾多,實(shí)現(xiàn)細(xì)節(jié)復(fù)雜,編寫(xiě)文檔耗費(fèi)費(fèi)力,需要持續(xù)維護(hù);
  • 接口文檔需要隨時(shí)進(jìn)行同步;
  • 接口返回的結(jié)果不明確,得構(gòu)造返回結(jié)構(gòu)體等;
  • 不能直接在線測(cè)試接口,通常需要額外的工具,比如PostMan等。

當(dāng)引入Swagger之后,以上痛點(diǎn)迎刃而解,同時(shí)還帶來(lái)以下優(yōu)點(diǎn):

  • 及時(shí)性 (接口變更后,前后端人員可實(shí)時(shí)看到最新版本)
  • 規(guī)范性 (接口具體統(tǒng)一風(fēng)格,如接口地址,請(qǐng)求方式,參數(shù),響應(yīng)格式和錯(cuò)誤信息等)
  • 一致性 (接口信息一致,不會(huì)因接口文檔版本問(wèn)題出現(xiàn)分歧)
  • 可測(cè)性 (可直接基于接口文檔進(jìn)行測(cè)試)

Swagger3的改變

Swagger3.0的改動(dòng),官方文檔總結(jié)如下幾點(diǎn):

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

下面就來(lái)實(shí)戰(zhàn)使用一下吧。

SpringBoot集成Swagger3

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

引入依賴

在SpringBoot項(xiàng)目的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只能在開(kāi)發(fā)環(huán)境或測(cè)試環(huán)境下開(kāi)啟,生產(chǎn)環(huán)境下需要進(jìn)行關(guān)閉的。而swagger的開(kāi)啟與關(guān)閉可在application.properties中進(jìn)行配置:

  1. # 生產(chǎn)環(huán)境需設(shè)置為false 
  2. springfox.documentation.swagger-ui.enabled=true 

配置類

通過(guò)@EnableOpenApi注解啟動(dòng)用Swagger的使用,同時(shí)在配置類中對(duì)Swagger的通用參數(shù)進(jìn)行配置。

  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.      * 生成接口信息,包括標(biāo)題、聯(lián)系人等 
  21.      */ 
  22.     private ApiInfo apiInfo() { 
  23.         return new ApiInfoBuilder() 
  24.                 .title("Swagger3接口文檔"
  25.                 .description("如有疑問(wèn),可聯(lián)系二師兄,微信:zhuan2quan"
  26.                 .contact(new Contact("二師兄""https://www.choupangxia.com/""secbro2@gmail.com")) 
  27.                 .version("1.0"
  28.                 .build(); 
  29.     } 
  30.  
  31.     /** 
  32.      * 封裝全局通用參數(shù) 
  33.      */ 
  34.     private List<RequestParameter> getGlobalRequestParameters() { 
  35.         List<RequestParameter> parameters = new ArrayList<>(); 
  36.         parameters.add(new RequestParameterBuilder() 
  37.                 .name("uuid"
  38.                 .description("設(shè)備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.      * 封裝通用響應(yīng)信息 
  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.     } 

通過(guò)以上配置已經(jīng)完成了Spring Boot與Swagger的集成,下面展示一下如何在業(yè)務(wù)邏輯中進(jìn)行使用。

業(yè)務(wù)中使用

創(chuàng)建兩個(gè)實(shí)體類Goods(商品類)和CommonResult(通用返回結(jié)果類)。

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.      * 商品價(jià)格 
  18.      */ 
  19.     @ApiModelProperty("商品價(jià)格"
  20.     private BigDecimal price; 
  21.  
  22.     // 省略getter/setter 

CommonResult類:

  1. @ApiModel("API通用數(shù)據(jù)"
  2. public class CommonResult<T> { 
  3.  
  4.     /** 
  5.      * 標(biāo)識(shí)代碼,0表示成功,非0表示出錯(cuò) 
  6.      */ 
  7.     @ApiModelProperty("標(biāo)識(shí)代碼,0表示成功,非0表示出錯(cuò)"
  8.     private Integer code; 
  9.  
  10.     /** 
  11.      * 描述信息,通常錯(cuò)時(shí)使用 
  12.      */ 
  13.     @ApiModelProperty("錯(cuò)誤描述"
  14.     private String msg; 
  15.  
  16.     /** 
  17.      * 業(yè)務(wù)數(shù)據(jù) 
  18.      */ 
  19.     @ApiModelProperty("業(yè)務(wù)數(shù)據(jù)"
  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.      * 錯(cuò)誤 
  41.      */ 
  42.     public static <T> CommonResult<T> error(int code, String msg) { 
  43.         return new CommonResult<>(code, msg, null); 
  44.     } 
  45.  
  46.     // 省略getter/setter 

下面針對(duì)Controller層的接口來(lái)使用Swagger對(duì)應(yīng)的API。

GoodsController類:

  1. @Api(tags = "商品信息管理接口"
  2. @RestController 
  3. @RequestMapping("/goods"
  4. public class GoodsController { 
  5.  
  6.     @Operation(summary = "單個(gè)商品詳情"
  7.     @GetMapping("/findGoodsById"
  8.     public CommonResult<Goods> findGoodsById( 
  9.             @Parameter(description = "商品ID,正整數(shù)"
  10.             @RequestParam(value = "goodsId", required = false, defaultValue = "0"Integer goodsId) { 
  11.         System.out.println("根據(jù)商品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.     } 

展示效果

完成集成,啟動(dòng)SpringBoot項(xiàng)目,在訪問(wèn)地址:

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

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

具體的商品信息管理接口,可以看到請(qǐng)求參數(shù)、返回結(jié)果數(shù)據(jù)結(jié)構(gòu)等信息,點(diǎn)擊“Try it out”,可輸入?yún)?shù)請(qǐng)求參數(shù),進(jìn)行接口的調(diào)用:

調(diào)用之后會(huì)返回對(duì)應(yīng)的處理結(jié)果:

在最下面的Schemas中還可以看到對(duì)應(yīng)返回結(jié)果數(shù)據(jù)和被Swagger注解的實(shí)體類信息。

Swagger3注解使用說(shuō)明

經(jīng)過(guò)上述實(shí)例之后,我們知道大多數(shù)API是如何使用的了,這了再匯總一下相關(guān)API的功能:

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

集成knife4j導(dǎo)出離線文檔

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

這里我們集成增強(qiáng)文檔knife4j來(lái)實(shí)現(xiàn)離線文檔的導(dǎo)出。

添加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> 

 

啟動(dòng)knife4j

在上面配置Swagger的Swagger3Config中添加@EnableKnife4j注解,該注解可以開(kāi)啟knife4j的增強(qiáng)功能。

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

此時(shí),如果依舊訪問(wèn)http://localhost:8080/swagger-ui/index.html會(huì)發(fā)現(xiàn)顯示并沒(méi)有變化。這里我們需要訪問(wèn)http://localhost:8088/doc.html。

整個(gè)項(xiàng)目源碼地址:https://github.com/secbr/springboot-all/tree/master/springboot-swagger3。

展示效果

此時(shí)啟動(dòng)項(xiàng)目,訪問(wèn)doc.html之后,你會(huì)發(fā)現(xiàn)現(xiàn)在文檔風(fēng)格變得非常酷炫。展示幾個(gè)效果圖來(lái)看看:

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

其中個(gè)人感覺(jué)HTML格式的文檔更具有沒(méi)敢,也更方便查看,來(lái)一張圖看看效果。

小結(jié)

文檔是項(xiàng)目中必須的,但隨著開(kāi)源框架的發(fā)展,對(duì)技術(shù)人員來(lái)說(shuō)文檔的痛點(diǎn)也在逐步解決。如果你還處于手寫(xiě)文檔的階段,真的可以嘗試一下這類更友好的文檔展現(xiàn)形式。

 

責(zé)任編輯:武曉燕 來(lái)源: 程序新視界
相關(guān)推薦

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 應(yīng)用動(dòng)態(tài)Swagger文檔

2011-08-11 13:46:04

Xcode離線安裝

2024-09-10 08:15:33

Asp項(xiàng)目API

2023-03-08 08:48:50

Swag工具

2023-03-06 08:53:13

2017-07-20 17:05:04

JavaScriptswagger-decSwagger

2024-09-18 09:30:41

SpringBootGroovy動(dòng)態(tài)編程

2023-08-09 08:37:44

2023-09-21 10:44:41

Web服務(wù)Swagger前端

2011-07-26 17:39:53

Xcode iPhone 文檔

2009-07-03 11:27:11

JSP編程思想

2020-12-07 06:05:34

apidocyapiknife4j

2021-06-09 08:30:52

CSS33D旋轉(zhuǎn)視圖3D動(dòng)畫(huà)

2020-03-06 11:00:00

戴爾

2021-05-26 06:22:34

SpringBootJPA后端開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)