亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Swagger-Api 注解詳解

1. 前言

本節會繼續結合一個用戶登錄接口給大家介紹 Swagger 中的另一個核心注解 - Api注解及所提供的常用屬性。

Api 注解和 ApiOperation 注解一樣,在 Swagger 中都扮演著非常重要的角色,Api 注解一般都會配合 ApiOperation 注解一起來使用。

重點講解的屬性:value 、tags 、description ;
概要講解的屬性:consumes、produces、protocols、hidden 。

希望大家在學習本節過程中能夠分清主次,有的放矢。

2. 什么是 Api 注解 ?

Api 注解是作用在接口類上面的注解,其主要是用來給接口類定義相關說明。

Api 注解提供了豐富的屬性,來允許我們自定義接口類的描述信息,包括對接口類的簡單描述,接口類所屬的分組等。

下面我們來看一下 Api 注解中都包括哪些主要屬性。

3. Api 注解主要屬性匯總

屬性名稱 屬性類型 默認值 作用
value() String 接口類說明
tags() String[] 定義接口類所屬分組
description() String 定義接口類的簡單描述
protocols() String 網絡請求協議
hidden() boolean false 接口類隱藏
produces() String 接口類請求頭類型-輸出
consumes() String 接口類請求頭類型-輸入

4. 屬性詳解

4.1 value() 屬性

定義:

該屬性就是描述接口類的作用是什么,即同一類下的接口都是用來干什么的。

使用方法:

在 Api 注解中聲明 value 的值即可。例如,對于用戶接口類(UserController),我們只需要將 value 的值寫為 ‘user-controller’就好了,這樣我們就能很清楚的知道這個接口類下的所有接口都是用來處理和用戶相關的請求的,如下代碼段所示(現在你不需要理解業務代碼代表什么意思,重點看接口類上使用的注解及屬性即可,下同)。

@Api(value = "user-controller")
public class UserController{
    // do something...
}

代碼解釋:

第1行,我們在 UserController 用戶接口類的上方使用了 @Api 注解的 value 屬性來描述該接口類的作用。

顯示結果:

可以看到,在 Created by Steafan 下放黑體加粗顯示的 user-Controller 就是我們使用 value 屬性描述的接口類信息了。

Tips :

  1. 通過 value 屬性來對接口類進行描述的這一行為在實際開發工作中并不常用,各位同學只需要知道有這么一個 value 屬性就可以了。
  2. 在實際開發工作中, value 屬性經常被 tags 屬性所替代,這也是 Swagger 官方所設定的規則:當 Api 注解的 value 屬性和 tags 屬性同時存在時,tags 屬性的值會替代 value 屬性的值,這一點需要同學們注意。

4.2 tags() 屬性

定義:

該屬性就是對實現相同業務功能的接口類做一個大型的分組,該分組中包括同業務功能下的所有的接口。

使用方法:

在 Api 注解中聲明 tags 的值即可,如果沒有描述則默認值為空。例如,就用戶接口類而言,該接口類屬于用戶業務分組,所以我們將 tags 的值描述為‘用戶’或者‘user’,這樣我們就能很清楚的看到這個接口類是屬于用戶業務組的,如下代碼段所示。

@Api(tags = {"user"})
public class UserController{
    // do something...
}

代碼解釋:

第1行,我們在 UserController 接口類的上方使用了 @Api 注解的 tags 屬性來描述該接口類所屬的業務分組。

顯示結果:

我們可以看到在 value 屬性的值的位置顯示了 user ,也就是 tags 里寫的 user 了。

上述是 tags 屬性和 value 屬性單獨存在時候的效果,下面我們來看一下 tags 屬性和 value 屬性同時存在的效果,如下代碼段所示:

@Api(value="user-controller", tags = {"user"})
public class UserController{
    // do something...
}

代碼解釋:

第1行,我們在 UserController 接口類的上方使用了 @Api 注解的 value 屬性和 tags 屬性同時來描述該接口類。

顯示結果:

我們可以看到顯示結果是和只使用 tags 屬性來描述接口類時相同的結果,這也證明了 Swagger 官方的設定。

Tips : 在實際項目開發工作中,往往一個業務可能包括多個接口類的實現,這種情況需要我們對接口類進行多個分組,而 tags 屬性的類型是字符串類型的數組,可以描述一個或多個值,如存在多值時,應該使用這種方式來描述:@Api(tags = {“user”, “customer”})。

4.3 description() 屬性

定義:

該屬性就是對接口類進行簡單概要的描述,通常是描述一些注意的地方,value 屬性更多的則是描述接口類的用途,這一點同學們要分清。

使用方法:

在 Api 注解中聲明 description 的值即可,如果沒有描述則默認值為空。例如,如果我想添加對用戶接口類的概要描述信息,那么我可以這樣寫 description = “所有用戶業務接口必須使用post請求”,如下代碼段所示。

@Api(description = {"所有用戶業務接口必須使用post請求"})
public class UserController{
    // do something...
}

代碼解釋:

第1行,我們在 UserController 接口類的上方使用了 @Api 注解的 description 屬性來描述用戶接口類的一些注意的地方和約定。

顯示結果:

在我用紅框圈起來的地方我們可以看到使用 description 注解所描述的信息了。

Tips :

  1. description 屬性一般用來對接口類進行一些注意事項和約定的描述,不要將其描述為接口類的用途。
  2. description 屬性在實際開發工作中還是很常用的,所以描述好 description 是體現一個程序員對業務內容是否充分理解的標志。

階段小結(一)

以上是對 Api 注解中經常使用的三個屬性進行的詳細介紹,value,tags,description 這三個屬性不管是在項目開發中,還是在需求溝通中,使用的都很頻繁,所以真正掌握這三個屬性,是用好 Api 注解的重要前提。在學習這三個屬性時,大家應該結合 ApiOperation 注解來對比并總結它們之間的差異,通過不斷的使用來發現它們的使用規律,這一點很重要。

在詳細講解完 Api 重要屬性之后,下面我將針對在 Api 注解中,使用頻率不是很高,但是有時也會用到的一些屬性做概要性講解,這些屬性分別是:consumes、produces、protocols、hidden。

4.4 protocols() 和 hidden() 屬性

定義:

protocols() 屬性就是對接口類中,所有的接口所使用的網絡協議進行一個約定,常用的網絡協議有:http、https。

hidden() 屬性就是控制接口類在 Swagger 界面中的顯隱性。

使用方法:

protocols() 屬性默認值為空,但是 Swagger 在處理時,會默認獲取項目所采用的網絡協議,我們可以不用專門設置,如果一定要設置該屬性,則只允許設置http協議規定的屬性,不能隨意設置,http, https 這些都是被允許的。

hidden() 屬性允許我們在 Swagger 生成的接口列表界面上,控制接口類是否需要顯示,默認值為 false,即接口類顯示,為true時則接口類不顯示,如下代碼段所示。

@Api(hidden = true)
public class UserController{
    // do something...
}

代碼解釋:

第1行,我們在 UserController 接口類的上方使用了 @Api 注解的 hidden 屬性來隱藏我們的用戶接口類。

Tips :

  1. 接口類的顯隱控制應該根據特定安全策略和特定客戶需求來決定顯隱,不能無故隱藏接口,更不能頻繁的切換接口的顯隱。
  2. 在實際工作中,如果需要隱藏接口類則需要和項目組報備情況,說明原因。

階段小結(二)

以上則是 Api 注解中的輔助使用屬性的概要介紹,對于剩下的 produces、consumes 屬性在實際項目開發中幾乎很少使用,在這里就不再介紹了,如果大家感興趣可以去 Swagger 的官網查詢相關資料來了解。

5. 小結

本小節對 Swagger 中另一個最經常使用的 Api 注解及其該注解的各個屬性做了詳細的講解,針對 Api 注解中經常在實際項目開發中使用的屬性采用圖文并茂的方式進行了重點介紹和應用剖析,對于一些在實際項目開發中使用基本很少的注解做了概要講解。

在學習 @Api 注解及其屬性時,各位同學應該對比 @ApiOperation 注解及其屬性之間的使用差異,通過差異比較總結出適合自己的使用規律和使用方法才是最重要的。