Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

说一下一些短板 #2

Open
fangkyi03 opened this issue Nov 23, 2018 · 2 comments
Open

说一下一些短板 #2

fangkyi03 opened this issue Nov 23, 2018 · 2 comments

Comments

@fangkyi03
Copy link

fangkyi03 commented Nov 23, 2018

考虑的问题太过单一了
如果是分布式的系统的话 一个swagger页面里面其实会有很多子系统的 并不是打开一个swagger就一个接口数据

其实你这个swagger接口考虑的形式也太过得单一了

只能针对有提供参数的那种普通接口

其实接口名字里面有些是usingPost_1 usingPost_2之类的 这种名字是会变化的 你那边也没过滤
还有类似因为分布式的关系 后台接口的容器是有可能重名的 那么你这边就会出现直接覆盖的情况

我们团队我自己已经写了一个爬接口的脚本了
相比你这个的话 更加成熟点

const axios = require('axios').default;
const fs = require('fs')

// 使用之前 将这个url地址 替换为自己后台swagger网站的地址
const baseUrl = "http://192.167.5.112:7041";

const control = new Set([])

function tranChildren(data, path) {
  return data.map((e) => {
    const text =
      `
      /**
      * ${e.title}
      */
      function ${e.urlName.split('_')[0]}(paramsData = {}) {
          return (info)=>{
              return {target,isUrl:true,method:'POST',url:'${path}${e.url}',params:{...paramsData},...info}
          }
      }`
    return text
  }).join('')
}

function tranParent(name, data, path) {
  const str =
    `
     function ${name} (target) {
       ${tranChildren(data,path)}
       return {${data.map((e)=>e.urlName.split('_')[0]).toString()}}
     }
  `
  return str
}

function tranData(data, path = '') {
  const str = Object.keys(data).map((e) => {
    if (control.has(e)) {
      control.add(e + '_' + path.split('/')[1].toLocaleUpperCase())
      return tranParent(e + '_' + path.split('/')[1].toLocaleUpperCase(), data[e], path)
    }else {
      control.add(e)
      return tranParent(e, data[e], path)
    }
  }).join('')
  return `
    ${str.toString()}
  `
}

/**
 * 初始化获取网络请求数据
 *
 * @param {any}
 */
function getInitalNetWorkData(urlAddress) {
  return new Promise((resolve, reject) => {
    try {
      axios.get(baseUrl + urlAddress)
        .then((e) => {
          if (e.status === 200) {
            try
            {
              let obj = {}
              let path = e.data.basePath.split('/')[1]
              Object.keys(e.data.paths).forEach((el) => {
                const postData = e.data.paths[el].post || e.data.paths[el].get || e.data.paths[el].delete
                if (!postData) {
                  console.log("输出错误", e.data.paths[el]);
                }
                const name = postData.tags[0]
                if (name) {
                  if (!obj[name]) {
                    obj[name] = []
                  }
                  obj[name].push({
                    url: el,
                    title: postData.summary,
                    urlName: postData.operationId
                  })
                }else {
                  console.log('输出name',name)
                }
              })
              const content = tranData(obj, e.data.basePath.slice(0, -1));
              resolve({ text: content, arr: e.data.tags.map((el) => el.name) });
            }catch(error) {
              console.log('object',error)
            }

          } else {
            resolve({ error: true });
          }
        }) 
        .catch(error=>{
          resolve({ error: true});
        })
    } catch (error) {
      resolve({ error });
    }
  })
}

let urlText = "";
let funArr = []
function getNetInfo (filterData,excludeData) {
  axios.get("http://192.167.5.112:7041/swagger-resources")
  .then(async(e)=>{
    let filterResult = e.data.filter((ed) => filterData.length > 0 ? filterData.some((ef) => ed.url.indexOf(ef) !== -1) : true)
    filterResult = filterResult.filter((ed) => {
      return ed.url.indexOf('sso') == -1 &&ed.url.indexOf('app') == -1 

    })
    for (let i = 0; i < filterResult.length; i++) {
      const data = await getInitalNetWorkData(filterResult[i].url);
      if (!data.error) {
        urlText += data.text;
      }
    }
    const text = `
      ${urlText.toString()}
      export default {${Array.from(control).toString()}}
    `
    fs.writeFileSync("./src/command/api.js", text, "utf8");
  })
}

getNetInfo(['trace','upms/company','supe','inspection','company','reset','admin','vertify','info','brace','iot'],[])
@shelly0702
Copy link
Collaborator

考虑的问题太过单一了
如果是分布式的系统的话 一个swagger页面里面其实会有很多子系统的 并不是打开一个swagger就一个接口数据

其实你这个swagger接口考虑的形式也太过得单一了

只能针对有提供参数的那种普通接口

其实接口名字里面有些是usingPost_1 usingPost_2之类的 这种名字是会变化的 你那边也没过滤
还有类似因为分布式的关系 后台接口的容器是有可能重名的 那么你这边就会出现直接覆盖的情况

我们团队我自己已经写了一个爬接口的脚本了
相比你这个的话 更加成熟点

const axios = require('axios').default;
const fs = require('fs')

// 使用之前 将这个url地址 替换为自己后台swagger网站的地址
const baseUrl = "http://192.167.5.112:7041";

const control = new Set([])

function tranChildren(data, path) {
  return data.map((e) => {
    const text =
      `
      /**
      * ${e.title}
      */
      function ${e.urlName.split('_')[0]}(paramsData = {}) {
          return (info)=>{
              return {target,isUrl:true,method:'POST',url:'${path}${e.url}',params:{...paramsData},...info}
          }
      }`
    return text
  }).join('')
}

function tranParent(name, data, path) {
  const str =
    `
     function ${name} (target) {
       ${tranChildren(data,path)}
       return {${data.map((e)=>e.urlName.split('_')[0]).toString()}}
     }
  `
  return str
}

function tranData(data, path = '') {
  const str = Object.keys(data).map((e) => {
    if (control.has(e)) {
      control.add(e + '_' + path.split('/')[1].toLocaleUpperCase())
      return tranParent(e + '_' + path.split('/')[1].toLocaleUpperCase(), data[e], path)
    }else {
      control.add(e)
      return tranParent(e, data[e], path)
    }
  }).join('')
  return `
    ${str.toString()}
  `
}

/**
 * 初始化获取网络请求数据
 *
 * @param {any}
 */
function getInitalNetWorkData(urlAddress) {
  return new Promise((resolve, reject) => {
    try {
      axios.get(baseUrl + urlAddress)
        .then((e) => {
          if (e.status === 200) {
            try
            {
              let obj = {}
              let path = e.data.basePath.split('/')[1]
              Object.keys(e.data.paths).forEach((el) => {
                const postData = e.data.paths[el].post || e.data.paths[el].get || e.data.paths[el].delete
                if (!postData) {
                  console.log("输出错误", e.data.paths[el]);
                }
                const name = postData.tags[0]
                if (name) {
                  if (!obj[name]) {
                    obj[name] = []
                  }
                  obj[name].push({
                    url: el,
                    title: postData.summary,
                    urlName: postData.operationId
                  })
                }else {
                  console.log('输出name',name)
                }
              })
              const content = tranData(obj, e.data.basePath.slice(0, -1));
              resolve({ text: content, arr: e.data.tags.map((el) => el.name) });
            }catch(error) {
              console.log('object',error)
            }

          } else {
            resolve({ error: true });
          }
        }) 
        .catch(error=>{
          resolve({ error: true});
        })
    } catch (error) {
      resolve({ error });
    }
  })
}

let urlText = "";
let funArr = []
function getNetInfo (filterData,excludeData) {
  axios.get("http://192.167.5.112:7041/swagger-resources")
  .then(async(e)=>{
    let filterResult = e.data.filter((ed) => filterData.length > 0 ? filterData.some((ef) => ed.url.indexOf(ef) !== -1) : true)
    filterResult = filterResult.filter((ed) => {
      return ed.url.indexOf('sso') == -1 &&ed.url.indexOf('app') == -1 

    })
    for (let i = 0; i < filterResult.length; i++) {
      const data = await getInitalNetWorkData(filterResult[i].url);
      if (!data.error) {
        urlText += data.text;
      }
    }
    const text = `
      ${urlText.toString()}
      export default {${Array.from(control).toString()}}
    `
    fs.writeFileSync("./src/command/api.js", text, "utf8");
  })
}

getNetInfo(['trace','upms/company','supe','inspection','company','reset','admin','vertify','info','brace','iot'],[])

跑了一下您提供的程序,棒棒的!感谢提供的思路,多个接口数据我们还真没考虑到。实际最初我们的程序思路也是和您的类似,以不同模块输出数据,为了减少实际使用中多层嵌套及代码量过大问题,我们将模块这一层去掉了。直接用id唯一性标识来区分。既然是唯一性标识,就不会有重复覆盖的情况,如果是您说的分布式的情况的话,这个唯一性标识会有相同的可能性情况还有待调研。同时还有个疑问是,如果是多个子系统,我们是不是将其当做多个不同的系统来处理,而不是当做一个系统。相信一个人做多个子系统并行开发的概率也会比较小。
另外您的程序中对swagger-resources这一层的分析,对我们这边的swagger文档有点冲突,接口路径并不在url中,而在location中。这或许跟后端的命名习惯有关系。

@fangkyi03
Copy link
Author

可以看一下我之前写的的另一个文档
稍微改一下就能跟typescript直接关联在一起 进行代码补全以及提醒 错误效验等等
https://github.com/fangkyi03/swaggerToTypeScript

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants