使用spring-boot-starter-swagger實(shí)現(xiàn)API文檔化

為什么要實(shí)現(xiàn)API文檔化亲雪?

  1. API文檔化有利于前后端分離的開展里初。隨著開發(fā)方式全面轉(zhuǎn)成前后端分離,前端和后端的唯一溝通就在API層面煌茴。在沒有文檔化之前随闺,開發(fā)人員只能口頭的交代并反復(fù)理解每個(gè)接口參數(shù)和返回值,這個(gè)過程相當(dāng)不穩(wěn)定蔓腐,變化頻繁矩乐。而通過API文檔化后,可以通過文檔的清晰定義回论,使得前后端人員減少無畏溝通散罕,并在理解上保持一致;

  2. API文檔化有利于接口自動(dòng)化測試傀蓉。公司馬上上馬接口自動(dòng)化測試欧漱,對接口參數(shù)和返回值要通過Json方式導(dǎo)入自動(dòng)化測試程序。而用特殊工具生成的API文檔僚害,可以直接輸出json格式的文檔硫椰,簡化了測試流程,減輕了開發(fā)人員的工作量萨蚕;

  3. API文檔化有利于系統(tǒng)文檔建設(shè)靶草。開發(fā)人員不愿意寫文檔,寫注釋岳遥。而為了以上兩個(gè)目的必須要求開發(fā)人員在編碼的同時(shí)補(bǔ)充相關(guān)的API描述奕翔,而通過一個(gè)相對穩(wěn)定成熟和趁手的工具可以大大減輕文檔的工作量,做到事半功倍浩蓉。

Swagger和spring-boot-starter-swagger

Swagger是業(yè)界比較流行的實(shí)現(xiàn)API文檔化的工具派继。優(yōu)點(diǎn)有

  1. 通過在項(xiàng)目中引入Swagger,可以使用簡單的Annotation捻艳,就實(shí)現(xiàn)了API文檔化驾窟;
  2. Swagger提供標(biāo)準(zhǔn)的json或yaml文檔,方便做進(jìn)一步解析认轨,典型應(yīng)用是接口自動(dòng)化測試绅络;
  3. 頁面可以直接進(jìn)行測試(try-it-out功能,部分替代Postman)嘁字;
  4. Swagger還提供類似于github的SwaggerHub恩急,相當(dāng)于公共的API文檔集散地。

Swagger的項(xiàng)目主頁:https://swagger.io/

為了將Swagger和公司現(xiàn)有技術(shù)框架相結(jié)合纪蜒,在網(wǎng)上發(fā)現(xiàn)了這么一個(gè)小項(xiàng)目spring-boot-starter-swagger衷恭,將公司項(xiàng)目和Swagger的集成又簡化了一步,特此向作者表示感謝纯续。
作者在簡書上的介紹文章:http://www.reibang.com/p/91c5a8565a45

主要優(yōu)點(diǎn):

  1. 引入足夠簡單随珠,只需要2步(如果有Shiro就是3步)
  2. 方便的Swagger開關(guān)
  3. 支持yaml格式的配置
  4. 支持API的分組顯示(在API過多的情況下非常好用)
  5. 支持JSR-303校驗(yàn)注解(@Min, @Max, @Pattern等)
  6. 依然在維護(hù)完善灭袁,逐步增加更多配置和開關(guān)

Swagger引入方法

  1. pom文件引入
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>spring-boot-starter-swagger</artifactId>
            <version>1.5.1.RELEASE</version>
        </dependency>
  1. 主文件加Annotation
@SpringBootApplication
@EnableSwagger2Doc
public calss TestSwaggerApplication{
  1. 增加Shiro的anon設(shè)置(防止被登錄轉(zhuǎn)向)
client:
  filters:
  filter:
    chain:
      definitions: /swagger-ui.html=anon;/webjars/**=anon;/swagger-resources/**=anon;/v2/api-docs/**=anon;/**=authc;
  1. 配置文件
    配置文件統(tǒng)一放到了項(xiàng)目的application.yml中,稍后計(jì)劃使用新的文件牙丽,并采用引入的方式實(shí)現(xiàn)配置文件的分離

4.1 公共信息
定義整個(gè)項(xiàng)目的總體信息简卧。

swagger:
  # 公共信息
  enabled: true
  title: swagger-demo
  description: 一個(gè)Swagger測試項(xiàng)目
  version: 0.1-SNAPSHOT
  # 許可證及服務(wù)條款信息
  license:
  licenseUrl:
  termsOfServiceUrl:
  contact:
    name: Carisma
    url:
    email: carisma.zhao@gmail.com
  base-package: me.learning.swagger

4.2 分組策略
分組策略指的是在整個(gè)項(xiàng)目中,將不同類型的API接口分散到不同的頁面烤芦,方便查看和測試。

# 分組策略
  docket:
    apiForMe:
      title: Myself
      description: 開放給自己的接口
      base-path: /api/myself/**
    apiForOthers:
      title: Others
      description: 作為其他人的接口
      base-path: /api/others/**

4.3 公共參數(shù)和通用錯(cuò)誤碼
像每個(gè)接口都需要鑒權(quán)這種參數(shù)析校,可以在配置文件中統(tǒng)一定義构罗,這樣省去每個(gè)接口再寫的麻煩,也能兼顧頁面的測試智玻。

# 公共參數(shù)
  global-operation-parameters[0]:
    name: TOKEN
    description: 鑒權(quán)
    modelRef: string
    parameterType: header
    # 公共參數(shù)寫成requierd, 對于不需要登錄的接口隨便寫一個(gè)字符串即可
    required: true
  # 通用返回錯(cuò)誤碼
  apply-default-response-messages: true
  global-response-message.get[0]:
    code: 401
    message: 401錯(cuò)誤
  global-response-message.get[1]:
    code: 500
    message: 后端錯(cuò)誤
    modelRef: ERROR

Swagger的效果查看

以上配置完成后遂唧,Swagger直接可以生成文檔,而不需要單獨(dú)在每個(gè)需要顯示的API上添加Annotation吊奢,當(dāng)然下面會(huì)講到如果需要更清晰的顯示盖彭,還要使用注解,使用注解后页滚,查看方式依然是以下兩種召边。

  1. API文檔:在瀏覽器中輸入localhost:9120/swagger-ui.html即可。端口號(hào)為Application的啟動(dòng)端口裹驰;
  2. Json文件:如果沒有分組隧熙,則直接使用localhost:9120/swagger-ui.html/v2/api-doc,即顯示API的Json格式(包括對model的解析)幻林,如果使用了分組贞盯,則需要每個(gè)分組單獨(dú)顯示,例如localhost:9120/swagger-ui.html/v2/api-doc/?group=apiForMe

Annotation使用詳解

要想詳細(xì)的沪饺、切合實(shí)際的展示API的內(nèi)容與要求躏敢,則必須在API和Model上加單獨(dú)的注解,官方JavaDoc雖然不是很詳細(xì)整葡,但是作為參考也夠了(剩下的就是自己試了):
http://docs.swagger.io/swagger-core/current/apidocs/index.html?io/swagger/annotations/Api.html

其中常用的有以下幾個(gè)件余,親測后有些需要詳細(xì)說明:

@Api
加在需要自定義注解的API類(*Controller)上。這個(gè)注解沒有什么屬性需要說的掘宪,其中value比較奇葩蛾扇,官方說法是隱含的代替tag的作用。(那就用tag不就完了魏滚?)為了清晰化接口镀首,使用方式應(yīng)該是分組>tag>value,即首先用分組分隔鼠次,然后使用tag屬性更哄,value屬性最好就不再使用了芋齿。

@ApiOperation
加在API的每個(gè)路徑映射方法上(即真正的API接口)。value屬性是必須的成翩,描述該接口的內(nèi)容觅捆,可以是中文。
response和responseContainer是兩個(gè)重要的屬性麻敌。前者表示返回的類栅炒,典型的Model.class,注意不是字符串术羔,IDEA是可以解析的(Swagger體系內(nèi)自動(dòng)的做成一種Reference)赢赊;后者可選值為:"List","Set"或者"Map"级历,注意是字符串释移。

@ApiImplicitParam & @ApiImplicitParams
加在API的參數(shù)上,最重要的注解之一寥殖。另有一個(gè)@ApiParam玩讳,是加在函數(shù)簽名里面,不推薦嚼贡,這兩個(gè)是在函數(shù)簽名的外面熏纯,更清晰。后者是前者的集合编曼,比較簡單豆巨,就不贅述了。前者比較重要的屬性有

  1. name:和參數(shù)變量名保持一致掐场;
  2. value:對這個(gè)參數(shù)的簡要描述往扔;
  3. required:是否必須;
  4. dataType:數(shù)據(jù)類型熊户,注意原生類型(包裝類也用原生的表示萍膛,例如Integer寫"int")都是小寫,包括"string"嚷堡;
  5. paramType:參數(shù)類型蝗罗,"body"是普通參數(shù),"path"是路徑上的那種參數(shù)蝌戒,"query"是url中問號(hào)的那種參數(shù)串塑;
  6. allowableValues:參數(shù)允許的值,這個(gè)屬性對自動(dòng)化測試比較重要北苟,具體參考JavaDoc桩匪,實(shí)際使用中最好寫明。需要說明的是友鼻,在paramType為body時(shí)傻昙,range的設(shè)置是不生效的(原因未知)闺骚。

@ApiModel
以下兩個(gè)注解都是加在Model里,便于在文檔中對自定義類做詳細(xì)的說明妆档。這個(gè)注解加在Model類上僻爽。value屬性可以提供一個(gè)名字,在文檔中贾惦,會(huì)替換原來model的類名(沒有試中文是否可行)胸梆。同時(shí)提供對超類和子類的描述,非字符串须板,便于生成繼承關(guān)系(感覺這個(gè)功能可以通過代碼分析實(shí)現(xiàn))

@ApiModelProperty
加在Model的屬性上乳绕,對屬性做進(jìn)一步描述和限定。同時(shí)這個(gè)注解可以加在getXXX方法上逼纸,如果XXX屬性上也有,則以屬性上的注解描述為準(zhǔn)济蝉〗芄簦考慮提供方法上加注解,可能是方便描述超類中的這個(gè)字段吧(protected類型)王滤。該注解使用方式和@ApiImplicitParam類似贺嫂。
由于引入了spring-boot-starter-swagger,可以直接支持JSR-303校驗(yàn)類的注解雁乡,包括@Pattern第喳、@Max、@Min踱稍、@Size等曲饱。感覺Pattern是無法用@ApiModelProperty的屬性替代的,其他好像都可以珠月,說的不對還請作者指正扩淀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啤挎,隨后出現(xiàn)的幾起案子驻谆,更是在濱河造成了極大的恐慌,老刑警劉巖庆聘,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胜臊,死亡現(xiàn)場離奇詭異,居然都是意外死亡伙判,警方通過查閱死者的電腦和手機(jī)象对,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澳腹,“玉大人织盼,你說我怎么就攤上這事杨何。” “怎么了沥邻?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵危虱,是天一觀的道長。 經(jīng)常有香客問我唐全,道長埃跷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任邮利,我火速辦了婚禮弥雹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘延届。我一直安慰自己剪勿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布方庭。 她就那樣靜靜地躺著厕吉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪械念。 梳的紋絲不亂的頭發(fā)上头朱,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音龄减,去河邊找鬼项钮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛希停,可吹牛的內(nèi)容都是我干的烁巫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼脖苏,長吁一口氣:“原來是場噩夢啊……” “哼程拭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棍潘,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對情侶失蹤恃鞋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亦歉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恤浪,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年肴楷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了水由。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赛蔫,死狀恐怖砂客,靈堂內(nèi)的尸體忽然破棺而出泥张,到底是詐尸還是另有隱情,我是刑警寧澤鞠值,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布媚创,位于F島的核電站,受9級(jí)特大地震影響彤恶,放射性物質(zhì)發(fā)生泄漏钞钙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一声离、第九天 我趴在偏房一處隱蔽的房頂上張望芒炼。 院中可真熱鬧,春花似錦术徊、人聲如沸本刽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盅安。三九已至,卻和暖如春世囊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窿祥。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工株憾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晒衩。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓嗤瞎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親听系。 傳聞我的和親對象是個(gè)殘疾皇子贝奇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容