【ApiDoc】自動化導(dǎo)出接口文檔之HTML/Markdown/PDF實踐

歡迎關(guān)注微信公眾號:全棧工廠

本文主要參考

最近項目開始接口測試氧骤,需要提供一份最新最全的接口文檔,也許你覺得沒什么几于,但是如果我要求每個接口文檔都要像下面的例子一樣:

接口標題

接口描述

POST /request_api_url

請求頭參數(shù)列表:

名稱 類型 必填 說明
header_param_1 string yes 參數(shù)描述
header_param_2 string yes 參數(shù)描述

請求體參數(shù)列表:

名稱 類型 必填 說明
body_param_1 string yes 參數(shù)描述
body_param_2 string yes 參數(shù)描述
默認值:test
body_param_3 int no 參數(shù)描述
默認值:1
可選值: 0,1,

請求示例:

curl -i -X POST -d body_param_1=value1&body_param_2=value2 http://localhost/request_api_url

請求參數(shù)示例1:

{
    "body_param_1":"value1",
}

請求參數(shù)示例2:

{
    "body_param_1":"value1",
    "body_param_2":"value2",
    "body_param_3":1
}

請求成功示例1:

{
    "status": "success",
    "data": {
      "key1": "value1",
    }
}

請求成功示例2:

{
    "status": "success",
    "data": {
      "key1": "value1",
      "key2": "value2",
      "key3": "key3",
      "update_time": 1509431405,
      "create_time": 1509431405
    }
}

請求錯誤示例1:

{
    "status": "failure",
    "error_message": {
        "error_code":403
          ...
    }
}

請求錯誤示例2:

{
    "status": "failure",
     "error_message": {
        "error_code":404
          ...
    }
}

怎么樣蕊苗?小伙子,你有沒有感受到一絲絲的繁瑣沿彭?
如果我還告訴你我不僅需要PDF版的朽砰,我還需要Markdown版的,還可能需要HTML版的喉刘,怎么樣瞧柔?小伙子,你有沒有感受到一絲絲的絕望睦裳?
如果我還告訴你現(xiàn)在需要整理的接口有160多個...


最開始考慮肩扛人挑的方式梳理文檔的我在整理了半天之后我就瘋了造锅,代碼注釋的不完整,需要人工核對實現(xiàn)邏輯廉邑,接口請求結(jié)果需要一個個跑請求來填寫哥蔚,這些本來在接口編寫或者接口修改時就可以完成的內(nèi)容,現(xiàn)在累加起來就像一個巨無霸工程蛛蒙。更可怕的是即使這次接口文檔梳理完成了糙箍,等到若干個月之后,接口文檔需要更新宇驾,然而你還需要這樣一個個去核對哪些接口做了修改倍靡,更新文檔!?紊帷塌西!


面對這么痛的痛點,幸運的是筝尾,早就有大神為我們鋪出了一條陽關(guān)大道——apidoc

一捡需、apidoc簡介

apidoc是一個可以直接由源代碼中滴注釋生成api接口文檔的自動化文檔導(dǎo)出工具,并且支持目前流行的幾乎所有格式的注釋風格筹淫。該工具的源代碼目前托管于github(https://github.com/apidoc/apidoc)站辉,通過對該工具的使用,寡人目前總結(jié)的優(yōu)點主要有以下幾點:

① 文檔生成依賴注釋损姜,對源代碼幾乎沒有侵入饰剥;
② 規(guī)范化的注釋利于協(xié)同開發(fā),并且如果接口有變動摧阅,更新注釋便等同于更新了接口文檔汰蓉;
③ 不同版本接口文檔對比功能,方便對同一接口的不同版本進行比較查看棒卷。

說的這幾點其實最主要的還是注釋和文檔的同步更新顾孽,相信幾乎所有的開發(fā)者在寫完代碼后寧愿去更新注釋也不愿意去更新接口文檔祝钢。

二、自動化導(dǎo)出HTML接口文檔

通過使用apidoc工具便可以直接導(dǎo)出HTML接口文檔:

2.1 安裝apidoc

apidoc通過npm安裝若厚,所以您需要先安裝nodejs或者npm工具拦英,安裝完npm之后運行一下命令:

 npm install apidoc -g

您也可以在docker環(huán)境中安裝,此處不再贅述测秸。

2.2 代碼注釋遵循apidoc風格

既然要使用apidoc導(dǎo)出文檔疤估,那自然要讓apidoc認識你的注釋,apidoc注釋規(guī)范可以參考官方文檔(http://apidocjs.com)乞封,寡人也對官方的文檔做了簡要翻譯注釋(【ApiDoc】官方文檔(翻譯))做裙,供大家參考。

2.3 運行apidoc 導(dǎo)出HTML文檔

運行apidoc前需要先添加一個配置文件apidoc.json,該配置文件的內(nèi)容官方文檔里有介紹肃晚,大致如下:

{
  "name": "接口名稱",
  "version": "0.1.0",
  "description": "Api接口文檔",
  "url" : "http://qa.api.test.com/",
  "sampleUrl": "http://qa.api.test.com/",
  "template": {
    "withCompare": true,
    "withGenerator": true
  }
}

apidoc主要命令參數(shù)如下:

參數(shù) 描述
-f --file-filters 指定讀取文件的文件名過濾正則表達式(可指定多個)
例如: apidoc -f ".*\\.js$" -f ".*\\.ts$" 意為只讀取后綴名為js和ts的文件
默認值:.clj .cls .coffee .cpp .cs .dart .erl .exs?
.go .groovy .ino? .java .js .jsx .kt .litcoffee lua .p .php? .pl .pm .py .rb .scala .ts .vue
-e --exclude-filters 指定不讀取的文件名過濾正則表達式(可指定多個)
例如:apidoc -e ".*\\.js$" 意為不讀取后綴名為js的文件
默認:''
-i, --input 指定讀取源文件的目錄
例如:apidoc -i myapp/ 意為讀取myapp/目錄下面的源文件
默認值:./
-o, --output 指定輸出文檔的目錄
例如:apidoc -o doc/ 意為輸出文檔到doc目錄下
默認值:./doc/
-t, --template 指定輸出的模板文件
例如:apidoc -t mytemplate/
默認:path.join(__dirname, '../template/')(使用默認模板)
-c, --config 指定包含配置文件(apidoc.json)的目錄
例如:apidoc -c config/
默認:./
-p, --private 輸出的文檔中是否包含私有api
例如:apidoc -p true
默認:false
-v, --verbose 是否輸出詳細的debug信息
例如:apidoc -v true
默認:false
-h, --help 查看幫助文檔

通常情況下只需要指定源文件目錄锚贱、輸出文件目錄、配置文件目錄即可:

  apidoc -i source_dir/ -c config_dir/ -o output_dir/

運行完成后关串,您便可以在output_dir目錄下看到生成的html文件拧廊,點擊index.html即可在瀏覽器查看接口文檔。

三晋修、自動化導(dǎo)出Markdown接口文檔

面對如此強大的apidoc工具吧碾,我一度以為可以通過修改輸出模板文件來導(dǎo)出markdown文件,但通過查看當前版本(0.17.6)源代碼墓卦,我發(fā)現(xiàn)apidoc在生成輸出文件的時候僅僅是將模板文件拷貝到輸出目錄下倦春,并沒有像我想象的那樣根據(jù)模板文件生成輸出文檔,apidoc所做的工作主要是通過讀取源代碼中的注釋落剪,解析生成一個api_data.json文件睁本,這個文件里面包含了所有從注釋中提取粗來的接口數(shù)據(jù)。所以接下來的工作便是根據(jù)這個api_data.json文件生成markdown文件即可忠怖。
幸運的是呢堰,GitHub上已經(jīng)有好心人為我們做了這個工作。

3.1 安裝apidoc-markdown

apidoc-markdown是一個根據(jù)apidoc輸出文件直接生成markdown文件的工具凡泣。首先我們需要安裝該工具:

npm install  apidoc-markdown -g

3.2 導(dǎo)出Markdown文檔

apidoc-markdown主要命令參數(shù)如下:

參數(shù) 描述
-p, --path 指定apidoc生成的文檔目錄
-o, --output 指定輸出的markdown文件路徑(包含文件名)
例如:apidoc-markdown -o output_dir/markdown_name.md
-t, --template 指定生成markdown文件的模板文件(EJS模板文件)
默認:使用工具自帶的模板文件

通常情況下枉疼,我們需要允許下面這樣的命令:

apidoc-markdown -p apidoc_dir -o doc/doc_markdown.md

這樣我們便完成了接口文檔從HTML到Markdown文件的轉(zhuǎn)化。

3.3 添加自定義的markdown模板文件

由于該工具自帶的markdown模板并不是非常完美鞋拟,對于api_data.json文件中的字段并不是完全解析骂维,所以你需要自己分析api_data.json中的數(shù)據(jù)接口,完善markdown模板文件贺纲。該文件是EJS模板文件航闺,語法比較簡單,有需要的童鞋可以自行Google哮笆,另外您也可以下載該工具的源代碼来颤,修改里面自帶的模板文件也比較方便。

四稠肘、自動化導(dǎo)出PDF接口文檔

既然markdown文件都有了福铅,那么導(dǎo)出PDF文件不是更簡單了。在這里项阴,寡人推薦一個灰常好用的markdown離線編輯工具——Typora
Typora是一款離線輕量Markdown編輯器滑黔,該工具非常簡潔、易用(目前處于測試階段环揽,可免費使用)略荡。具體如何簡單、易用在這里就不做贅述了歉胶,大家可以自行下載體驗汛兜。其實最主要原因還是因為這個編輯器的導(dǎo)出PDF文件功能,該編輯器導(dǎo)出的pdf文件會根據(jù)markdown文件的目錄生成pdf的導(dǎo)航目錄通今,這一點對于文檔文件來說忒重要了V嗝!辫塌!

五漏策、總結(jié)

好了,至此任務(wù)基本上完成了臼氨,以后麻麻再也不用擔心我寫接口文檔啦掺喻!


注:文中如有任何錯誤,請各位批評指正储矩!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末感耙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椰苟,更是在濱河造成了極大的恐慌抑月,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舆蝴,死亡現(xiàn)場離奇詭異谦絮,居然都是意外死亡,警方通過查閱死者的電腦和手機洁仗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門层皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赠潦,你說我怎么就攤上這事叫胖。” “怎么了她奥?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵瓮增,是天一觀的道長怎棱。 經(jīng)常有香客問我,道長绷跑,這世上最難降的妖魔是什么拳恋? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮砸捏,結(jié)果婚禮上谬运,老公的妹妹穿的比我還像新娘。我一直安慰自己垦藏,他們只是感情好梆暖,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掂骏,像睡著了一般轰驳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芭挽,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天滑废,我揣著相機與錄音,去河邊找鬼袜爪。 笑死蠕趁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辛馆。 我是一名探鬼主播俺陋,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昙篙!你這毒婦竟也來了腊状?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤苔可,失蹤者是張志新(化名)和其女友劉穎缴挖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焚辅,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡映屋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了同蜻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谬泌。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡基茵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枯怖,到底是詐尸還是另有隱情症昏,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響咸包,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杖虾,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一诉儒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亏掀,春花似錦、人聲如沸泛释。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怜校。三九已至间影,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茄茁,已是汗流浹背魂贬。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裙顽,地道東北人付燥。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像愈犹,于是被迫代替她去往敵國和親键科。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理漩怎,服務(wù)發(fā)現(xiàn)勋颖,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 昨天我們說到了安·蘭德對于自由和幸福的看法,除了自由和幸福叁执,安·蘭德的哲學里還有一個關(guān)鍵詞就是愛茄厘。這聽起來有點讓人...
    伯凡時間閱讀 351評論 0 1
  • 每年到了春節(jié),必然有一個返鄉(xiāng)潮徒恋,這是中國人口的大遷徙蚕断,一些地方慢慢空了,一些地方慢慢滿了入挣,很多人都在路上亿乳。 因為各...
    如是秋山閱讀 351評論 0 4
  • 此等工作情況如何破壁? 以為大家相互往同一個方向去,誰知人家已儼然一個管理掌握了所有的東西葛假,被打發(fā)了吃力不討好的清...
    YY天黑不回家閱讀 447評論 0 51