Swagger注解生成Rest Api文檔

背景

  • 服務(wù)端開發(fā)同學(xué)需要花很多時間編寫和維護(hù)大量的Rest接口文檔两蟀,且往往接口修改后沒有及時同步文檔,讓對接方和后續(xù)維護(hù)者一頭霧水碧注。
  • 有沒有一種方式可以相對容易地生成可讀性好的Rest文檔嚣伐,并且做到與代碼同步?

目標(biāo)

  • 通過Swagger注釋自動生成Rest文檔接口萍丐。
  • 通過Swagger2Markup生成靜態(tài)文檔(html/markdown/wiki)

使用Swagger注解自動生成Rest文檔接口

maven引入Swagger依賴

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.7.0</version>
</dependency>

配置Swagger

@SpringBootApplication
@EnableSwagger2
public class AppStarter extends WebMvcConfigurerAdapter {
 
    public static void main(String[] args) {
        SpringApplication.run(AppStarter.class, args);
    }
 
    /**
     * 創(chuàng)建Rest Api描述
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()                       //按條件指定生成文檔接口
                .paths(PathSelectors.any())
                .build();
    }
 
    /**
     * 接口描述
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("測試項目")
                .description("User實體CRUD")
                .version("1.0")
                .build();
    }
}
  • EnableSwagger2啟動Swagger
  • 創(chuàng)建Docket

使用Swagger注解

controller注解

@RestController
@RequestMapping("/v1/users")
@Api(description = "用戶管理接口")
public class UserController {
 
    @PostMapping
    @ApiOperation("創(chuàng)建用戶")
    public void addUser(@RequestBody User user){
 
    }
 
    @GetMapping
    @ApiOperation("查詢用戶")
    public List<User> getUsers(@ApiParam(value = "模糊查詢用戶名") String name){
        return Lists.newArrayList(
                User.builder().id(1).name("test-name1").birth(new Date()).build(),
                User.builder().id(2).name("test-name2").birth(new Date()).build()
        );
    }
 
    @GetMapping("/{id}")
    @ApiOperation("獲取用戶")
    public User getUser(@ApiParam(value = "用戶ID") @PathVariable long id){
        return User.builder().id(id).name("test-name").birth(new Date()).build();
    }
 
    @PutMapping("/{id}")
    @ApiOperation("修改用戶")
    public void updateUser(@ApiParam(value = "用戶ID") @PathVariable long id,
                           @RequestBody User user){
    }
 
    @DeleteMapping("/{id}")
    @ApiOperation("刪除用戶")
    public void deleteUser(@ApiParam(value = "用戶ID") @PathVariable long id){
    }
}
注解 作用域 說明
Api controller類名 描述controller
ApiOperate controller方法 描述接口方法
ApiParam path或param參數(shù) 描述接口參數(shù)

實體注解

@ApiModel("用戶")
public class User {
 
    @ApiModelProperty("用戶ID")
    private long id;
 
    @ApiModelProperty("用戶名")
    private String name;
 
    @ApiModelProperty("生日")
    private Date birth;
}
注解 作用域 說明
ApiModel 實體類名 描述實體
ApiModelProperty 實體屬性 描述屬性

生成api-docs

  • 打好注解后轩端,編譯,啟動項目逝变。
  • swagger會在springmvc中創(chuàng)建 GET http://host:port/v2/api-docs 接口基茵,輸出json格式的rest api文檔

使用Swagger2Markup生成靜態(tài)文檔

  • 有了swagger的文檔api,需要將其生成可讀的文本文檔(html/markdown/wiki)壳影,并靜態(tài)化拱层。

啟動項目

  • 將寫好注解的項目啟動,并保證/v2/api-docs接口可以訪問宴咧。

配置swagger2markup插件

  • maven.build.plugins增加swagger2markup插件
<plugin>
    <groupId>io.github.swagger2markup</groupId>
    <artifactId>swagger2markup-maven-plugin</artifactId>
    <version>1.3.1</version>
    <configuration>
        <!-- api-docs訪問url -->
        <swaggerInput>http://localhost:8080/v2/api-docs</swaggerInput>
        <!-- 生成為單個文檔根灯,輸出路徑 -->
        <outputFile>src/docs/asciidoc/generated/all</outputFile>
        <!-- 生成為多個文檔,輸出路徑 -->
        <!--<outputDir>src/docs/asciidoc/generated</outputDir>-->
        <config>
            <!-- wiki格式文檔 -->
            <swagger2markup.markupLanguage>CONFLUENCE_MARKUP</swagger2markup.markupLanguage>
 
            <!-- ascii格式文檔 -->
            <!--<swagger2markup.markupLanguage>ASCIIDOC</swagger2markup.markupLanguage>-->
 
            <!-- markdown格式文檔 -->
            <!--<swagger2markup.markupLanguage>MARKDOWN</swagger2markup.markupLanguage>-->
            <swagger2markup.pathsGroupedBy>TAGS</swagger2markup.pathsGroupedBy>
        </config>
    </configuration>
</plugin>

運行swagger2markup插件

image.png
  • mvn命令運行swagger2markup:convertSwagger2markup
  • 在項目的/src/docs/asciidoc/generated中找到結(jié)果文件

處理結(jié)果文件

CONFLUENCE_MARKUP(wiki)

  • confluence的wiki支持此格式
  • 使用插入”wiki標(biāo)記“


    image.png
  • 選擇“企業(yè)維基”掺栅,將內(nèi)容復(fù)制進(jìn)去


    image.png

MARKDOWN

  • 可用在任何支持markdown的編輯器中

ASCIIDOC(html)

  • ascii文檔烙肺,可以再進(jìn)一步將其轉(zhuǎn)換為可讀性優(yōu)秀的html文檔

配置asciidoctor插件

  • maven.build.plugins中增加配置
<plugin>
    <groupId>org.asciidoctor</groupId>
    <artifactId>asciidoctor-maven-plugin</artifactId>
    <version>1.5.6</version>
    <configuration>
        <!-- asciidoc文檔輸入路徑 -->
        <sourceDirectory>src/docs/asciidoc/generated</sourceDirectory>
        <!-- html文檔輸出路徑 -->
        <outputDirectory>src/docs/asciidoc/html</outputDirectory>
 
        <backend>html</backend>
        <sourceHighlighter>coderay</sourceHighlighter>
 
        <!-- html文檔格式參數(shù) -->
        <attributes>
            <doctype>book</doctype>
            <toc>left</toc>
            <toclevels>3</toclevels>
            <numbered></numbered>
            <hardbreaks></hardbreaks>
            <sectlinks></sectlinks>
            <sectanchors></sectanchors>
        </attributes>
    </configuration>
</plugin>

運行asciidoctor插件

image.png

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氧卧,隨后出現(xiàn)的幾起案子桃笙,更是在濱河造成了極大的恐慌,老刑警劉巖假抄,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怎栽,死亡現(xiàn)場離奇詭異丽猬,居然都是意外死亡,警方通過查閱死者的電腦和手機熏瞄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門脚祟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人强饮,你說我怎么就攤上這事由桌。” “怎么了邮丰?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵行您,是天一觀的道長。 經(jīng)常有香客問我剪廉,道長娃循,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任斗蒋,我火速辦了婚禮捌斧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泉沾。我一直安慰自己捞蚂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布跷究。 她就那樣靜靜地躺著姓迅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俊马。 梳的紋絲不亂的頭發(fā)上丁存,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音潭袱,去河邊找鬼柱嫌。 笑死,一個胖子當(dāng)著我的面吹牛屯换,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播与学,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼彤悔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了索守?” 一聲冷哼從身側(cè)響起晕窑,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卵佛,沒想到半個月后杨赤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敞斋,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年疾牲,在試婚紗的時候發(fā)現(xiàn)自己被綠了植捎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡阳柔,死狀恐怖焰枢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舌剂,我是刑警寧澤济锄,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布捻浦,位于F島的核電站对粪,受9級特大地震影響匠抗,放射性物質(zhì)發(fā)生泄漏半醉。R本人自食惡果不足惜甸祭,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一碴萧、第九天 我趴在偏房一處隱蔽的房頂上張望囱嫩。 院中可真熱鬧苦蒿,春花似錦沾谓、人聲如沸委造。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昏兆。三九已至,卻和暖如春妇穴,著一層夾襖步出監(jiān)牢的瞬間爬虱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工腾它, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跑筝,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓瞒滴,卻偏偏與公主長得像曲梗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妓忍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,803評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理虏两,服務(wù)發(fā)現(xiàn),斷路器世剖,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 場景 有時候需要為前端開發(fā)者提供Restful Api說明文檔定罢,通過word文檔創(chuàng)建和修改非常耗時,希望有一種比較...
    飛天豌豆狼閱讀 9,870評論 4 6
  • 需求: 為客戶端同事寫接口文檔的各位后端同學(xué),已經(jīng)在各種場合回憶了使用自動化文檔工具前手寫文檔的血淚史.我的故事卻...
    _Lyux閱讀 4,696評論 0 2
  • 介紹 近兩年旁瘫,Deep Learning的興起祖凫,也有了很多一些開源的深度學(xué)習(xí)軟件包琼蚯,其中比較出名的就是Caffe,...
    zhangwen_nuaa閱讀 2,737評論 0 1