解析API Blueprint文档并自动化生成代码(可定制模板)

最近大前端概念越来越火,本着学习的目的,写了一个自动化解析API Blueprint文档的模板代码生成工具,为了提高开发效率,本工具使用nodejs开发,vue.js作为可定制化的输出模板的辅助,本项目娱乐为主,希望能给大家提供一些思路,扩展下技术栈

源码地址

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

下载与使用

普通方式

  • 下载[APIBlueprintToGenerateCode]源码,需要注意源码使用ECMAScript6的语法
  • 在源码目录下执行npm install命令,安装依赖包,本过程中在会有一些安装 .NET Framework 2.0的相关错误提示,可以忽略
  • 安装完成后在源码目录下执行node bin/www命令,启动服务器
  • 在浏览器地址栏中输入http://localhost:3000即可访问页面,页面中可以自定义Api文档Git地址,如果Api文档没有上传Git,也可以把Api文档拷贝到页面输入框指定的路径下,可以自动识别,点击生成按钮,解析结果会展现在当前页面中

注意:源码中是过滤了以.apib结尾的文件列表,此处如果有需要可以联系作者,修改为传递参数控制

docker容器方式

  • 由于代码定制化比较强,这里我会把DockerFile贴出来,大家有需要可以修改代码后自行build

效果截图

entities效果

entities

apiset效果

apiset

主要流程

  • 通过nodegit拉取API Blueprint文档到本地(当然这一步视大家的具体情况,也可以直接把Api文档拷贝到页面输入框指定的路径下)
  • 通过drafter官方解析库解析API Blueprint文档,drafter解析后的结构并不是太友好,这里需要写一些适配代码
  • 解析Response中的json数据结构
  • 借助vue.js生成html的模板代码
  • 整合到docker容器

源码解析

API文档git下载

API Blueprint是一套基于markdown的API描述语言规范,基于此规范可以方便的生成mock接口,这样前端,移动端,后端可以并行开发,好处多多,希望大家也多使用。

  • nodegit地址
  • 使用Git.Clone克隆API Blueprint文档
  • 使用Repository.fetchAllfetch到最新文档
  • 根据具体情况使用Repository.mergeBranches合并分支,源码中是把develop分支代码合并到master中,代码逻辑在git_handler.js

解析API Blueprint

  • drafter地址
  • 使用nodefs模块,读取文件列表,源码中是过滤了下以.apib结尾的文件列表,此处如果有需要可以联系作者,修改为传递参数控制
  • 使用drafter.parse解析API Blueprint文档,解析后的格式为
{
  "element": "parseResult",
  "content": [
    {
      "element": "category",
      "meta": {
        "classes": [
          "api"
        ],
        "title": ""
      },
      "content": [
         {
          "element": "category",
          "meta": {
            "classes": [
              "resourceGroup"
            ],
            "title": ""
          },
          "content": [

        ... ...
    
}
  • 可以发现上面的结构嵌套比较深,后面使用的时候会比较麻烦,这里把有效数据拿到,并为每个HttpTransaction生成一个实体(JsonObject),处理逻辑在apib_parser.js中,解析之后的格式为:
[{
    href:'',//请求路径:/get/task/{taskid}
    hrefName:'',//路径对应name:GetTask
    title:'',//请求标题:获取任务
    hrefVariables:[ //路径对应Variable"content": "taskid"
        {"element": "String","content": "post_id"}
    ],
    subTitle:'',//请求标题:通过id获取任务
    tip:'',//相关提示
    method:'',//请求类型 POST or GET ...
    response:{},//响应实体{'taskId':1,'taskName':'任务'}
    param:{}//请求参数taskId
}]
  • 我们可以很方便的从上面拿到请求响应的数据,正常情况下会是json格式的,例如:{'taskId':1,'taskName':'任务'},
  • 以上几步是在nodejs的服务端完成,通信采用ajax,取得数据后我们把HttpTransaction中请求响应的json数据转换为对生成实体类友好的结构,处理逻辑主要在to_bean.js中,处理之后的格式为:
[{
    className: className,//实体类中名字
    fields: [{ //实体类中含有的属性列表
        name: taskName, 
        type: String
    }],
    importTypes: [{//需要import的类型列表
        'java.util.List'
    }] 
}]

模板生成

  • 经过以上的准备,得到了我们需要的数据,然后借助vue.js渲染html代码模板,代码都在bean_template.html中,目前写了java实体类和Api接口类的模板,可自行扩展其他模板。下面贴出一段实体类的模板代码:
<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可以让应用程序布署在软件容器下的工作可以自动化进行,不过开发接触的偏少一些,有兴趣的可以了解一下,下面我贴出我的DockerFile代码:
# 选择image
FROM node:latest

# 创建源码目录并设置当前工作路径
RUN mkdir -p /usr/app
WORKDIR /usr/app

# 拷贝源码到目标路径
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" ]

总结

目前代码只是在html中进行输出,本来计划下一步在指定目录生成类文件,但是有两个问题没有办法很好解决,所以就暂时放弃了,一是实体类的命名;还有实体类去重,例如:任务列表和详情接口同样都会有任务的实体,自动化生成代码会生成两个类。

本项目主要是为了熟悉NodeJS vue等前端开发知识,娱乐为主,主要写写实现的思路,虽然写的比较简陋,但是里面用了一些比较好的开源组件API Blueprint nodegit docker 等,非常值得学习,欢迎留言交流,希望可以帮助到大家。

最后请允许打个小广告:作者开源了一个一个优雅的实现多类型的RecyclerView类库 支持DataBinding Form表单录入,Github地址:https://github.com/free46000/MultiItem

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,042评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,210评论 7 249
  • 朦朦胧胧中又回到你依稀的笑容 把我从梦中惊醒 伸手一摸 塌那一头 就好像触摸不到灵魂一样只单影行 啊,爱人 要是陪...
    乔玉儿阅读 256评论 0 7
  • 茶者,南方之嘉木,源起中国,可饮可食,可浓可淡,可入药,可宾可主,可有可无,可裹袈裟敬颂,可伴市井谈资,因此无分别...
    慕龙tequila阅读 666评论 0 2