mirror of
https://github.com/YMFE/yapi.git
synced 2025-04-12 15:10:23 +08:00
fix: 修复postman导入没有分类的问题
This commit is contained in:
parent
147a87024f
commit
b4d65ad8ac
202
CHANGELOG.md
202
CHANGELOG.md
@ -1,8 +1,12 @@
|
||||
### v1.3.8
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 点击编辑 tab 可能导致运行功能异常
|
||||
* 修复postman导入没有分类的问题
|
||||
|
||||
#### Feature
|
||||
|
||||
* pre-script 增加 method 字段数据
|
||||
|
||||
### v1.3.7
|
||||
@ -13,15 +17,15 @@
|
||||
* 增加测试集合列表的拖动功能
|
||||
* 接口列表中增加“开放接口”状态
|
||||
* 接口列表树形组件支持拖动
|
||||
* json-schema 导出 table表单
|
||||
* json-schema 导出 table 表单
|
||||
* 接口列表和测试集树形组件支持拖动
|
||||
* 图标从阿里cdn替换到本地
|
||||
* 图标从阿里 cdn 替换到本地
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 修复高级 Mock 服务端报错
|
||||
* 修复测试集合table拖动频繁请求的问题
|
||||
* 修复swagger 数据导入部分bug
|
||||
* 修复测试集合 table 拖动频繁请求的问题
|
||||
* 修复 swagger 数据导入部分 bug
|
||||
|
||||
### v1.3.6
|
||||
|
||||
@ -31,28 +35,30 @@
|
||||
* 增加导出公共接口功能
|
||||
* 增加复制接口路径按钮
|
||||
* 增加项目 token 功能,可通过 token 访问开放接口
|
||||
* antd升级到v3
|
||||
* antd 升级到 v3
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 修复接口动态提示有误
|
||||
* 修复变量表达式无法反向展示的问题
|
||||
|
||||
### v1.3.5
|
||||
|
||||
#### Feature
|
||||
|
||||
* 增加项目成员批量导入
|
||||
* 数据导入同步,数据导入支持swagger 3.0
|
||||
* swagger 数据导入支持 2xx 的httpcode
|
||||
* 数据导入同步,数据导入支持 swagger 3.0
|
||||
* swagger 数据导入支持 2xx 的 httpcode
|
||||
* 新增系统信息页面
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 修复离开接口编辑页面的 confirm 框有时候会触发两次 & confirm 的 ‘X’ 按钮无效
|
||||
* 修复添加集合后测试集合list不更新问题
|
||||
* 修复添加集合后测试集合 list 不更新问题
|
||||
* 测试集合点击对应接口侧边栏不切换
|
||||
* 测试集合处,点击删除不成功
|
||||
* 修改编辑接口后,再回到测试集合处数据不更新问题
|
||||
* 修复mongodb帐号密码配置错误时引发的错误
|
||||
* 修复 mongodb 帐号密码配置错误时引发的错误
|
||||
* 修复删除分组后侧边数据没有更新问题
|
||||
|
||||
### v1.3.4
|
||||
@ -60,159 +66,168 @@
|
||||
#### Feature
|
||||
|
||||
* 帮助文档首页增加部署公司
|
||||
* 进入project页面加入loading
|
||||
* 接口list页table中加入分页
|
||||
* 进入 project 页面加入 loading
|
||||
* 接口 list 页 table 中加入分页
|
||||
* 项目添加者自动变成项目组长
|
||||
|
||||
#### Bug Fixed
|
||||
* 修复无权限进入项目bug
|
||||
* 修复复制接口,query 等参数无法复制bug
|
||||
* 修复导出html markdown参数丢失问题
|
||||
* 修复项目设置 pre-script 无法显示问题
|
||||
|
||||
* 修复无权限进入项目 bug
|
||||
* 修复复制接口,query 等参数无法复制 bug
|
||||
* 修复导出 html markdown 参数丢失问题
|
||||
* 修复项目设置 pre-script 无法显示问题
|
||||
|
||||
### v1.3.3
|
||||
|
||||
#### Feature
|
||||
|
||||
* 邮件功能中: 1)接口信息改动增加通知对应项目所有的成员;2)默认开启接口改动邮件提醒;3) 增加邮件内容的jsondiff信息
|
||||
* 邮件功能中: 1)接口信息改动增加通知对应项目所有的成员;2)默认开启接口改动邮件提醒;3) 增加邮件内容的 jsondiff 信息
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 优化接口运行页面插件提醒
|
||||
* 完善 log 记录不到的问题
|
||||
* 修复接口内容改动不发送邮件问题
|
||||
* 修复部分swagger数据导入丢失问题
|
||||
|
||||
* 修复部分 swagger 数据导入丢失问题
|
||||
|
||||
### v1.3.2
|
||||
|
||||
#### Feature
|
||||
* 分组中新增接口自定义字段,便于用户在项目中添加额外字段数据
|
||||
* 导入数据时新增导入loading显示
|
||||
|
||||
* 分组中新增接口自定义字段,便于用户在项目中添加额外字段数据
|
||||
* 导入数据时新增导入 loading 显示
|
||||
|
||||
### v1.3.1
|
||||
|
||||
|
||||
#### Bug Fixed
|
||||
1. 修复接口状态和req_params参数无法更新问题
|
||||
2. 修复搜索测试集合不展开问题
|
||||
3. 修复测试过程中全局header不存在的问题
|
||||
|
||||
|
||||
1. 修复接口状态和 req_params 参数无法更新问题
|
||||
2. 修复搜索测试集合不展开问题
|
||||
3. 修复测试过程中全局 header 不存在的问题
|
||||
|
||||
### v1.3.0
|
||||
|
||||
#### Feature
|
||||
|
||||
* yapi 默认集成 ldap 登录方式
|
||||
* yapi 做一个 sso 登录插件,基于现有的 qsso 改造成大多数公司可用的
|
||||
* 环境设置支持全局 header
|
||||
* 接口运行页面选择环境增加管理环境的弹层
|
||||
* 接口运行支持加工运行前后的 request 和 response ,主要是处理加密的接口或各种 token 参数问题
|
||||
* 自动化测试除提供自定义脚本外,还提供可视化表单形式验证一些数据,例如 statusCode、bodyContent
|
||||
* 自动化测试除提供自定义脚本外,还提供可视化表单形式验证一些数据,例如 statusCode、bodyContent
|
||||
* 增加查看接口详细改动
|
||||
* 支持接口运行页面 body 全屏编辑
|
||||
* 数据导出到 html 支持了分类
|
||||
|
||||
#### Bug Fixed
|
||||
* 修复了高级 Mock 无法获取到真实客户端 ip
|
||||
|
||||
* 修复了高级 Mock 无法获取到真实客户端 ip
|
||||
|
||||
### v1.2.9
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
1. Api 路径兼容 postman {varible}
|
||||
2. View Response Height 问题
|
||||
1. Api 路径兼容 postman {varible}
|
||||
2. View Response Height 问题
|
||||
|
||||
#### Feature
|
||||
1. 新增克隆测试集功能
|
||||
2. 高级 Mock 期望支持 mockjs
|
||||
3. pathname 允许只有一个 /
|
||||
|
||||
1. 新增克隆测试集功能
|
||||
2. 高级 Mock 期望支持 mockjs
|
||||
3. pathname 允许只有一个 /
|
||||
|
||||
### v1.2.8
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
1. 修复接口运行 json 格式问题
|
||||
2. 修复测试报告显示问题
|
||||
3. 增加了接口数量统计
|
||||
4. 多参数表达式改用双大括号{{}}
|
||||
5. 修复了环境变量设置样式问题
|
||||
1. 修复接口运行 json 格式问题
|
||||
2. 修复测试报告显示问题
|
||||
3. 增加了接口数量统计
|
||||
4. 多参数表达式改用双大括号{{}}
|
||||
5. 修复了环境变量设置样式问题
|
||||
|
||||
#### Feature
|
||||
1. 测试用例增加自定义测试脚本功能
|
||||
|
||||
1. 测试用例增加自定义测试脚本功能
|
||||
|
||||
### v1.2.7
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
1. 修复接口运行功能,当 httpCode 不是200时,导致无法获取 response body 问题
|
||||
2. 修复路径参数无法删除优化测试集 table 页面,当文字超出一定长度会换行的问题
|
||||
3. 优化测试集断言错误提示
|
||||
4. 优化接口编辑 save 按钮样式
|
||||
1. 修复接口运行功能,当 httpCode 不是 200 时,导致无法获取 response body 问题
|
||||
2. 修复路径参数无法删除优化测试集 table 页面,当文字超出一定长度会换行的问题
|
||||
3. 优化测试集断言错误提示
|
||||
4. 优化接口编辑 save 按钮样式
|
||||
|
||||
#### Feature
|
||||
1. 测试集断言增加 log 方法,用于输出调试日志
|
||||
2. 可视化动态参数表达式生成器,生成类似表达式 {@email | concat: pass | md5 | substr: 1,10}
|
||||
|
||||
1. 测试集断言增加 log 方法,用于输出调试日志
|
||||
2. 可视化动态参数表达式生成器,生成类似表达式 {@email | concat: pass | md5 | substr: 1,10}
|
||||
|
||||
### v1.2.6
|
||||
|
||||
#### Bug Fixed
|
||||
1. 修复路径参数无法删除
|
||||
|
||||
1. 修复路径参数无法删除
|
||||
|
||||
#### Feature
|
||||
1. 参数值支持多个动态参数,类似 str{@email}str{$.55.body.id}
|
||||
2. 参数值支持管道表达式,例如 {@email | concat: pass | md5 | substr: 1,10}
|
||||
3. 接口编辑参数**可拖动排序**
|
||||
4. 修复路径参数无法删除问题
|
||||
|
||||
1. 参数值支持多个动态参数,类似 str{@email}str{$.55.body.id}
|
||||
2. 参数值支持管道表达式,例如 {@email | concat: pass | md5 | substr: 1,10}
|
||||
3. 接口编辑参数**可拖动排序**
|
||||
4. 修复路径参数无法删除问题
|
||||
|
||||
### v1.2.5
|
||||
#### Bug Fixed
|
||||
1. 成员如果第一次添加成员时选择组长,接着再添加下一个成员,如果select是默认的开发者,这时候会出现与上次select相同的值
|
||||
2. 如果添加了一个不存在的成员还是会提示添加成功,并且发送的数据是原来发送成功的数据,这里需要重置初始值并在未找到对应用户名时对未找到的人名应该提示用户不存在
|
||||
3. Fix 接口集自动化测试 header 没有解析 mock 和 变量参数
|
||||
4. 在接口开发阶段,多个人并行改接口,如果最后一个人改之前没刷新页面,会把之前的人修改过的都冲掉了
|
||||
5. 修复cross-request,response header字段重复bug
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
1. 成员如果第一次添加成员时选择组长,接着再添加下一个成员,如果 select 是默认的开发者,这时候会出现与上次 select 相同的值
|
||||
2. 如果添加了一个不存在的成员还是会提示添加成功,并且发送的数据是原来发送成功的数据,这里需要重置初始值并在未找到对应用户名时对未找到的人名应该提示用户不存在
|
||||
3. Fix 接口集自动化测试 header 没有解析 mock 和 变量参数
|
||||
4. 在接口开发阶段,多个人并行改接口,如果最后一个人改之前没刷新页面,会把之前的人修改过的都冲掉了
|
||||
5. 修复 cross-request,response header 字段重复 bug
|
||||
|
||||
#### Feature
|
||||
1. 优化了分组添加,编辑交互
|
||||
2. cross-request 计算了接口请求时间
|
||||
3. 新增接口文档导出 html, markdown 功能
|
||||
|
||||
1. 优化了分组添加,编辑交互
|
||||
2. cross-request 计算了接口请求时间
|
||||
3. 新增接口文档导出 html, markdown 功能
|
||||
|
||||
### v1.2.4
|
||||
|
||||
#### Bug Fixed
|
||||
1. 期望值输入时候换成字符串,导致diff时因类型不一致匹配不上
|
||||
2. swagger 导入数据时出现的 id 未定义bug
|
||||
3. fix: kerberos dependencies 导致安装依赖需要编译的问题
|
||||
4. 修复了高级 mock 期望过滤参数为空时匹配不到的 bug
|
||||
5. 将接口编辑页的保存按钮变成一直在窗口底部
|
||||
6. 修改需求文档中项目操作处修改项目中的接口测试a链接指向的网页错误问题
|
||||
7. 添加接口时重名,现在提示“已存在”,并在提示信息中告知用户删改接口的位置
|
||||
8. 已添加的成员,再次添加会提示“添加成功”,优化提示为已成功添加人数,和已存在人数
|
||||
9. 添加分组和修改分组时有个权限问题没有更新,切换列表才更新,该问题已解决
|
||||
|
||||
1. 期望值输入时候换成字符串,导致 diff 时因类型不一致匹配不上
|
||||
2. swagger 导入数据时出现的 id 未定义 bug
|
||||
3. fix: kerberos dependencies 导致安装依赖需要编译的问题
|
||||
4. 修复了高级 mock 期望过滤参数为空时匹配不到的 bug
|
||||
5. 将接口编辑页的保存按钮变成一直在窗口底部
|
||||
6. 修改需求文档中项目操作处修改项目中的接口测试 a 链接指向的网页错误问题
|
||||
7. 添加接口时重名,现在提示“已存在”,并在提示信息中告知用户删改接口的位置
|
||||
8. 已添加的成员,再次添加会提示“添加成功”,优化提示为已成功添加人数,和已存在人数
|
||||
9. 添加分组和修改分组时有个权限问题没有更新,切换列表才更新,该问题已解决
|
||||
10. 解决修改和删除公共分类名称处,在添加接口时,选择接口分类名称没有修改的问题
|
||||
|
||||
#### Feature
|
||||
1. 接口 path 支持了后面带 /
|
||||
2. cross-request支持了不安全的 header,如 cookie, referer...
|
||||
3. 支持了 path 带特殊符号"!"
|
||||
4. 请求参数可改变顺序,目前只是对必需和非必需进行自动排序
|
||||
5. 用户头像上传问题,txt改成jpg格式上传,用户头像显示空白,然后无法再次上传头像。无法再次上传的问题已经解决
|
||||
6. 解决用户头像改变但是header处图片不变的问题。问题描述:用户上传头像成功但是Header处的头像没有改变,并且点击其他页面后再回到个人中心里面的头像又变成没有重新上传时的图片,必须重新刷新才可以将Header处的图片更新
|
||||
7. 解决导入 postman 接口动态路由无法导入的 Bug
|
||||
|
||||
1. 接口 path 支持了后面带 /
|
||||
2. cross-request 支持了不安全的 header,如 cookie, referer...
|
||||
3. 支持了 path 带特殊符号"!"
|
||||
4. 请求参数可改变顺序,目前只是对必需和非必需进行自动排序
|
||||
5. 用户头像上传问题,txt 改成 jpg 格式上传,用户头像显示空白,然后无法再次上传头像。无法再次上传的问题已经解决
|
||||
6. 解决用户头像改变但是 header 处图片不变的问题。问题描述:用户上传头像成功但是 Header 处的头像没有改变,并且点击其他页面后再回到个人中心里面的头像又变成没有重新上传时的图片,必须重新刷新才可以将 Header 处的图片更新
|
||||
7. 解决导入 postman 接口动态路由无法导入的 Bug
|
||||
|
||||
### v1.2.0
|
||||
|
||||
#### Features
|
||||
|
||||
* 增加高级 Mock 期望功能,根据设置的请求过滤规则,返回期望数据。
|
||||
* 增加统计功能
|
||||
* 增加自动化测试功能,写断言脚本,实现精准测试
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 修复了切换集合环境的 Bug
|
||||
* 修复了 mockServer 拿不到 Post 请求 Body
|
||||
* 修复了接口调试 pathParams 无法使用 mock 参数和变量参数
|
||||
@ -220,12 +235,14 @@
|
||||
### v1.1.2
|
||||
|
||||
#### Features
|
||||
|
||||
* 接口运行增加了 query 和 body 的 enable 选项,可选择是否请求该字段
|
||||
* Mock 支持了时间戳占位符 @timestamp
|
||||
* 接口集运行页面可选择环境
|
||||
* 接口集动态参数格式由原来的 $.{key}.{jsonPath} 改为 $.{key}.{body|params}.{jsonPath}
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 修复了接口集运行功能会忽略环境配置的 domain 路径
|
||||
* 修复了动态路由 mock 返回结果不是该接口定义返回数据
|
||||
* 修复了日志链接错误问题
|
||||
@ -237,34 +254,39 @@
|
||||
* 修复了接口集页面导入接口会导致 reqBody 清空 bug
|
||||
|
||||
### v1.1.1
|
||||
|
||||
#### Features
|
||||
|
||||
* 添加插件开发文档
|
||||
* 接口和测试用例可拖动
|
||||
* 优化动态提示
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* 修复接口状态将接口方法重置为 get
|
||||
* 环境配置域名带 path 无效
|
||||
* 修复Swagger数据导入分类 bug
|
||||
* 修复 Swagger 数据导入分类 bug
|
||||
* MockServer 支持 CORS 跨域
|
||||
* 优化JSON-SCHEMA转化为JSON的逻辑,由原来随机转换不被required字段改为转换全部字段
|
||||
* 修复了项目成员无法看到该项目的Bug
|
||||
* 修复了无法查看公共项目的Bug
|
||||
* 优化 JSON-SCHEMA 转化为 JSON 的逻辑,由原来随机转换不被 required 字段改为转换全部字段
|
||||
* 修复了项目成员无法看到该项目的 Bug
|
||||
* 修复了无法查看公共项目的 Bug
|
||||
* 优化了部分样式和交互
|
||||
|
||||
### v1.1.0
|
||||
|
||||
#### Features
|
||||
|
||||
* 新增个人空间功能,拥有这个分组的全部权限,可以在这个分组里探索 YApi 的功能
|
||||
* 新增分组动态功能
|
||||
* 优化接口运行页面交互
|
||||
* CrossRequest 扩展支持 https
|
||||
* 增加了 Swagger 数据导入功能
|
||||
|
||||
|
||||
### v1.0.2
|
||||
|
||||
#### Features
|
||||
* 网站改为100%布局
|
||||
|
||||
* 网站改为 100%布局
|
||||
* 优化搜索的提示
|
||||
* 支持了 queryPath
|
||||
* 接口浏览页面和编辑页面交互
|
||||
@ -277,16 +299,16 @@
|
||||
|
||||
#### Fix Bug
|
||||
|
||||
* 修改接口名字后,需要刷新页面左边的侧边栏才会显示正确的名字
|
||||
* mockJson 出现 null,mock 出现格式不对问题
|
||||
* 没有权限的分组不可选
|
||||
* 项目列表图标设计大小优化下
|
||||
* 关注的项目不显眼
|
||||
* 添加接口之后,再次选择添加接口,会保留上次填写的信息
|
||||
* 用例名称太长,导致无法使用删除功能
|
||||
* 别人知道项目id虽然没有权限,但能看到里面所有内容
|
||||
* 修改接口名字后,需要刷新页面左边的侧边栏才会显示正确的名字
|
||||
* mockJson 出现 null,mock 出现格式不对问题
|
||||
* 没有权限的分组不可选
|
||||
* 项目列表图标设计大小优化下
|
||||
* 关注的项目不显眼
|
||||
* 添加接口之后,再次选择添加接口,会保留上次填写的信息
|
||||
* 用例名称太长,导致无法使用删除功能
|
||||
* 别人知道项目 id 虽然没有权限,但能看到里面所有内容
|
||||
|
||||
#### Features
|
||||
|
||||
* 接口备注集成了富文本编辑
|
||||
* 支持 har 协议的接口数据导入
|
||||
* 接口备注集成了富文本编辑
|
||||
* 支持 har 协议的接口数据导入
|
||||
|
@ -12,8 +12,8 @@ import mockEditor from "client/components/AceEditor/mockEditor";
|
||||
import axios from "axios";
|
||||
|
||||
const jSchema = require("json-schema-editor-visual");
|
||||
const ResBodySchema = jSchema();
|
||||
const ReqBodySchema = jSchema();
|
||||
const ResBodySchema = jSchema({lang: 'zh_CN'});
|
||||
const ReqBodySchema = jSchema({lang: 'zh_CN'});
|
||||
|
||||
require("codemirror/lib/codemirror.css"); // codemirror
|
||||
require("tui-editor/dist/tui-editor.css"); // editor ui
|
||||
@ -550,16 +550,12 @@ class InterfaceEditForm extends Component {
|
||||
}
|
||||
|
||||
|
||||
console.log(res_body)
|
||||
|
||||
try {
|
||||
req_body_other = this.state.req_body_other ? JSON.stringify(json5.parse(this.state.req_body_other), null, 2) : '';
|
||||
} catch (e) {
|
||||
req_body_other = ''
|
||||
}
|
||||
|
||||
// console.log("req_body_other",req_body_other);
|
||||
|
||||
const queryTpl = (data, index) => {
|
||||
return (
|
||||
<Row key={index} className="interface-edit-item-content">
|
||||
@ -1061,10 +1057,11 @@ class InterfaceEditForm extends Component {
|
||||
</Tooltip>
|
||||
“全局编辑”或 “退出全屏” 请按{" "}F9</span>
|
||||
) : <ReqBodySchema onChange={(text)=>{
|
||||
this.setState({
|
||||
req_body_other: text
|
||||
})
|
||||
}} data={req_body_other} />}
|
||||
this.setState({
|
||||
req_body_other: text
|
||||
})
|
||||
}} data={req_body_other} />}
|
||||
|
||||
|
||||
</Col>
|
||||
|
||||
@ -1156,6 +1153,7 @@ class InterfaceEditForm extends Component {
|
||||
res_body: text
|
||||
})
|
||||
}} data={res_body} />}
|
||||
|
||||
|
||||
<div
|
||||
id="res_body_json"
|
||||
|
@ -1,12 +1,15 @@
|
||||
|
||||
import {message} from 'antd'
|
||||
import URL from 'url';
|
||||
import _ from 'underscore';
|
||||
const GenerateSchema = require('generate-schema/src/schemas/json.js');
|
||||
import { json_parse } from '../../common/utils.js'
|
||||
|
||||
|
||||
function postman(importDataModule){
|
||||
|
||||
var folders = [];
|
||||
|
||||
function parseUrl(url){
|
||||
return URL.parse(url)
|
||||
}
|
||||
@ -71,7 +74,7 @@ function postman(importDataModule){
|
||||
path = decodeURIComponent(path);
|
||||
if(!path) return '';
|
||||
|
||||
path = path.replace(/{{\w*}}/g, '');
|
||||
path = path.replace(/\{\{.*\}\}/g, '');
|
||||
|
||||
if(path[0] != "/"){
|
||||
path = "/" + path;
|
||||
@ -83,16 +86,30 @@ function postman(importDataModule){
|
||||
try{
|
||||
res = JSON.parse(res);
|
||||
let interData = res.requests;
|
||||
let interfaceData = {apis: []};
|
||||
interData = checkInterRepeat.bind(this)(interData);
|
||||
let interfaceData = {apis: [], cats: []};
|
||||
interData = checkInterRepeat.bind(this)(interData);
|
||||
|
||||
if (res.folders && Array.isArray(res.folders)) {
|
||||
res.folders.forEach(tag => {
|
||||
interfaceData.cats.push({
|
||||
name: tag.name,
|
||||
desc: tag.description
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if(_.find(res.folders,item => item.collectionId === res.id)){
|
||||
folders = res.folders
|
||||
}
|
||||
|
||||
|
||||
if(interData && interData.length){
|
||||
for(let item in interData){
|
||||
let data = importPostman.bind(this)(interData[item]);
|
||||
interfaceData.apis.push(data);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(interfaceData)
|
||||
|
||||
return interfaceData;
|
||||
|
||||
}catch(e){
|
||||
@ -101,8 +118,8 @@ function postman(importDataModule){
|
||||
|
||||
}
|
||||
|
||||
function importPostman(data,key){
|
||||
console.log('data', data);
|
||||
function importPostman(data, key){
|
||||
|
||||
let reflect = {//数据字段映射关系
|
||||
title: "name",
|
||||
path: "url",
|
||||
@ -117,7 +134,7 @@ function postman(importDataModule){
|
||||
res_body: "text",
|
||||
res_body_type: "language"
|
||||
};
|
||||
let allKey = ["title","path","method","desc","req_query","req_headers","req_body_type","req_body_form","req_body_other","res"];
|
||||
let allKey = ["title","path","catname","method","desc","req_query","req_headers","req_body_type","req_body_form","req_body_other","res"];
|
||||
key = key || allKey;
|
||||
let res = {};
|
||||
for(let item in key){
|
||||
@ -172,6 +189,11 @@ function postman(importDataModule){
|
||||
}else{
|
||||
res[item] = data[reflect[item]];
|
||||
}
|
||||
} else if(item === 'catname'){
|
||||
let found = folders.filter(item => {
|
||||
return item.id === data.folder
|
||||
})
|
||||
res[item] = found && Array.isArray(found) && found.length>0 ? found[0].name : null;
|
||||
}
|
||||
else if(item === 'res') {
|
||||
let response = handleResponses(data['responses'])
|
||||
|
@ -1,83 +1,86 @@
|
||||
|
||||
import { message } from 'antd'
|
||||
import _ from 'underscore'
|
||||
const swagger = require('swagger-client')
|
||||
import { message } from 'antd';
|
||||
import _ from 'underscore';
|
||||
const swagger = require('swagger-client');
|
||||
|
||||
function improtData(importDataModule) {
|
||||
var SwaggerData, isOAS3;
|
||||
function handlePath(path) {
|
||||
if(path === '/') return path;
|
||||
if (path.charAt(0) != "/") {
|
||||
path = "/" + path;
|
||||
if (path === '/') return path;
|
||||
if (path.charAt(0) != '/') {
|
||||
path = '/' + path;
|
||||
}
|
||||
if (path.charAt(path.length - 1) === "/") {
|
||||
if (path.charAt(path.length - 1) === '/') {
|
||||
path = path.substr(0, path.length - 1);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
function openapi2swagger(data) {
|
||||
|
||||
data.swagger = '2.0';
|
||||
_.each(data.paths, (apis) => {
|
||||
_.each(apis, (api) => {
|
||||
_.each(api.responses, (res) => {
|
||||
if (res.content && res.content['application/json'] && typeof res.content['application/json'] === 'object') {
|
||||
Object.assign(res, res.content['application/json'])
|
||||
_.each(data.paths, apis => {
|
||||
_.each(apis, api => {
|
||||
_.each(api.responses, res => {
|
||||
if (
|
||||
res.content &&
|
||||
res.content['application/json'] &&
|
||||
typeof res.content['application/json'] === 'object'
|
||||
) {
|
||||
Object.assign(res, res.content['application/json']);
|
||||
delete res.content;
|
||||
}
|
||||
})
|
||||
});
|
||||
if (api.requestBody) {
|
||||
if (!api.parameters) api.parameters = [];
|
||||
let body = {
|
||||
type: 'object',
|
||||
name: 'body',
|
||||
in: 'body'
|
||||
};
|
||||
try {
|
||||
body.schema = api.requestBody.content['application/json'].schema;
|
||||
} catch (e) {
|
||||
body.schema = {};
|
||||
}
|
||||
try{
|
||||
body.schema = api.requestBody.content['application/json'].schema
|
||||
}catch(e){
|
||||
body.schema = {}
|
||||
}
|
||||
|
||||
|
||||
api.parameters.push(body);
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
async function handleSwaggerData(res){
|
||||
async function handleSwaggerData(res) {
|
||||
|
||||
return await new Promise(resolve=>{
|
||||
return await new Promise(resolve => {
|
||||
let data = swagger({
|
||||
spec: res
|
||||
})
|
||||
data.then(res=>{
|
||||
console.log(res.spec)
|
||||
resolve(res.spec)
|
||||
})
|
||||
})
|
||||
});
|
||||
|
||||
data.then(res => {
|
||||
resolve(res.spec);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function run(res) {
|
||||
try {
|
||||
let interfaceData = { apis: [], cats: [] };
|
||||
res = JSON.parse(res);
|
||||
isOAS3 = res.openapi && res.openapi === '3.0.0'
|
||||
isOAS3 = res.openapi && res.openapi === '3.0.0';
|
||||
if (isOAS3) {
|
||||
res = openapi2swagger(res)
|
||||
res = openapi2swagger(res);
|
||||
}
|
||||
res = await handleSwaggerData(res);
|
||||
res = await handleSwaggerData(res);
|
||||
SwaggerData = res;
|
||||
|
||||
if (res.tags && Array.isArray(res.tags)) {
|
||||
res.tags.forEach(tag => {
|
||||
interfaceData.cats.push({
|
||||
name: tag.name,
|
||||
desc: tag.description
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
_.each(res.paths, (apis, path) => {
|
||||
@ -86,13 +89,13 @@ function improtData(importDataModule) {
|
||||
api.method = method;
|
||||
let data = null;
|
||||
try {
|
||||
data = handleSwagger(api)
|
||||
if(data.catname){
|
||||
if(!_.find(interfaceData.cats, (item)=> item.name === data.catname)){
|
||||
data = handleSwagger(api);
|
||||
if (data.catname) {
|
||||
if (!_.find(interfaceData.cats, item => item.name === data.catname)) {
|
||||
interfaceData.cats.push({
|
||||
name: data.catname,
|
||||
desc: data.catname
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
@ -100,22 +103,19 @@ function improtData(importDataModule) {
|
||||
}
|
||||
if (data) {
|
||||
interfaceData.apis.push(data);
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
})
|
||||
console.log(interfaceData)
|
||||
});
|
||||
});
|
||||
|
||||
return interfaceData;
|
||||
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
message.error("数据格式有误");
|
||||
message.error('数据格式有误');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function handleSwagger(data) {
|
||||
|
||||
let api = {};
|
||||
//处理基本信息
|
||||
api.method = data.method.toUpperCase();
|
||||
@ -137,7 +137,10 @@ function improtData(importDataModule) {
|
||||
}
|
||||
|
||||
if (data.consumes && Array.isArray(data.consumes)) {
|
||||
if (data.consumes.indexOf('application/x-www-form-urlencoded') > -1 || data.consumes.indexOf('multipart/form-data') > -1) {
|
||||
if (
|
||||
data.consumes.indexOf('application/x-www-form-urlencoded') > -1 ||
|
||||
data.consumes.indexOf('multipart/form-data') > -1
|
||||
) {
|
||||
api.req_body_type = 'form';
|
||||
} else if (data.consumes.indexOf('application/json') > -1) {
|
||||
api.req_body_type = 'json';
|
||||
@ -155,15 +158,14 @@ function improtData(importDataModule) {
|
||||
api.res_body_type = 'raw';
|
||||
}
|
||||
//处理参数
|
||||
|
||||
function simpleJsonPathParse(key, json) {
|
||||
if (!key || typeof key !== 'string' || key.indexOf('#/') !== 0 || key.length <= 2) {
|
||||
return null;
|
||||
}
|
||||
let keys = key.substr(2).split("/");
|
||||
let keys = key.substr(2).split('/');
|
||||
keys = keys.filter(item => {
|
||||
return item;
|
||||
})
|
||||
});
|
||||
for (let i = 0, l = keys.length; i < l; i++) {
|
||||
try {
|
||||
json = json[keys[i]];
|
||||
@ -178,25 +180,35 @@ function improtData(importDataModule) {
|
||||
if (data.parameters && Array.isArray(data.parameters)) {
|
||||
data.parameters.forEach(param => {
|
||||
if (param && typeof param === 'object' && param.$ref) {
|
||||
param = simpleJsonPathParse(param.$ref, { parameters: SwaggerData.parameters })
|
||||
param = simpleJsonPathParse(param.$ref, { parameters: SwaggerData.parameters });
|
||||
}
|
||||
let defaultParam = {
|
||||
name: param.name,
|
||||
desc: param.description,
|
||||
required: param.required ? "1" : "0"
|
||||
}
|
||||
required: param.required ? '1' : '0'
|
||||
};
|
||||
|
||||
switch (param.in) {
|
||||
case 'path': api.req_params.push(defaultParam); break;
|
||||
case 'query': api.req_query.push(defaultParam); break;
|
||||
case 'body': handleBodyPamras(param.schema, api); break;
|
||||
case 'formData': defaultParam.type = param.type === 'file' ? 'file' : 'text'; api.req_body_form.push(defaultParam); break;
|
||||
case 'header': api.req_headers.push(defaultParam); break;
|
||||
case 'path':
|
||||
api.req_params.push(defaultParam);
|
||||
break;
|
||||
case 'query':
|
||||
api.req_query.push(defaultParam);
|
||||
break;
|
||||
case 'body':
|
||||
handleBodyPamras(param.schema, api);
|
||||
break;
|
||||
case 'formData':
|
||||
defaultParam.type = param.type === 'file' ? 'file' : 'text';
|
||||
api.req_body_form.push(defaultParam);
|
||||
break;
|
||||
case 'header':
|
||||
api.req_headers.push(defaultParam);
|
||||
break;
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return api;
|
||||
}
|
||||
|
||||
@ -209,7 +221,7 @@ function improtData(importDataModule) {
|
||||
}
|
||||
|
||||
function handleBodyPamras(data, api) {
|
||||
api.req_body_other = JSON.stringify(data,null,2);
|
||||
api.req_body_other = JSON.stringify(data, null, 2);
|
||||
if (isJson(api.req_body_other)) {
|
||||
api.req_body_type = 'json';
|
||||
api.req_body_is_json_schema = true;
|
||||
@ -223,15 +235,14 @@ function improtData(importDataModule) {
|
||||
}
|
||||
let codes = Object.keys(api);
|
||||
let curCode;
|
||||
if(codes.length > 0){
|
||||
if(codes.indexOf(200) > -1){
|
||||
if (codes.length > 0) {
|
||||
if (codes.indexOf(200) > -1) {
|
||||
curCode = 200;
|
||||
}else curCode = codes[0]
|
||||
} else curCode = codes[0];
|
||||
let res = api[curCode];
|
||||
if (res && typeof res === 'object') {
|
||||
|
||||
if (res.schema) {
|
||||
res_body = JSON.stringify(res.schema,null,2);
|
||||
res_body = JSON.stringify(res.schema, null, 2);
|
||||
} else if (res.description) {
|
||||
res_body = res.description;
|
||||
}
|
||||
@ -240,8 +251,8 @@ function improtData(importDataModule) {
|
||||
} else {
|
||||
res_body = '';
|
||||
}
|
||||
}else{
|
||||
res_body = ''
|
||||
} else {
|
||||
res_body = '';
|
||||
}
|
||||
return res_body;
|
||||
}
|
||||
@ -251,7 +262,6 @@ function improtData(importDataModule) {
|
||||
// // if (typeof data !== 'object') {
|
||||
// // return data;
|
||||
// // }
|
||||
|
||||
|
||||
// // try {
|
||||
// // // data.definitions = SwaggerData.definitions;
|
||||
@ -274,12 +284,9 @@ function improtData(importDataModule) {
|
||||
name: 'Swagger',
|
||||
run: run,
|
||||
desc: 'Swagger数据导入( 支持 v2.0+ )'
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
module.exports = function () {
|
||||
|
||||
this.bindHook('import_data', improtData)
|
||||
}
|
||||
module.exports = function() {
|
||||
this.bindHook('import_data', improtData);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user