使用Swagger2Markup實現(xiàn)導出API文檔

前言

在學會了如何使用Swagger之后卡乾,我們已經(jīng)能夠輕松地為Spring MVC或SpringBoot的Web項目自動構建出API文檔了木柬。但是混移,構建的文檔必須通過在項目中整合swagger-ui救拉、或使用單獨部署的swagger-ui/v2/api-docs返回的配置信息才能展現(xiàn)出您所構建的API文檔氏堤。本文將在使用Swagger的基礎上档插,再介紹一種生成靜態(tài)API文檔的方法慢蜓,以便于構建更輕量部署和使用的API文檔。
Swagger使用說明:REST API文檔工具Swagger2郭膛,以及與SpringBoot的集成

Swagger2Markup簡介

Swagger2Markup是Github上的一個開源項目晨抡。該項目主要用來將Swagger自動生成的文檔轉(zhuǎn)換成幾種流行的格式以便于靜態(tài)部署和使用,比如:AsciiDoc、Markdown耘柱、Confluence如捅。

項目主頁:https://github.com/Swagger2Markup/swagger2markup

如何使用

在使用Swagger2Markup之前,我們先需要準備一個使用了Swagger的Web項目帆谍,REST API文檔工具Swagger2伪朽,以及與SpringBoot的集成

生成AsciiDoc

生成AsciiDoc的方式有兩種:

  1. 通過Java代碼來生成

第一步:編輯pom.xml增加需要使用的相關依賴和倉庫

<dependency>
    <groupId>io.github.swagger2markup</groupId>
    <artifactId>swagger2markup</artifactId>
    <version>1.3.3</version>
</dependency>
<repositories>
    <repository>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
        <id>jcenter-releases</id>
        <name>jcenter</name>
        <url>http://jcenter.bintray.com</url>
    </repository>
</repositories>

第二步:編寫一個單元測試用例來生成執(zhí)行生成文檔的代碼

/**
     * 生成AsciiDocs格式文檔
     * @throws Exception
     */
    @Test
    public void generateAsciiDocs() throws Exception {
        //    輸出Ascii格式
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.ASCIIDOC)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL("http://127.0.0.1:8082/v2/api-docs"))
                .withConfig(config)
                .build()
                .toFolder(Paths.get("./docs/asciidoc/generated"));
    }

    /**
     * 生成Markdown格式文檔
     * @throws Exception
     */
    @Test
    public void generateMarkdownDocs() throws Exception {
        //    輸出Markdown格式
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.MARKDOWN)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL("http://localhost:8082/v2/api-docs"))
                .withConfig(config)
                .build()
                .toFolder(Paths.get("./docs/markdown/generated"));
    }
    /**
     * 生成Confluence格式文檔
     * @throws Exception
     */
    @Test
    public void generateConfluenceDocs() throws Exception {
        //    輸出Confluence使用的格式
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL("http://localhost:8082/v2/api-docs"))
                .withConfig(config)
                .build()
                .toFolder(Paths.get("./docs/confluence/generated"));
    }

    /**
     * 生成AsciiDocs格式文檔,并匯總成一個文件
     * @throws Exception
     */
    @Test
    public void generateAsciiDocsToFile() throws Exception {
        //    輸出Ascii到單文件
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.ASCIIDOC)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL("http://localhost:8082/v2/api-docs"))
                .withConfig(config)
                .build()
                .toFile(Paths.get("./docs/asciidoc/generated/all"));
    }

    /**
     * 生成Markdown格式文檔,并匯總成一個文件
     * @throws Exception
     */
    @Test
    public void generateMarkdownDocsToFile() throws Exception {
        //    輸出Markdown到單文件
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.MARKDOWN)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL("http://localhost:8082/v2/api-docs"))
                .withConfig(config)
                .build()
                .toFile(Paths.get("./docs/markdown/generated/all"));
    }

以上代碼內(nèi)容很簡單汛蝙,大致說明幾個關鍵內(nèi)容:

  • MarkupLanguage.ASCIIDOC:指定了要輸出的最終格式烈涮。除了ASCIIDOC之外,還有MARKDOWN和CONFLUENCE_MARKUP
  • from(new URL("http://localhost:8080/v2/api-docs"):指定了生成靜態(tài)部署文檔的源頭配置窖剑,可以是這樣的URL形式坚洽,也可以是符合Swagger規(guī)范的String類型或者從文件中讀取的流。如果是對當前使用的Swagger項目西土,我們通過使用訪問本地Swagger接口的方式讶舰,如果是從外部獲取的Swagger文檔配置文件,就可以通過字符串或讀文件的方式
  • toFolder(Paths.get("src/docs/asciidoc/generated"):指定最終生成文件的具體目錄位置
    輸出到單個文件

如果不想分割結(jié)果文件需了,也可以通過替換toFolder(Paths.get("src/docs/asciidoc/generated")toFile(Paths.get("src/docs/asciidoc/generated/all"))跳昼,將轉(zhuǎn)換結(jié)果輸出到一個單一的文件中,這樣可以最終生成html的也是單一的肋乍。
在執(zhí)行了上面的測試用例之后鹅颊,我們就能在當前項目的目錄下獲得如下內(nèi)容:

image.png

可以看到,這種方式在運行之后就生成出了5個不同的靜態(tài)文件墓造。

  1. 通過Maven插件來生成

除了通過上面編寫Java代碼來生成的方式之外堪伍,swagger2markup還提供了對應的Maven插件來使用。對于上面的生成方式觅闽,完全可以通過在pom.xml中增加如下插件來完成靜態(tài)內(nèi)容的生成帝雇。

<plugin>
                <groupId>org.asciidoctor</groupId>
                <artifactId>asciidoctor-maven-plugin</artifactId>
                <version>1.5.6</version>
                <configuration>
                    <sourceDirectory>./docs/asciidoc/generated</sourceDirectory>
                    <outputDirectory>./docs/asciidoc/html</outputDirectory>
                    <headerFooter>true</headerFooter>
                    <doctype>book</doctype>
                    <backend>html</backend>
                    <sourceHighlighter>coderay</sourceHighlighter>
                    <attributes>
                        <!--菜單欄在左邊-->
                        <toc>left</toc>
                        <!--多標題排列-->
                        <toclevels>3</toclevels>
                        <!--自動打數(shù)字序號-->
                        <sectnums>true</sectnums>
                    </attributes>
                </configuration>
            </plugin>
配置執(zhí)行命令

通過上面的配置,執(zhí)行該插件的asciidoctor:process-asciidoc命令之后蛉拙,就能在docs/asciidoc/html目錄下生成最終可用的靜態(tài)部署HTML了尸闸。在完成生成之后,可以直接通過瀏覽器來看查看刘离,你就能看到類似下圖的靜態(tài)部署結(jié)果:

image.png

騰訊云+社區(qū)邀請

我的博客即將搬運同步至騰訊云+社區(qū)室叉,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1eyx9f4wbftcp

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硫惕,隨后出現(xiàn)的幾起案子茧痕,更是在濱河造成了極大的恐慌,老刑警劉巖恼除,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踪旷,死亡現(xiàn)場離奇詭異曼氛,居然都是意外死亡,警方通過查閱死者的電腦和手機令野,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門舀患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人气破,你說我怎么就攤上這事聊浅。” “怎么了现使?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵低匙,是天一觀的道長。 經(jīng)常有香客問我碳锈,道長顽冶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任售碳,我火速辦了婚禮强重,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贸人。我一直安慰自己间景,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布艺智。 她就那樣靜靜地躺著拱燃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪力惯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天召嘶,我揣著相機與錄音父晶,去河邊找鬼。 笑死弄跌,一個胖子當著我的面吹牛甲喝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铛只,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼埠胖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淳玩?” 一聲冷哼從身側(cè)響起直撤,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜕着,沒想到半個月后谋竖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體红柱,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年蓖乘,在試婚紗的時候發(fā)現(xiàn)自己被綠了锤悄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘉抒,死狀恐怖零聚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情些侍,我是刑警寧澤隶症,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站娩梨,受9級特大地震影響沿腰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狈定,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一颂龙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纽什,春花似錦措嵌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烈和。三九已至,卻和暖如春浪规,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背探孝。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工笋婿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顿颅。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓缸濒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粱腻。 傳聞我的和親對象是個殘疾皇子庇配,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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