| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- import { message } from 'antd';
- import URL from 'url';
- import _ from 'underscore';
- const GenerateSchema = require('generate-schema/src/schemas/json.js');
- import { json_parse } from '../../common/utils.js';
- function postman(importDataModule) {
- var folders = [];
- 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);
- if (!obj[interData[item].url + '-' + interData[item].method + '-' + interData[item].method]) {
- arr.push(interData[item]);
- obj[
- interData[item].url + '-' + interData[item].method + '-' + interData[item].method
- ] = true;
- }
- }
- return arr;
- }
- function handleReq_query(query) {
- let res = [];
- if (query && query.length) {
- for (let item in query) {
- res.push({
- name: query[item].key,
- desc: query[item].description,
- // example: query[item].value,
- value: query[item].value,
- required: query[item].enabled ? '1' : '0'
- });
- }
- }
- 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].enabled ? '1' : '0'
- });
- }
- }
- return res;
- }
- function handleReq_body_form(body_form) {
- let res = [];
- if (body_form && body_form.length) {
- for (let item in body_form) {
- res.push({
- name: body_form[item].key,
- // example: body_form[item].value,
- value: body_form[item].value,
- type: body_form[item].type,
- required: body_form[item].enabled ? '1' : '0',
- desc: body_form[item].description
- });
- }
- }
- return res;
- }
- function handlePath(path) {
- path = parseUrl(path).pathname;
- path = decodeURIComponent(path);
- if (!path) return '';
- path = path.replace(/\{\{.*\}\}/g, '');
- if (path[0] != '/') {
- path = '/' + path;
- }
- return path;
- }
- function run(res) {
- try {
- res = JSON.parse(res);
- let interData = res.requests;
- let interfaceData = { apis: [], cats: [] };
- interData = checkInterRepeat.bind(this)(interData);
- if (res.folders && Array.isArray(res.folders)) {
- res.folders.forEach(tag => {
- interfaceData.cats.push({
- name: tag.name,
- desc: tag.description
- });
- });
- }
- if (_.find(res.folders, item => item.collectionId === res.id)) {
- folders = res.folders;
- }
- if (interData && interData.length) {
- for (let item in interData) {
- let data = importPostman.bind(this)(interData[item]);
- interfaceData.apis.push(data);
- }
- }
- return interfaceData;
- } catch (e) {
- message.error('文件格式必须为JSON');
- }
- }
- function importPostman(data, key) {
- let reflect = {
- //数据字段映射关系
- title: 'name',
- path: 'url',
- method: 'method',
- desc: 'description',
- req_query: 'queryParams',
- req_headers: 'headerData',
- req_params: '',
- req_body_type: 'dataMode',
- req_body_form: 'data',
- req_body_other: 'rawModeData',
- res_body: 'text',
- res_body_type: 'language'
- };
- let allKey = [
- 'title',
- 'path',
- 'catname',
- 'method',
- 'desc',
- 'req_query',
- 'req_headers',
- 'req_body_type',
- 'req_body_form',
- 'req_body_other',
- 'res'
- ];
- key = key || allKey;
- let res = {};
- try {
- for (let item in key) {
- item = key[item];
- if (item === 'req_query') {
- res[item] = handleReq_query.bind(this)(data[reflect[item]]);
- } else if (item === 'req_headers') {
- res[item] = handleReq_headers.bind(this)(data[reflect[item]]);
- } else if (item === 'req_body_form') {
- res[item] = handleReq_body_form.bind(this)(data[reflect[item]]);
- } else if (item === 'req_body_type') {
- if (data[reflect[item]] === 'urlencoded' || data[reflect[item]] === 'params') {
- res[item] = 'form';
- } else {
- if (_.isString(data.headers) && data.headers.indexOf('application/json') > -1) {
- res[item] = 'json';
- } else {
- res[item] = 'raw';
- }
- }
- } else if (item === 'req_body_other') {
- if (_.isString(data.headers) && data.headers.indexOf('application/json') > -1) {
- res.req_body_is_json_schema = true;
- res[item] = transformJsonToSchema(data[reflect[item]]);
- } else {
- res[item] = data[reflect[item]];
- }
- } else if (item === 'path') {
- res[item] = handlePath.bind(this)(data[reflect[item]]);
- if (res[item] && res[item].indexOf('/:') > -1) {
- let params = res[item].substr(res[item].indexOf('/:') + 2).split('/:');
- // res[item] = res[item].substr(0,res[item].indexOf("/:"));
- let arr = [];
- for (let i in params) {
- arr.push({
- name: params[i],
- desc: ''
- });
- }
- res['req_params'] = arr;
- }
- } else if (item === 'title') {
- let path = handlePath.bind(this)(data[reflect['path']]);
- if (data[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[reflect[item]];
- }
- } else if (item === 'catname') {
- let found = folders.filter(item => {
- return item.id === data.folder;
- });
- res[item] = found && Array.isArray(found) && found.length > 0 ? found[0].name : null;
- } else if (item === 'res') {
- let response = handleResponses(data['responses']);
- if (response) {
- (res['res_body'] = response['res_body']),
- (res['res_body_type'] = response['res_body_type']);
- }
- } else {
- res[item] = data[reflect[item]];
- }
- }
- } catch (err) {
- console.log(err.message);
- message.error(`${err.message}, 导入的postman格式有误`);
- }
- return res;
- }
- const handleResponses = data => {
- if (data && data.length) {
- let res = data[0];
- let response = {};
- response['res_body_type'] = res.language === 'json' ? 'json' : 'raw';
- // response['res_body'] = res.language === 'json' ? transformJsonToSchema(res.text): res.text;
- if (res.language === 'json') {
- response['res_body_is_json_schema'] = true;
- response['res_body'] = transformJsonToSchema(res.text);
- } else {
- response['res_body'] = res.text;
- }
- return response;
- }
- return null;
- };
- const transformJsonToSchema = json => {
- json = json || {};
- let jsonData = json_parse(json);
- jsonData = GenerateSchema(jsonData);
- let schemaData = JSON.stringify(jsonData);
- return schemaData;
- };
- if (!importDataModule || typeof importDataModule !== 'object') {
- console.error('obj参数必需是一个对象');
- return null;
- }
- importDataModule.postman = {
- name: 'Postman',
- run: run,
- desc: '注意:只支持json格式数据'
- };
- }
- module.exports = function() {
- this.bindHook('import_data', postman);
- };
|