解析API Blueprint文檔并自動(dòng)化生成代碼(可定制模板)

最近大前端概念越來(lái)越火捕犬,本著學(xué)習(xí)的目的,寫了一個(gè)自動(dòng)化解析API Blueprint文檔的模板代碼生成工具砖茸,為了提高開發(fā)效率隘擎,本工具使用nodejs開發(fā),vue.js作為可定制化的輸出模板的輔助凉夯,本項(xiàng)目娛樂為主货葬,希望能給大家提供一些思路,擴(kuò)展下技術(shù)棧

源碼地址

GitHub:https://github.com/free46000/APIBlueprintToGenerateCode.git

下載與使用

普通方式

  • 下載[APIBlueprintToGenerateCode]源碼劲够,需要注意源碼使用ECMAScript6的語(yǔ)法
  • 在源碼目錄下執(zhí)行npm install命令震桶,安裝依賴包,本過(guò)程中在會(huì)有一些安裝 .NET Framework 2.0的相關(guān)錯(cuò)誤提示征绎,可以忽略
  • 安裝完成后在源碼目錄下執(zhí)行node bin/www命令蹲姐,啟動(dòng)服務(wù)器
  • 在瀏覽器地址欄中輸入http://localhost:3000即可訪問頁(yè)面,頁(yè)面中可以自定義Api文檔Git地址人柿,如果Api文檔沒有上傳Git柴墩,也可以把Api文檔拷貝到頁(yè)面輸入框指定的路徑下,可以自動(dòng)識(shí)別顷扩,點(diǎn)擊生成按鈕拐邪,解析結(jié)果會(huì)展現(xiàn)在當(dāng)前頁(yè)面中

注意:源碼中是過(guò)濾了以.apib結(jié)尾的文件列表,此處如果有需要可以聯(lián)系作者隘截,修改為傳遞參數(shù)控制

docker容器方式

  • 由于代碼定制化比較強(qiáng)扎阶,這里我會(huì)把DockerFile貼出來(lái),大家有需要可以修改代碼后自行build

效果截圖

entities效果

entities

apiset效果

apiset

主要流程

  • 通過(guò)nodegit拉取API Blueprint文檔到本地(當(dāng)然這一步視大家的具體情況婶芭,也可以直接把Api文檔拷貝到頁(yè)面輸入框指定的路徑下)
  • 通過(guò)drafter官方解析庫(kù)解析API Blueprint文檔东臀,drafter解析后的結(jié)構(gòu)并不是太友好,這里需要寫一些適配代碼
  • 解析Response中的json數(shù)據(jù)結(jié)構(gòu)
  • 借助vue.js生成html的模板代碼
  • 整合到docker容器

源碼解析

API文檔git下載

API Blueprint是一套基于markdown的API描述語(yǔ)言規(guī)范犀农,基于此規(guī)范可以方便的生成mock接口惰赋,這樣前端,移動(dòng)端呵哨,后端可以并行開發(fā)赁濒,好處多多,希望大家也多使用孟害。

  • nodegit地址
  • 使用Git.Clone克隆API Blueprint文檔
  • 使用Repository.fetchAllfetch到最新文檔
  • 根據(jù)具體情況使用Repository.mergeBranches合并分支拒炎,源碼中是把develop分支代碼合并到master中,代碼邏輯在git_handler.js

解析API Blueprint

  • drafter地址
  • 使用nodefs模塊挨务,讀取文件列表击你,源碼中是過(guò)濾了下以.apib結(jié)尾的文件列表玉组,此處如果有需要可以聯(lián)系作者,修改為傳遞參數(shù)控制
  • 使用drafter.parse解析API Blueprint文檔丁侄,解析后的格式為
{
  "element": "parseResult",
  "content": [
    {
      "element": "category",
      "meta": {
        "classes": [
          "api"
        ],
        "title": ""
      },
      "content": [
         {
          "element": "category",
          "meta": {
            "classes": [
              "resourceGroup"
            ],
            "title": ""
          },
          "content": [

        ... ...
    
}
  • 可以發(fā)現(xiàn)上面的結(jié)構(gòu)嵌套比較深惯雳,后面使用的時(shí)候會(huì)比較麻煩,這里把有效數(shù)據(jù)拿到鸿摇,并為每個(gè)HttpTransaction生成一個(gè)實(shí)體(JsonObject)石景,處理邏輯在apib_parser.js中,解析之后的格式為:
[{
    href:'',//請(qǐng)求路徑:/get/task/{taskid}
    hrefName:'',//路徑對(duì)應(yīng)name:GetTask
    title:'',//請(qǐng)求標(biāo)題:獲取任務(wù)
    hrefVariables:[ //路徑對(duì)應(yīng)Variable"content": "taskid"
        {"element": "String","content": "post_id"}
    ],
    subTitle:'',//請(qǐng)求標(biāo)題:通過(guò)id獲取任務(wù)
    tip:'',//相關(guān)提示
    method:'',//請(qǐng)求類型 POST or GET ...
    response:{},//響應(yīng)實(shí)體{'taskId':1,'taskName':'任務(wù)'}
    param:{}//請(qǐng)求參數(shù)taskId
}]
  • 我們可以很方便的從上面拿到請(qǐng)求響應(yīng)的數(shù)據(jù)户辱,正常情況下會(huì)是json格式的鸵钝,例如:{'taskId':1,'taskName':'任務(wù)'},
  • 以上幾步是在nodejs的服務(wù)端完成,通信采用ajax庐镐,取得數(shù)據(jù)后我們把HttpTransaction中請(qǐng)求響應(yīng)的json數(shù)據(jù)轉(zhuǎn)換為對(duì)生成實(shí)體類友好的結(jié)構(gòu)恩商,處理邏輯主要在to_bean.js中,處理之后的格式為:
[{
    className: className,//實(shí)體類中名字
    fields: [{ //實(shí)體類中含有的屬性列表
        name: taskName, 
        type: String
    }],
    importTypes: [{//需要import的類型列表
        'java.util.List'
    }] 
}]

模板生成

  • 經(jīng)過(guò)以上的準(zhǔn)備必逆,得到了我們需要的數(shù)據(jù)怠堪,然后借助vue.js渲染html代碼模板,代碼都在bean_template.html中,目前寫了java實(shí)體類和Api接口類的模板名眉,可自行擴(kuò)展其他模板粟矿。下面貼出一段實(shí)體類的模板代碼:
<div id="bean" v-if="beans">
    <div :id="bean.className" style="background: cornsilk">
        <p>package com.bean.response;</p>

        <p v-for="imp in bean.importTypes">import {{imp}};</p>

        <p>public class {{ bean.className }} {</p>
        <div v-for="field in bean.fields">
            private {{field.type}} {{field.name}};
        </div>
        <div v-for="field in bean.fields">
            public void set{{ firstToUpperCase(field.name) }}({{field.type}} {{ field.name }}) {<br>
            this.{{field.name}} = {{field.name}};<br>
            }<br><br>
            public {{field.type}} get{{ firstToUpperCase(field.name) }}() {<br>
            return this.{{field.name}};<br>
            }<br><br>
        </div>
        <p>}</p>
    </div>
</div>

docker整合

  • 最后整合在docker容器中,docker可以讓應(yīng)用程序布署在軟件容器下的工作可以自動(dòng)化進(jìn)行损拢,不過(guò)開發(fā)接觸的偏少一些陌粹,有興趣的可以了解一下,下面我貼出我的DockerFile代碼:
# 選擇image
FROM node:latest

# 創(chuàng)建源碼目錄并設(shè)置當(dāng)前工作路徑
RUN mkdir -p /usr/app
WORKDIR /usr/app

# 拷貝源碼到目標(biāo)路徑
COPY ./bin /usr/app/bin
COPY ./public /usr/app/public
COPY ./routes /usr/app/routes
COPY ./views /usr/app/views
COPY ./app.js /usr/app/app.js
COPY ./package.json /usr/app/package.json

RUN npm install .

CMD [ "node", "/usr/app/bin/www" ]

總結(jié)

目前代碼只是在html中進(jìn)行輸出福压,本來(lái)計(jì)劃下一步在指定目錄生成類文件掏秩,但是有兩個(gè)問題沒有辦法很好解決,所以就暫時(shí)放棄了荆姆,一是實(shí)體類的命名蒙幻;還有實(shí)體類去重,例如:任務(wù)列表和詳情接口同樣都會(huì)有任務(wù)的實(shí)體胆筒,自動(dòng)化生成代碼會(huì)生成兩個(gè)類邮破。

本項(xiàng)目主要是為了熟悉NodeJS vue等前端開發(fā)知識(shí),娛樂為主仆救,主要寫寫實(shí)現(xiàn)的思路抒和,雖然寫的比較簡(jiǎn)陋,但是里面用了一些比較好的開源組件API Blueprint nodegit docker 等彤蔽,非常值得學(xué)習(xí)构诚,歡迎留言交流,希望可以幫助到大家铆惑。

最后請(qǐng)?jiān)试S打個(gè)小廣告:作者開源了一個(gè)一個(gè)優(yōu)雅的實(shí)現(xiàn)多類型的RecyclerView類庫(kù) 支持DataBinding Form表單錄入范嘱,Github地址:https://github.com/free46000/MultiItem

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市员魏,隨后出現(xiàn)的幾起案子丑蛤,更是在濱河造成了極大的恐慌,老刑警劉巖撕阎,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件受裹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡虏束,警方通過(guò)查閱死者的電腦和手機(jī)棉饶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镇匀,“玉大人照藻,你說(shuō)我怎么就攤上這事『骨郑” “怎么了幸缕?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晰韵。 經(jīng)常有香客問我发乔,道長(zhǎng),這世上最難降的妖魔是什么雪猪? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任栏尚,我火速辦了婚禮,結(jié)果婚禮上只恨,老公的妹妹穿的比我還像新娘译仗。我一直安慰自己,他們只是感情好坤次,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布古劲。 她就那樣靜靜地躺著,像睡著了一般缰猴。 火紅的嫁衣襯著肌膚如雪产艾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天滑绒,我揣著相機(jī)與錄音闷堡,去河邊找鬼。 笑死疑故,一個(gè)胖子當(dāng)著我的面吹牛杠览,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纵势,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踱阿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼管钳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起软舌,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤才漆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后佛点,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醇滥,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年超营,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸳玩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡演闭,死狀恐怖不跟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情船响,我是刑警寧澤躬拢,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站见间,受9級(jí)特大地震影響聊闯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜米诉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一菱蔬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧史侣,春花似錦拴泌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至税朴,卻和暖如春回季,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背正林。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工泡一, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人觅廓。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓鼻忠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杈绸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帖蔓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理矮瘟,服務(wù)發(fā)現(xiàn),斷路器塑娇,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,374評(píng)論 7 249
  • 朦朦朧朧中又回到你依稀的笑容 把我從夢(mèng)中驚醒 伸手一摸 塌那一頭 就好像觸摸不到靈魂一樣只單影行 啊板辽,愛人 要是陪...
    喬玉兒閱讀 259評(píng)論 0 7
  • 茶者奇瘦,南方之嘉木,源起中國(guó)劲弦,可飲可食耳标,可濃可淡,可入藥邑跪,可賓可主次坡,可有可無(wú),可裹袈裟敬頌画畅,可伴市井談資砸琅,因此無(wú)分別...
    桃子torri閱讀 695評(píng)論 0 2