通过swagger在线地址生成前端接口调用

下载模块
npm install fs
npm install path-browserify
npm install http
新建autoGen.js文件

const fs = require('fs');
const path = require('path-browserify');
let apiData = {} // 访问swagger.json的数据
const http = require('http');
 
const apiUrl = 'http://localhost:8001/swagger/v1/swagger.json' // swagger.json的地址,这里是本地的,可以替换成你的地址,有个问题是目前只能是http,https的不行,https会报一个证书错误
 
// 生成api文件的目录
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)
}
 
let dataList = [] // 真正要处理的数据
 
// 将swagger.json中的数据转换成我们需要的数据
function getDataList() {
  // 遍历apiData.paths
  for (const key in apiData.paths) {
    let routeData = {}
    routeData.api = key
    console.log('path================ ' + key)
    // 遍历apiData.paths[key]
    for (let key2 in apiData.paths[key]) {
      routeData.method = key2
      console.log('methods============== ' + key2)
 
      let tag = apiData.paths[key][key2].tags[0]
      console.log('tag=====' + tag)
      routeData.controller = tag
      let params = apiData.paths[key][key2].parameters
      if (params) {
        routeData.bodyType = 'query'
        routeData.params = apiData.paths[key][key2].parameters
      } else {
        routeData.params = []
        if (key2 === 'post' && key2 !== 'get') {
          routeData.bodyType = 'body'
          let requestBody = apiData.paths[key][key2].requestBody
          if (requestBody) {
            let content = requestBody.content
            if (content) {
              let applicationJson = content['application/json']
              if (applicationJson) {
                let schema = applicationJson.schema
                if (schema) {
                  let properties = schema.$ref
                  if (properties) {
                    let ref = properties.split('/')
                    let refName = ref[ref.length - 1]
                    let refData = apiData.components.schemas[refName]
                    if (refData) {
                      let refProperties = refData.properties
                      if (refProperties) {
                        for (let key3 in refProperties) {
                          let param = {}
                          param.name = key3
                          param.in = 'body'
                          param.required = true
                          param.schema = refProperties[key3]
                          routeData.params.push(param)
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      //遍历apiData.paths[key][key2]
      for (let key3 in apiData.paths[key][key2]) {
        // console.log('tags===========' + key3)
        if (key2 === 'get') {
          //routeData.params = apiData.paths[key][key2][key3].parameters
        }
        //routeData.other = apiData.paths[key][key2][key3]
        console.log(apiData.paths[key][key2][key3])
      }
      console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
    }
    dataList.push(routeData)
  }
  console.log(dataList)
}
 
// 获取远程swagger.json的数据
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.log('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}`)
    })
  })
}
 
// 生成http请求js文件
async function createHttpJsFile() {
  console.log('start')
  apiData = await httpGetJson(apiUrl)
  getDataList()
  console.log(dataList)
  debugger
  if (dataList.length === 0) {
    console.log('请先点击getUsers按钮')
    return
  }
  let httpJs = "import { get, post, deletedata, put, getblob} from './http'\n"
        httpJs += "const baseURL = $gloableConfig.baseURL;\n";
        httpJs += "const Token = '';\n";
        httpJs += "export default\n";
        httpJs += "{\n";
        httpJs += "baseURL,//服务器地址\n";
        httpJs += "Token,\n";
        httpJs += "}\n";
  if (dataList.length > 0) {
    const dirPath = '/src/api'
    // dataList根据controller去重
    const controllerList = []
    for (let i = 0; i < dataList.length; i++) {
      const routeData = dataList[i]
      const controller = routeData.controller
      if (controllerList.indexOf(controller) === -1) {
        controllerList.push(controller)
      }
    }
 
    // 生成http请求js文件
    for (let i = 0; i < controllerList.length; i++) {
      // 查找dataList里与 controllerList[i]相同的数据 (同一个controller的api放在一起)
      const controllerDataList = dataList.filter(item => item.controller === controllerList[i])
      console.log(controllerDataList)
 
      for (const data of controllerDataList) {
        const api = data.api // /api/user/getUserList
        // 取出api中最后一个斜杠后面的内容
        const apiName = api.substring(api.lastIndexOf('/') + 1)
        if (data.method === 'get') {
          httpJs += `export const ${apiName} = (data) =>  get(baseURL +'${data.api}', data, Token);//${data.controller}`
          httpJs += `\n`
        } else if (data.method === 'post') {
          httpJs += `export const ${apiName} = (data) =>  post(baseURL +'${data.api}', data, Token);//${data.controller}`
          httpJs += `\n`
        }
      }
      
    }
    // 生成js文件
    mkdirsSync(getPath(`..${dirPath}/`))
    fs.writeFileSync(getPath(`..${dirPath}/api.js`), httpJs)
    httpJs = ''
  }
}
createHttpJsFile();
 

package.json文件新增配置
node后面是autoGen.js文件目录

"scripts": {
    "swagger": "node src/genSwagger/autoGen.js"
  },

完成之后执行指令

npm run swagger

模板需要根据自己的使用需要修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/585212.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一种基于YOLOv8改进的高精度红外小目标检测算法 (原创自研)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;一种基于YOLOv8改进的高精度小目标检测算法&#xff0c; 在红外小目标检测任务中实现暴力涨点&#xff1b; &#x1f4a1;&#x1f4a1;&#x1f4a1;创新点&#xff1a; 1&#xff09;SPD-Conv特别是在处理低分…

安防监控/智能分析EasyCVR视频汇聚平台海康/大华/宇视摄像头国标语音GB28181语音对讲配置流程

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

Flask 3 保姆级教程(一):快速上手

一、创建项目 PyCharm 中新建项目 创建完成后会出现这么个项目 以下是代码解析&#xff1a; # 导入了 Flask 类 from flask import Flask# 创建了一个 Flask web 应用的实例&#xff0c;并将其赋值给变量 app # __name__ 是一个特殊的 Python 变量&#xff0c;它表示当前模块…

conda env list找不到anaconda/envs下的环境。Could not find conda environment。

home/用户名/anaconda3/envs中的环境与conda env list下显示的环境不一致。 想进入home/用户名/anaconda3/envs中的环境&#xff0c;显示环境不存在。 重点&#xff01;&#xff01;&#xff01;&#xff08;conda activate 环境地址 可进入环境&#xff09; 这一步最重要&…

springboot mongodb分片集群事务

前置 mongodb分片集群想要使用事务,需要对应分片没有仲裁节点 代码 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.1.0.RELEASE</version></d…

解决NetworkManager覆盖/etc/resolv.conf的问题

发布时间&#xff1a;2024.4.27 问题 /etc/resolv.conf是Linux下DNS的配置文件。 但是NetworkManager会用覆盖它&#xff0c;导致我们每次都要重新配置。 解决办法 这是官方推荐的做法。或者你可以用resolveconf工具。 $ nm-connection-editor会调起一个界面&#xff0c;…

AI视频教程下载:用ChatGPT提示词开发AI应用和GPTs

在这个课程中&#xff0c;你将深入ChatGPT的迷人世界&#xff0c;学习如何利用其能力构建创新和有影响力的工具。你将发现如何创建不仅吸引而且保持用户参与度的应用程序&#xff0c;将流量驱动到你的网站&#xff0c;并开辟新的货币化途径。 **课程的主要特点&#xff1a;** …

聊聊Mysql的两阶段提交

从图中可看出&#xff0c;事务的提交过程有两个阶段&#xff0c;就是将 redo log 的写入拆成了两个步骤&#xff1a;prepare 和 commit&#xff0c;中间再穿插写入bin log&#xff0c;具体如下&#xff1a; prepare 阶段&#xff1a;将 事务的修改写入到 redo log&#xff0c;同…

软件测试的内容包含什么内容

软件测试的内容涵盖了多个方面&#xff0c;以确保软件的质量和性能达到既定的标准。这些内容包括但不限于以下几点&#xff1a; 注册信息验证&#xff1a;对软件产品的基本信息进行验证&#xff0c;如软件名称、版本号、开发者等&#xff0c;确保这些信息的准确性和一致性。功…

图论单源最短路径——spfa

【模板】单源最短路径&#xff08;弱化版&#xff09; 本题用的spfa 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到…

React、React Router 和 Redux 常用Hooks 总结,提升您的开发效率!

Hooks 是 React 16.8 中引入的一种新特性&#xff0c;它使得函数组件可以使用 state 和其他 React 特性&#xff0c;从而大大提高了函数组件的灵活性和功能性。下面分别总结React、React Router 、Redux中常用的Hooks。 常用Hooks速记 React Hooks useState&#xff1a;用于…

单片机Debug的这几种方式,你都知道吗?

目录 一、仿真器调试 二、调试器调试 三、逻辑分析仪分析波形 四、示波器捕捉信号 五、串口调试 六、LED/蜂鸣器/显示屏调试 七、单元测试 嵌入式工程师在对单片机进行编程、结果验证、查找bug都需要用到调试的方法&#xff0c;用来进行调试定位&#xff0c;方便找出应…

相对通用大模型,企业更需要适合自身的英智私有化大模型

通用大模型虽然能在多个领域表现出强大的能力&#xff0c;但应用在特定行业时&#xff0c;表现效果并不能达到预期。因为这些模型在训练过程中并没有使用到特定行业的数据和专业知识&#xff0c;它们并不能理解和处理行业的问题。 相比之下&#xff0c;适合自身行业的私有化大…

从零开始构建大语言模型(MEAP)

原文&#xff1a;annas-archive.org/md5/c19a4ef8ab1664a3c5a59d52651430e2 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、理解大型语言模型 本章包括 大型语言模型&#xff08;LLM&#xff09;背后的基本概念的高层次解释 探索 ChatGPT 类 LLM 源自的 Transfo…

OpenTK:安装和说明

OpenTK介绍 OpenTK是一个开源、跨平台的游戏开发库&#xff0c;由MonoGame团队创建。它为C#开发者提供了一个简单易用的接口&#xff0c;以便使用OpenGL、OpenAL和OpenCL进行3D渲染、音频处理和并行计算。OpenTK的目标是提供一个一致且高效的框架&#xff0c;让开发者能够专注于…

IDEA 编码规约扫描 Code inspection did not find anything to report.

IDEA安装了Alibaba Java Coding Guidelines插件&#xff0c;却看不到规约检查结果。手动进行编码规约扫描&#xff0c;弹窗提示“Code inspection did not find anything to report.”&#xff1a; 这种情况是因为代码文件所在的目录被标记成了测试文件&#xff08;Test Source…

【ZYNQ】Zynq 开发流程

Zynq 芯片架构由嵌入式处理器&#xff08;Processing System, PS&#xff09;与可编程逻辑&#xff08;Programmable Logic, PL&#xff09;&#xff0c;以及 PS 与 PL 之间的互联总线组成。本文主要介绍 Xilinx Zynq 芯片开发所使用的软件&#xff0c;包括 Vivado IDE 与 Xili…

基于遗传算法的TSP算法(matlab实现)

一、理论基础 TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题&#xff0c;即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长&#xff0c;到目前为止还未找到一个多项式时间的有效算法。TSP问题可描述为&#xff1a;已知n个城市相互之间的距离&…

JavaScript云LIS系统源码 B/S架构+SaaS模式+SQLserver可扩展性强,商业运营级区域医疗云LIS系统源码

JavaScript云LIS系统源码 B/S架构SaaS模式SQLserver可扩展性强&#xff0c;商业运营级区域医疗云LIS系统源码 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;…

国内独家|阿里云瑶池发布ClickHouse企业版:云原生Serverless新体验

日前&#xff0c;阿里云联合ClickHouse Inc.成功举办了「ClickHouse企业版商业化发布会」。阿里云ClickHouse企业版是阿里云和ClickHouse原厂独家合作的存算分离的云原生版本&#xff0c;支持资源按需弹性Serverless&#xff0c;在帮助企业降低成本的同时&#xff0c;为企业带来…
最新文章