fork from bc4552c5a8
This commit is contained in:
229
exts/yapi-plugin-import-har/client.js
Normal file
229
exts/yapi-plugin-import-har/client.js
Normal file
@@ -0,0 +1,229 @@
|
||||
import { message } from 'antd';
|
||||
import URL from 'url';
|
||||
const GenerateSchema = require('generate-schema/src/schemas/json.js');
|
||||
import { json_parse, unbase64 } from '../../common/utils.js';
|
||||
|
||||
const transformJsonToSchema = json => {
|
||||
json = json || {};
|
||||
let jsonData = json_parse(json);
|
||||
|
||||
jsonData = GenerateSchema(jsonData);
|
||||
|
||||
let schemaData = JSON.stringify(jsonData);
|
||||
|
||||
return schemaData;
|
||||
};
|
||||
|
||||
function postman(importDataModule) {
|
||||
function parseUrl(url) {
|
||||
return URL.parse(url);
|
||||
}
|
||||
|
||||
function checkInterRepeat(interData) {
|
||||
let obj = {};
|
||||
let arr = [];
|
||||
for (let item in interData) {
|
||||
// console.log(interData[item].url + "-" + interData[item].method);
|
||||
let key = interData[item].request.url + '|' + interData[item].request.method;
|
||||
if (!obj[key]) {
|
||||
arr.push(interData[item]);
|
||||
obj[key] = true;
|
||||
}
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
function handleReq_query(query) {
|
||||
let res = [];
|
||||
if (query && query.length) {
|
||||
for (let item in query) {
|
||||
res.push({
|
||||
name: query[item].name,
|
||||
value: query[item].value
|
||||
});
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
// function handleReq_headers(headers){
|
||||
// let res = [];
|
||||
// if(headers&&headers.length){
|
||||
// for(let item in headers){
|
||||
// res.push({
|
||||
// name: headers[item].key,
|
||||
// desc: headers[item].description,
|
||||
// value: headers[item].value,
|
||||
// required: headers[item].enable
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// return res;
|
||||
// }
|
||||
|
||||
function handleReq_body_form(body_form) {
|
||||
let res = [];
|
||||
if (body_form && typeof body_form === 'object') {
|
||||
for (let item in body_form) {
|
||||
res.push({
|
||||
name: body_form[item].name,
|
||||
value: body_form[item].value,
|
||||
type: 'text'
|
||||
});
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
function handlePath(path) {
|
||||
path = parseUrl(path).pathname;
|
||||
path = decodeURIComponent(path);
|
||||
if (!path) return '';
|
||||
|
||||
path = path.replace(/{{\w*}}/g, '');
|
||||
|
||||
if (path[0] != '/') {
|
||||
path = '/' + path;
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
function run(res) {
|
||||
try {
|
||||
res = JSON.parse(res);
|
||||
res = res.log.entries;
|
||||
|
||||
res = res.filter(item => {
|
||||
if (!item) return false;
|
||||
return item.response.content.mimeType.indexOf('application/json') === 0;
|
||||
});
|
||||
|
||||
let interfaceData = { apis: [] };
|
||||
res = checkInterRepeat.bind(this)(res);
|
||||
if (res && res.length) {
|
||||
for (let item in res) {
|
||||
let data = importHar.bind(this)(res[item]);
|
||||
interfaceData.apis.push(data);
|
||||
}
|
||||
}
|
||||
|
||||
return interfaceData;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
message.error('数据格式有误');
|
||||
}
|
||||
}
|
||||
|
||||
function importHar(data, key) {
|
||||
let reflect = {
|
||||
//数据字段映射关系
|
||||
title: 'url',
|
||||
path: 'url',
|
||||
method: 'method',
|
||||
desc: 'description',
|
||||
req_query: 'queryString',
|
||||
req_body_form: 'params',
|
||||
req_body_other: 'text'
|
||||
};
|
||||
let allKey = [
|
||||
'title',
|
||||
'path',
|
||||
'method',
|
||||
'req_query',
|
||||
'req_body_type',
|
||||
'req_body_form',
|
||||
'req_body_other',
|
||||
'res_body_type',
|
||||
'res_body',
|
||||
'req_headers'
|
||||
];
|
||||
key = key || allKey;
|
||||
let res = {};
|
||||
|
||||
let reqType = 'json',
|
||||
header;
|
||||
data.request.headers.forEach(item => {
|
||||
if (!item || !item.name || !item.value) return null;
|
||||
if (/content-type/i.test(item.name) && item.value.indexOf('application/json') === 0) {
|
||||
reqType = 'json';
|
||||
header = 'application/json';
|
||||
} else if (
|
||||
/content-type/i.test(item.name) &&
|
||||
item.value.indexOf('application/x-www-form-urlencoded') === 0
|
||||
) {
|
||||
header = 'application/x-www-form-urlencoded';
|
||||
reqType = 'form';
|
||||
} else if (
|
||||
/content-type/i.test(item.name) &&
|
||||
item.value.indexOf('multipart/form-data') === 0
|
||||
) {
|
||||
header = 'multipart/form-data';
|
||||
reqType = 'form';
|
||||
}
|
||||
});
|
||||
|
||||
for (let item in key) {
|
||||
item = key[item];
|
||||
if (item === 'req_query') {
|
||||
res[item] = handleReq_query.bind(this)(data.request[reflect[item]]);
|
||||
} else if (item === 'req_body_form' && reqType === 'form' && data.request.postData) {
|
||||
if (header === 'application/x-www-form-urlencoded') {
|
||||
res[item] = handleReq_body_form.bind(this)(data.request.postData[reflect[item]]);
|
||||
} else if (header === 'multipart/form-data') {
|
||||
res[item] = [];
|
||||
}
|
||||
} else if (item === 'req_body_other' && reqType === 'json' && data.request.postData) {
|
||||
res.req_body_is_json_schema = true;
|
||||
res[item] = transformJsonToSchema(data.request.postData.text);
|
||||
} else if (item === 'req_headers') {
|
||||
res[item] = [
|
||||
{
|
||||
name: 'Content-Type',
|
||||
value: header
|
||||
}
|
||||
];
|
||||
} else if (item === 'req_body_type') {
|
||||
res[item] = reqType;
|
||||
} else if (item === 'path') {
|
||||
res[item] = handlePath.bind(this)(data.request[reflect[item]]);
|
||||
} else if (item === 'title') {
|
||||
let path = handlePath.bind(this)(data.request[reflect['path']]);
|
||||
if (data.request[reflect[item]].indexOf(path) > -1) {
|
||||
res[item] = path;
|
||||
if (res[item] && res[item].indexOf('/:') > -1) {
|
||||
res[item] = res[item].substr(0, res[item].indexOf('/:'));
|
||||
}
|
||||
} else {
|
||||
res[item] = data.request[reflect[item]];
|
||||
}
|
||||
} else if (item === 'res_body_type') {
|
||||
res[item] = 'json';
|
||||
} else if (item === 'res_body') {
|
||||
res.res_body_is_json_schema = true;
|
||||
if (data.response.content.encoding && data.response.content.encoding == 'base64') {
|
||||
//base64
|
||||
res[item] = transformJsonToSchema(unbase64(data.response.content.text));
|
||||
} else {
|
||||
res[item] = transformJsonToSchema(data.response.content.text);
|
||||
}
|
||||
} else {
|
||||
res[item] = data.request[reflect[item]];
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
if (!importDataModule || typeof importDataModule !== 'object') {
|
||||
console.error('obj参数必需是一个对象');
|
||||
return null;
|
||||
}
|
||||
|
||||
importDataModule.har = {
|
||||
name: 'HAR',
|
||||
run: run,
|
||||
desc: '使用chrome录制请求功能,具体使用请查看文档'
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function() {
|
||||
this.bindHook('import_data', postman);
|
||||
};
|
||||
4
exts/yapi-plugin-import-har/index.js
Normal file
4
exts/yapi-plugin-import-har/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
server: false,
|
||||
client: true
|
||||
}
|
||||
Reference in New Issue
Block a user