前端根据swagger,生成javascript映射接口文件
创建文件 generator.js 写入以下代码
const fs = require('fs') const path = require('path') const http = require('http') function mkdirsSync(dirname) { if (fs.existsSync(dirname)) { return true } else { if (mkdirsSync(path.dirname(dirname))) { fs.mkdirSync(dirname) return true } } } function getPath(pathUrl) { return path.resolve(__dirname, pathUrl) } function generateTemplate(arr) { return `import { ${arr.join(', ')} } from '@/utils/request'\n` } function generateFunc(name, summary, type = 'post') { const arr = name.slice(1).split('/') const fun = arr[arr.length - 1] return ` // ${summary || ''} export function ${fun}(data, cb, errHandle) { return ${type}('${name}', data, cb, errHandle) }\n` } function httpgetJson(url) { return new Promise((resolve, reject) => { http.get(url, (res) => { const { statusCode } = res const contentType = res.headers['content-type'] let error if (statusCode !== 200) { error = new Error('请求失败。\n' + `状态码: ${statusCode}`) } else if (!/^application\/json/.test(contentType)) { error = new Error('无效的 content-type.\n' + `期望 application/json 但获取的是 ${contentType}`) } if (error) { console.error(error.message) // 消耗响应数据以释放内存 res.resume() return } res.setEncoding('utf8') let rawData = '' res.on('data', (chunk) => { rawData += chunk }) res.on('end', () => { try { const parsedData = JSON.parse(rawData) resolve(parsedData) } catch (e) { reject(`错误: ${e.message}`) } }) }).on('error', (e) => { reject(`错误: ${e.message}`) }) }) } const srcFolder = './src' const url = 'http://localhost:7170/swagger/v1/swagger.json' async function main() { console.log('获取远程json文件中...') const { paths } = await httpgetJson(url) console.log('获取成功正在生成api文件') const obj = {} for (const name in paths) { const path = paths[name] let folder = '' if (path.post) { const tag = path.post.tags[0] if (!tag) continue const urlArray = name.slice(1).split('/') if (name.slice(1).split('/').length === 3) { folder = urlArray[1] } else { if (name.slice(1).split('/')[0] !== tag) continue } if (obj[path.post.tags[0]]) { obj[path.post.tags[0]].push({ summary: path.post.summary, tag, name, type: 'post', folder }) } else { obj[path.post.tags[0]] = [{ summary: path.post.summary, tag, name, type: 'post', folder }] } } else if (path.get) { const tag = path.get.tags[0] console.log(tag) if (!tag) continue const urlArray = name.slice(1).split('/') if (name.slice(1).split('/').length === 3) { folder = urlArray[1] } else { if (name.slice(1).split('/')[0] !== tag) continue } if (obj[path.get.tags[0]]) { obj[path.get.tags[0]].push({ summary: path.get.summary, tag, name, type: 'get', folder }) } else { obj[path.get.tags[0]] = [{ summary: path.get.summary, tag, name, type: 'get', folder }] } } } for (const tagName in obj) { let jsString = '' const requestTypes = [] let folder = '' for (const item of obj[tagName]) { const requestType = requestTypes.filter(o => o === item.type) if (requestType.length === 0) requestTypes.push(item.type) jsString += generateFunc(item.name, item.summary, item.type) folder = item.folder } jsString = generateTemplate(requestTypes) + jsString mkdirsSync(getPath(`${srcFolder}/api/${folder}`)) // console.log(jsString) fs.writeFileSync(getPath(`${srcFolder}/api/${folder}/${tagName}.js`), jsString) } console.log('生成完毕') }
main()
http://localhost:7170/swagger/v1/swagger.json 换成实际的swagger文件地址
执行命令:node generator.js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)