Swagger API文檔生成離線HTML文檔

引言

在學(xué)會(huì)了使用 Swagger 之后,我們能夠輕松地為 SpringBoot 項(xiàng)目自動(dòng)構(gòu)建API文檔海渊。但是绵疲,我們構(gòu)建的文檔需要在項(xiàng)目中整合 swagger-ui 或使用單獨(dú)部署的 swagger-ui 和 /v2/api-docs 返回的配置信息才能展現(xiàn)出 API 文檔。這里我們將在使用 Swagger 的基礎(chǔ)上臣疑,介紹一種生成靜態(tài) API 文檔的方法盔憨,以便于構(gòu)建更輕量部署和使用的 API 文檔。

Swagger2Markup

Swagger2Markup 是 Github 上的開源項(xiàng)目讯沈。Swagger2Markup 可以將 Swagger 生成的文檔轉(zhuǎn)化成流行的格式以便于獨(dú)立部署和使用般渡,如:Markdown、Confluence芙盘、AsciiDoc驯用。

GitHub:https://github.com/Swagger2Markup/swagger2markup

生成AsciiDoc(Java代碼生成)

一、編輯 pom.xml 增加需要使用的相關(guān)依賴儒老、倉(cāng)庫(kù)和插件
<dependency>
    <groupId>io.github.swagger2markup</groupId>
    <artifactId>swagger2markup</artifactId>
    <version>1.3.1</version>
</dependency>
<!-- 引用以下兩個(gè)包是防止生成過程中出現(xiàn)找不到類的異常 -->
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-core</artifactId>
    <version>1.5.16</version>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-models</artifactId>
    <version>1.5.16</version>
</dependency>
<!--測(cè)試依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</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>
<build>
    <plugins>
        <plugin>
            <groupId>org.asciidoctor</groupId>
            <artifactId>asciidoctor-maven-plugin</artifactId>
            <version>1.5.6</version>
            <configuration>
                <!-- asciidoc文件目錄 -->
                <sourceDirectory>./docs</sourceDirectory>
                <!-- 生成HTML的路徑 -->
                <outputDirectory>./html</outputDirectory>
                <backend>html</backend>
                <sourceHighlighter>coderay</sourceHighlighter>
                <attributes>
                    <!-- 導(dǎo)航欄在左側(cè) -->
                    <toc>left</toc>
                    <!-- 顯示菜單層級(jí)數(shù) -->
                    <toclevels>3</toclevels>
                    <!-- 自動(dòng)打數(shù)字序號(hào) -->
                    <sectnums>ture</sectnums>
                </attributes>
            </configuration>
        </plugin>
    </plugins>
</build>
二蝴乔、編寫一個(gè)單元測(cè)試用例來生成執(zhí)行生成文檔的代碼
import java.net.URL;
import java.nio.file.Paths;
import org.junit.Test;
import io.github.swagger2markup.GroupBy;
import io.github.swagger2markup.Language;
import io.github.swagger2markup.Swagger2MarkupConfig;
import io.github.swagger2markup.Swagger2MarkupConverter;
import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder;
import io.github.swagger2markup.markup.builder.MarkupLanguage;

public class Swagger2MarkupTest {
    /**
     * 生成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://localhost:8080/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:8080/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:8080/v2/api-docs")).withConfig(config).build()
                .toFolder(Paths.get("./docs/confluence/generated"));
    }

    /**
     * 生成AsciiDocs格式文檔,并匯總成一個(gè)文件
     * 
     * @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:8080/v2/api-docs")).withConfig(config).build()
                .toFile(Paths.get("./docs/asciidoc/generated/all"));
    }

    /**
     * 生成Markdown格式文檔,并匯總成一個(gè)文件
     * 
     * @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:8080/v2/api-docs")).withConfig(config).build()
                .toFile(Paths.get("./docs/markdown/generated/all"));
    }
}
以上代碼說明了幾個(gè)關(guān)鍵內(nèi)容:

MarkupLanguage.ASCIIDOC:指定了要輸出的最終格式。除了ASCIIDOC之外驮樊,還有MARKDOWN和CONFLUENCE_MARKUP薇正。
from(new URL("http://localhost:8080/v2/api-docs"):指定了生成靜態(tài)文檔的數(shù)據(jù)源配置片酝。
toFolder(Paths.get("src/docs/asciidoc/generated"):指定了最終生成文件的目錄位置。如果不想分割結(jié)果文件挖腰,也可以改成toFile(Paths.get("src/docs/asciidoc/generated/all"))雕沿,將轉(zhuǎn)換結(jié)果輸出到一個(gè)文件中,這樣最終也只會(huì)生成一個(gè)html文件猴仑。
在執(zhí)行測(cè)試用例之后【執(zhí)行前需要運(yùn)行主服務(wù)审轮,也就是接口服務(wù)】,就能在當(dāng)前項(xiàng)目的目錄下獲得如下內(nèi)容:

生成離線文檔的代碼

三辽俗、通過cmd進(jìn)入到項(xiàng)目的pom.xml目錄下執(zhí)行以下命令
mvn asciidoctor:process-asciidoc

命令執(zhí)行完成即生成HTML文檔疾渣,文件結(jié)構(gòu)如下:


離線HTML文檔
四、文檔樣例如下:



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崖飘,一起剝皮案震驚了整個(gè)濱河市榴捡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朱浴,老刑警劉巖吊圾,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異翰蠢,居然都是意外死亡项乒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門躏筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來板丽,“玉大人,你說我怎么就攤上這事趁尼“<睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵酥泞,是天一觀的道長(zhǎng)砚殿。 經(jīng)常有香客問我,道長(zhǎng)芝囤,這世上最難降的妖魔是什么似炎? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮悯姊,結(jié)果婚禮上羡藐,老公的妹妹穿的比我還像新娘。我一直安慰自己悯许,他們只是感情好仆嗦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著先壕,像睡著了一般瘩扼。 火紅的嫁衣襯著肌膚如雪谆甜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天集绰,我揣著相機(jī)與錄音规辱,去河邊找鬼。 笑死栽燕,一個(gè)胖子當(dāng)著我的面吹牛罕袋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纫谅,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炫贤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼溅固!你這毒婦竟也來了付秕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤侍郭,失蹤者是張志新(化名)和其女友劉穎询吴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亮元,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猛计,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爆捞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奉瘤。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煮甥,靈堂內(nèi)的尸體忽然破棺而出盗温,到底是詐尸還是另有隱情,我是刑警寧澤成肘,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布卖局,位于F島的核電站,受9級(jí)特大地震影響双霍,放射性物質(zhì)發(fā)生泄漏砚偶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一洒闸、第九天 我趴在偏房一處隱蔽的房頂上張望染坯。 院中可真熱鬧,春花似錦丘逸、人聲如沸单鹿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)羞反。三九已至布朦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昼窗,已是汗流浹背是趴。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澄惊,地道東北人唆途。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掸驱,于是被迫代替她去往敵國(guó)和親肛搬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355