| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- 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);
- };
|