在前端开发中,通常需要进行接口对接,配置api接口文件及代码编写。当有大量的接口时,就要重复多次的做配置,影响开发效率。
而通过接口爬取的方式直接生成api.js文件可以大大提升开发效率。
主要使用node的request模块发起接口请求(fs模块进行写入操怍),具体实现如下:
创建mkApi.js
const fs = require('fs')
const path = require('path') // 解析需要遍历的文件夹
const jsonPath = path.resolve('./api.json') // 需要解析的api.json
const apiPath = '../../api' // 存放位置
// 调用读取qpi.josn文件方法
fileDisplay(jsonPath)
// json遍历 并分割成文件目录数组
function fileDisplay(jsonPath) {
const content = fs.readFileSync(jsonPath, 'utf-8')
const arr = JSON.parse(content)
for (let i = 0; i < arr.length; i++) {
const item = arr[i]
const url = item.url
const method = item.method || 'post'
const dirs = url.split('/').filter((s) => {
// 将url以'/'分隔成数组 并去除空数组
return s && s.trim()
})
item.dirs = dirs
}
makeMultidir(arr) // 根据url创建目录
}
// 创建目录和js文件
function makeMultidir(arr) {
arr.forEach((item) => {
const dirs = item.dirs
let cur = ''
for (let i = 0; i < dirs.length; i++) {
const el = dirs[i]
const site = apiPath + '/' + el
if (i >= dirs.length - 2) {
// 倒数第二级为js
// js文件
if (i == dirs.length - 1) {
let jsDir = apiPath + cur + '.js'
console.log(jsDir, '写入api代码')
// 最后一级为api,无需创建js,要写入api代码
writeApi(jsDir, item)
} else {
let jsDir = apiPath + cur + '/' + el + '.js'
cur = cur + '/' + el
if (fs.existsSync(jsDir)) {
console.log('js已存在')
} else {
console.log(jsDir, 'js不存在,创建js')
// 创建js
// const jsCont = '222'
fs.writeFileSync(jsDir, '', function (err) {
if (err) throw err
})
}
}
} else {
cur = cur + '/' + el // 拼接当前遍历所在目录,用于判断js文件是否存在
// 目录 'isFile(): ', statObx.isFile(), statObx.isDirectory()
if (fs.existsSync(site) && fs.statSync(site).isDirectory()) {
console.log('文件已存在')
} else {
console.log('文件不存在,创建目录')
fs.mkdirSync(site)
}
}
}
})
}
// 写入api代码
function writeApi(jsDir, obj) {
// 先判断api是否已经写入,避免重复写入
const { url, method, dirs } = obj
// 读取js文件内容
const content = fs.readFileSync(jsDir, 'utf-8')
const reg = /["|'](.*?)["|']/g
const s = content
const urlArr = []
let hasApi = false
// 获取api中双引号或单引号中的接口url
while ((m = reg.exec(s))) {
if (m[1].indexOf(dirs[dirs.length - 2]) != -1) {
if (m[1] == url) {
hasApi = true
console.log('api配置已存在')
}
}
} //eslint-disable-line
if (!hasApi) {
console.log('写入api配置代码')
// 写入api配置代码
let apiCon = `
export const ${dirs[dirs.length - 1]} = (data) => {
return request({
url: '${url}',
method: '${method || 'post'}',
${method == 'get' ? 'params: data' : 'data'}
})
}`
const data = fs.readFileSync(jsDir, 'utf8').split('\n')
data.splice(data.length - 1, 0, apiCon) // 向js文件的倒数第一行插入内容
fs.writeFileSync(jsDir, data.join('\n'), 'utf8')
}
}
创建api接口信息文件,用于测试
执行命令node mkApi.js即可根据json中的数据生成对应的api配置文件