一、什麼是swagger
Swagger 是一個規範和完整的框架,用於生成、描述、呼叫和視覺化RESTful風格的 Web 服務。總體目標是使客戶端和檔案系統作為伺服器以同樣的速度來更新。檔案的方法,引數和模型緊密整合到伺服器端的程式碼,允許API來始終保持同步。Swagger讓部署管理和使用功能強大的API變得非常簡單。
簡單來說,就是後端給前端提供的一個可以檢視各種介面的方法、型別等。
二、配置swagger
1、pom.xml
1 <!-- swagger2模組 --> 2 <dependency> 3 <groupId>io.springfox</groupId> 4 <artifactId>springfox-swagger-ui</artifactId> 5 <version>2.9.2</version> 6 </dependency> 7 <dependency> 8 <groupId>io.springfox</groupId> 9 <artifactId>springfox-swagger2</artifactId> 10 <version>2.9.2</version> 11 </dependency>
2、Swagger2Config類
在src/main/java/com/example/demo/config目錄下新建Swagger2Config類
1 /** 2 * Swagger2Configuration配置類 3 */ 4 @Configuration 5 @EnableSwagger2 6 public class Swagger2Config { 7 }
3、Docket方法
原始碼
1 this.apiInfo = ApiInfo.DEFAULT; //用於定義api文件彙總資訊 2 this.groupName = "default"; 3 this.enabled = true; 4 this.genericsNamingStrategy = new DefaultGenericTypeNamingStrategy(); 5 this.applyDefaultResponseMessages = true; 6 this.host = ""; 7 this.pathMapping = Optional.absent(); 8 this.apiSelector = ApiSelector.DEFAULT; 9 this.enableUrlTemplating = false; 10 this.vendorExtensions = Lists.newArrayList(); 11 this.documentationType = documentationType;
呼叫
1 @Bean 2 public Docket createApi(){ 3 return new Docket(DocumentationType.SWAGGER_2) 4 .apiInfo(apiInfo()) 5 //配置分組 6 .groupName("user") 7 //配置是否啟動 8 .enable(ture) 9 .select() 10 /** 11 RequestHandlerSelectors:配置要掃描介面的方式 12 basePackage:指定要掃描的包 13 any():掃描全部 14 none():不掃描 15 withClassAnnotation:掃描類上的註解 16 withMethodAnnotation:掃描方法上的註解 17 **/ 18 .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")) 19 //path():過濾的路徑 20 //.path(PathSelectors.ant("/xxx/*")) 21 .build(); 22 }
4、ApiInfo方法
原始碼
1 public static final Contact DEFAULT_CONTACT = new Contact("", "", ""); 2 public static final ApiInfo DEFAULT; 3 private final String version; //文件版本號 4 private final String title; //文件頁標題 5 private final String description; //詳細資訊 6 private final String termsOfServiceUrl; //網站地址 7 private final String license; 8 private final String licenseUrl; 9 private final Contact contact; //聯絡人資訊 10 private final List<VendorExtension> vendorExtensions;
呼叫
1 private ApiInfo apiInfo(){ 2 return new ApiInfoBuilder() 3 .title("Swagger2") 4 .description("RestFul API介面") 5 .version("1.0") 6 .build(); 7 }
5、頁面效果
http://localhost:8080/swagger-ui.html
groupName可以進行分組以區分後端開發者,如果有多個後端開發者,可以在Swagger2Config類裡寫多個Docket物件然後通過@Bean注入,不同的Docket物件代表不同的分組
1 @Bean 2 public Docket createApi1(){ 3 return new Docket(DocumentationType.SWAGGER_2) 4 .apiInfo(apiInfo()) 5 //配置分組 6 .groupName("user1") //user1分組 7 //配置是否啟動 8 .enable(ture) 9 .select() 10 .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")) 11 .build(); 12 } 13 14 @Bean 15 public Docket createApi2(){ 16 return new Docket(DocumentationType.SWAGGER_2) 17 .apiInfo(apiInfo()) 18 //配置分組 19 .groupName("user2") //user2分組 20 //配置是否啟動 21 .enable(ture) 22 .select() 23 .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")) 24 .build(); 25 }
三、Swagger常用註解
使用場景:在實體類上使用,標記類時swagger的解析類
概述:提供有關swagger模型的其它資訊,類將在操作中用作型別時自動內省
1 String value() default ""; 2 3 String description() default ""; 4 5 Class<?> parent() default Void.class; 6 7 String discriminator() default ""; 8 9 Class<?>[] subTypes() default {}; 10 11 String reference() default "";
資料型別 | 預設值 | 說明 | |
---|---|---|---|
value | String | 類名 | 為模型提供備用名稱 |
description | String | "" | 提供詳細的類描述 |
parent | Class<?> parent() | Void.class | 為模型提供父類以執行描述繼承關係 |
discriminator | String | "" | 支援模型繼承和多型,使用鑑別器的欄位名稱,可以斷言需要使用哪個子型別 |
subTypes | Class<?>[] | {} | 從模型繼承的子型別陣列 |
reference | String | "" |
示例
1 /** 2 * Student類 學生實體類 3 */ 4 @ApiModel(value = "Student",description = "使用者實體類") 5 public class Student implements Serializable { 6 }
2、@ApiModelProperty
使用場景:使用在被 @ApiModel 註解的模型類的屬性上。表示對model屬性的說明或者資料操作更改
概述:新增和操作模型屬性的資料
1 String value() default ""; 2 3 String name() default ""; 4 5 String allowableValues() default ""; 6 7 String access() default ""; 8 9 String notes() default ""; 10 11 String dataType() default ""; 12 13 boolean required() default false; 14 15 int position() default 0; 16 17 boolean hidden() default false; 18 19 String example() default ""; 20 21 /** @deprecated */ 22 @Deprecated 23 boolean readOnly() default false; 24 25 ApiModelProperty.AccessMode accessMode() default ApiModelProperty.AccessMode.AUTO; 26 27 String reference() default ""; 28 29 boolean allowEmptyValue() default false; 30 31 Extension[] extensions() default {@Extension( 32 properties = {@ExtensionProperty( 33 name = "", 34 value = "" 35 )} 36 )};
資料型別 | 預設值 | 說明 | |
---|---|---|---|
value | String | "" | 屬性簡要說明 |
name | String | "" | 重寫屬性名稱 |
allowableValues | String | "" | 限制引數可接收的值,三種方法,固定取值,固定範圍 |
access | String | "" | 過濾屬性 |
notes | String | "" | 目前尚未使用 |
dataType | String | "" | 引數的資料型別,可以是類名或原始資料型別,此值將覆蓋從類屬性讀取的資料型別 |
required | boolean | false | 是否為必傳引數(false:非必傳引數;true:必傳引數) |
position | int | "" | 執行在模型中顯示排序屬性 |
hidden | boolean | false | 隱藏模型屬性(false:不隱藏;true:隱藏) |
example | String | "" | 屬性的示例值 |
readOnly | boolean | false | 指定模型屬性為只讀(false:非只讀;true:只讀) |
reference | String | "" | 指定對應型別定義的引用,覆蓋指定的任何其他後設資料 |
allowEmptyValue | boolean | false | 執行穿空值(false:不允許傳空值;true:執行傳空值) |
extensions | Extension[] | {@Extension(properties={@ExtensionProperty(name = "",value = "")})}; |
示例
1 @ApiModelProperty(value = "學號") 2 private Integer id; //學號 3 @ApiModelProperty(value = "姓名") 4 private String name; //姓名 5 @ApiModelProperty(value = "成績") 6 private Integer score; //成績 7 @ApiModelProperty(value = "籍貫") 8 private String birthplace; //籍貫 9 //日期的格式 年-月-日 10 @ApiModelProperty(value = "生日") 11 @DateTimeFormat(pattern = "yyyy-MM-dd") 12 private Date birthday; //生日
3、@ApiOperation
使用場景:使用在方法上,表示一個http請求的操作
1 String value(); 2 3 String notes() default ""; 4 5 String[] tags() default {""}; 6 7 Class<?> response() default Void.class; 8 9 String responseContainer() default ""; 10 11 String responseReference() default ""; 12 13 String httpMethod() default ""; 14 15 /** @deprecated */ 16 @Deprecated 17 int position() default 0; 18 19 String nickname() default ""; 20 21 String produces() default ""; 22 23 String consumes() default ""; 24 25 String protocols() default ""; 26 27 Authorization[] authorizations() default {@Authorization("")}; 28 29 boolean hidden() default false; 30 31 ResponseHeader[] responseHeaders() default {@ResponseHeader( 32 name = "", 33 response = Void.class 34 )}; 35 36 int code() default 200; 37 38 Extension[] extensions() default {@Extension( 39 properties = {@ExtensionProperty( 40 name = "", 41 value = "" 42 )} 43 )}; 44 45 boolean ignoreJsonView() default false;
資料型別 | 預設值 | 說明 | |
---|---|---|---|
value | String | 屬性簡要說明 | |
notes | String | "" | 備註說明 |
tags | String | {""} | 可重新分組 |
response | Class<?> response() | Void.class | 用於描述訊息有效負載的可選響應類,對應於響應訊息物件的 schema 欄位 |
responseContainer | String | "" | 宣告響應的容器,有效值為List,Set,Map,任何其他值都將被忽略 |
responseReference | String | "" | 宣告響應的引用 |
httpMethod | String | "" | http請求方式 |
position | int | 0 | 執行在模型中顯示排序屬性 |
nickname | String | "" | 暱稱 |
produces | String | "" | For example, "application/json, application/xml" |
consumes | String | "" | For example, "application/json, application/xml" |
protocols | String | "" | Possible values: http, https, ws, wss. |
authorizations | Authorization[] | {@Authorization("")} | 高階特性認證時配置 |
hidden | boolean | false | 是否隱藏 |
responseHeaders | ResponseHeader[] | {@ResponseHeader(name = "",response = Void.class)}; | 可能響應的 header 列表 |
code | int | 200 | http狀態碼 |
extensions | Extension[] | {@Extension(properties = {@ExtensionProperty(name = "",value = "")})}; | 關聯註解 |
ignoreJsonView | boolean | false |
示例
1 @ApiOperation("新增學生資訊") 2 @PostMapping(value = "/student") 3 public void AddStudent(Student student) { 4 5 studentService.AddStudent(student); 6 }
4、@ApiParam
使用場景:在 Rest 介面上或 Rest 介面引數前邊使用
概述:為 Rest 介面引數新增其它後設資料(匯入到 yapi 中不會被解析)
1 String name() default ""; 2 3 String value() default ""; 4 5 String defaultValue() default ""; 6 7 String allowableValues() default ""; 8 9 boolean required() default false; 10 11 String access() default ""; 12 13 boolean allowMultiple() default false; 14 15 boolean hidden() default false; 16 17 String example() default ""; 18 19 Example examples() default @Example({@ExampleProperty( 20 mediaType = "", 21 value = "" 22 )}); 23 24 String type() default ""; 25 26 String format() default ""; 27 28 boolean allowEmptyValue() default false; 29 30 boolean readOnly() default false; 31 32 String collectionFormat() default "";
資料型別 | 預設值 | 說明 | |
---|---|---|---|
name | String | "" | 引數名稱,引數名稱將從 filed/method/parameter 名稱中派生,但你可以覆蓋它,路徑引數必須始終命名為它們所代表的路徑部分 |
value | String | "" | 引數簡單描述 |
defaultValue | String | "" | 描述引數預設值 |
allowableValues | String | "" | 可接收引數值限制,有三種方式,取值列表,取值範圍 |
required | boolean | false | 是否為必傳引數(false:非必傳; true:必傳) |
access | String | "" | 引數過濾 |
allowMultiple | boolean | false | 指定引數是否可以通過多次出現來接收多個值 |
hidden | boolean | false | 隱藏引數列表中的引數 |
example | String | "" | 非請求體(body)型別的單個引數示例 |
examples | Example | @Example({@ExampleProperty(mediaType = "",value = "")}); | 引數示例,僅適用於請求體型別的請求 |
type | String | "" | 新增覆蓋檢測到型別的功能 |
format | String | "" | 新增提供自定義format格式的功能 |
allowEmptyValue | boolean | false | 新增將格式設定為空的功能 |
readOnly | boolean | false | 新增被指定為只讀的能力 |
collectionFormat | String | "" |
示例
1 @ApiOperation("判斷驗證碼是否正確") 2 @RequestMapping(value = "/UpdatePassword" , method = RequestMethod.POST) 3 public CommonResult updatePassword( 4 @ApiParam(value = "手機號碼",required = true) @RequestParam String userPhone, 5 @ApiParam(value = "驗證碼",required = true) @RequestParam String authCode){ 6 7 return userMemberService.updatePassword(userPhone,authCode); 8 }
1.@ApiModel與@ApiModelProperty效果
2.@ApiOperation效果
四、匯出swagger介面文件
pom.xml檔案
1 <!-- swagger2markup模組 --> 2 <dependency> 3 <groupId>io.github.swagger2markup</groupId> 4 <artifactId>swagger2markup</artifactId> 5 <version>1.3.1</version> 6 </dependency>
2、新增測試類
在src/test/java/com/example/demo目錄下新建測試類SwaggerTo
1 @RunWith(SpringRunner.class) //測試類要使用注入的類 2 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) //用於單元測試 3 public class SwaggerTo { 4 }
3、新增測試方法
generateMarkdownDocs()
1 /** 2 * 生成Markdown格式文件 3 * @throws Exception 4 */ 5 @Test 6 public void generateMarkdownDocs() throws Exception { 7 // 輸出Markdown格式 8 Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() 9 .withMarkupLanguage(MarkupLanguage.MARKDOWN) //輸出格式:ASCIIDOC,MARKDOWN,CONFLUENCE_MARKUP 10 .withOutputLanguage(Language.ZH) //語言型別:中文(ZH) 預設英文(EN) 11 .withPathsGroupedBy(GroupBy.TAGS) //Api排序規則 12 .withGeneratedExamples() 13 .withoutInlineSchema() 14 .build(); 15 16 Swagger2MarkupConverter.from(new URL("http://localhost:8080/v2/api-docs?group=user")) //url,注意埠號與分組 17 .withConfig(config) 18 .build() 19 .toFolder(Paths.get("src/docs/markdown/generated")); //生成檔案的存放路徑,生成多個檔案 20 }
此時在src/docs/markdown/generated目錄下就會生成definitions.md、overview.md、paths.md、security.md檔案,即生成的markdown檔案
generateMarkdownDocsToFile()
1 /** 2 * 生成Markdown格式文件,並彙總成一個檔案 3 * @throws Exception 4 */ 5 @Test 6 public void generateMarkdownDocsToFile() throws Exception { 7 // 輸出Markdown到單檔案 8 Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() 9 .withMarkupLanguage(MarkupLanguage.MARKDOWN) //輸出格式:ASCIIDOC,MARKDOWN,CONFLUENCE_MARKUP 10 .withOutputLanguage(Language.ZH) //語言型別:中文(ZH) 預設英文(EN) 11 .withPathsGroupedBy(GroupBy.TAGS) //Api排序規則 12 .withGeneratedExamples() 13 .withoutInlineSchema() 14 .build(); 15 16 Swagger2MarkupConverter.from(new URL("http://localhost:8080/v2/api-docs?group=user")) //url,注意埠號與分組 17 .withConfig(config) 18 .build() 19 .toFile(Paths.get("src/docs/markdown/generated/all")); //生成檔案的存放路徑,彙總為一個檔案 20 }
此時在src/docs/markdown/generated目錄下就會生成all.md檔案,即生成的markdown檔案
注意:
-
如果在Swagger2Config類裡宣告瞭分組,即Docket方法有.groupName("user"),那麼測試方法中url路徑後面需要新增?group=user。如果Swagger2Config類中未宣告分組,則測試方法中url路徑不需要新增?group=user
-
在使用測試方法生成檔案的時候需要關閉專案,否則會提示埠被佔用
-
可以修改Swagger2MarkupConfig.withMarkupLanguage()方法內的引數值來生成不同的檔案格式,修改Swagger2MarkupConverter.toFile()方法內的引數值
-
definitions.md存放Models相關資訊,overview.md存放文件概覽相關資訊,paths.md存放controller相關資訊,security.md存放與身份認證相關的資訊
4、匯出文件部分內容
all.md