yapi/exts/yapi-plugin-import-har/client.js
2018-05-03 10:33:38 +08:00

217 lines
5.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {message} from 'antd'
import URL from 'url';
const GenerateSchema = require('generate-schema/src/schemas/json.js');
import { json_parse } 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
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)
}