mock平台

client.js 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import { message } from 'antd';
  2. import URL from 'url';
  3. import _ from 'underscore';
  4. const GenerateSchema = require('generate-schema/src/schemas/json.js');
  5. import { json_parse } from '../../common/utils.js';
  6. function postman(importDataModule) {
  7. var folders = [];
  8. function parseUrl(url) {
  9. return URL.parse(url);
  10. }
  11. function checkInterRepeat(interData) {
  12. let obj = {};
  13. let arr = [];
  14. for (let item in interData) {
  15. // console.log(interData[item].url + "-" + interData[item].method);
  16. if (!obj[interData[item].url + '-' + interData[item].method + '-' + interData[item].method]) {
  17. arr.push(interData[item]);
  18. obj[
  19. interData[item].url + '-' + interData[item].method + '-' + interData[item].method
  20. ] = true;
  21. }
  22. }
  23. return arr;
  24. }
  25. function handleReq_query(query) {
  26. let res = [];
  27. if (query && query.length) {
  28. for (let item in query) {
  29. res.push({
  30. name: query[item].key,
  31. desc: query[item].description,
  32. // example: query[item].value,
  33. value: query[item].value,
  34. required: query[item].enabled ? '1' : '0'
  35. });
  36. }
  37. }
  38. return res;
  39. }
  40. function handleReq_headers(headers) {
  41. let res = [];
  42. if (headers && headers.length) {
  43. for (let item in headers) {
  44. res.push({
  45. name: headers[item].key,
  46. desc: headers[item].description,
  47. value: headers[item].value,
  48. required: headers[item].enabled ? '1' : '0'
  49. });
  50. }
  51. }
  52. return res;
  53. }
  54. function handleReq_body_form(body_form) {
  55. let res = [];
  56. if (body_form && body_form.length) {
  57. for (let item in body_form) {
  58. res.push({
  59. name: body_form[item].key,
  60. // example: body_form[item].value,
  61. value: body_form[item].value,
  62. type: body_form[item].type,
  63. required: body_form[item].enabled ? '1' : '0',
  64. desc: body_form[item].description
  65. });
  66. }
  67. }
  68. return res;
  69. }
  70. function handlePath(path) {
  71. path = parseUrl(path).pathname;
  72. path = decodeURIComponent(path);
  73. if (!path) return '';
  74. path = path.replace(/\{\{.*\}\}/g, '');
  75. if (path[0] != '/') {
  76. path = '/' + path;
  77. }
  78. return path;
  79. }
  80. function run(res) {
  81. try {
  82. res = JSON.parse(res);
  83. let interData = res.requests;
  84. let interfaceData = { apis: [], cats: [] };
  85. interData = checkInterRepeat.bind(this)(interData);
  86. if (res.folders && Array.isArray(res.folders)) {
  87. res.folders.forEach(tag => {
  88. interfaceData.cats.push({
  89. name: tag.name,
  90. desc: tag.description
  91. });
  92. });
  93. }
  94. if (_.find(res.folders, item => item.collectionId === res.id)) {
  95. folders = res.folders;
  96. }
  97. if (interData && interData.length) {
  98. for (let item in interData) {
  99. let data = importPostman.bind(this)(interData[item]);
  100. interfaceData.apis.push(data);
  101. }
  102. }
  103. return interfaceData;
  104. } catch (e) {
  105. message.error('文件格式必须为JSON');
  106. }
  107. }
  108. function importPostman(data, key) {
  109. let reflect = {
  110. //数据字段映射关系
  111. title: 'name',
  112. path: 'url',
  113. method: 'method',
  114. desc: 'description',
  115. req_query: 'queryParams',
  116. req_headers: 'headerData',
  117. req_params: '',
  118. req_body_type: 'dataMode',
  119. req_body_form: 'data',
  120. req_body_other: 'rawModeData',
  121. res_body: 'text',
  122. res_body_type: 'language'
  123. };
  124. let allKey = [
  125. 'title',
  126. 'path',
  127. 'catname',
  128. 'method',
  129. 'desc',
  130. 'req_query',
  131. 'req_headers',
  132. 'req_body_type',
  133. 'req_body_form',
  134. 'req_body_other',
  135. 'res'
  136. ];
  137. key = key || allKey;
  138. let res = {};
  139. try {
  140. for (let item in key) {
  141. item = key[item];
  142. if (item === 'req_query') {
  143. res[item] = handleReq_query.bind(this)(data[reflect[item]]);
  144. } else if (item === 'req_headers') {
  145. res[item] = handleReq_headers.bind(this)(data[reflect[item]]);
  146. } else if (item === 'req_body_form') {
  147. res[item] = handleReq_body_form.bind(this)(data[reflect[item]]);
  148. } else if (item === 'req_body_type') {
  149. if (data[reflect[item]] === 'urlencoded' || data[reflect[item]] === 'params') {
  150. res[item] = 'form';
  151. } else {
  152. if (_.isString(data.headers) && data.headers.indexOf('application/json') > -1) {
  153. res[item] = 'json';
  154. } else {
  155. res[item] = 'raw';
  156. }
  157. }
  158. } else if (item === 'req_body_other') {
  159. if (_.isString(data.headers) && data.headers.indexOf('application/json') > -1) {
  160. res.req_body_is_json_schema = true;
  161. res[item] = transformJsonToSchema(data[reflect[item]]);
  162. } else {
  163. res[item] = data[reflect[item]];
  164. }
  165. } else if (item === 'path') {
  166. res[item] = handlePath.bind(this)(data[reflect[item]]);
  167. if (res[item] && res[item].indexOf('/:') > -1) {
  168. let params = res[item].substr(res[item].indexOf('/:') + 2).split('/:');
  169. // res[item] = res[item].substr(0,res[item].indexOf("/:"));
  170. let arr = [];
  171. for (let i in params) {
  172. arr.push({
  173. name: params[i],
  174. desc: ''
  175. });
  176. }
  177. res['req_params'] = arr;
  178. }
  179. } else if (item === 'title') {
  180. let path = handlePath.bind(this)(data[reflect['path']]);
  181. if (data[reflect[item]].indexOf(path) > -1) {
  182. res[item] = path;
  183. if (res[item] && res[item].indexOf('/:') > -1) {
  184. res[item] = res[item].substr(0, res[item].indexOf('/:'));
  185. }
  186. } else {
  187. res[item] = data[reflect[item]];
  188. }
  189. } else if (item === 'catname') {
  190. let found = folders.filter(item => {
  191. return item.id === data.folder;
  192. });
  193. res[item] = found && Array.isArray(found) && found.length > 0 ? found[0].name : null;
  194. } else if (item === 'res') {
  195. let response = handleResponses(data['responses']);
  196. if (response) {
  197. (res['res_body'] = response['res_body']),
  198. (res['res_body_type'] = response['res_body_type']);
  199. }
  200. } else {
  201. res[item] = data[reflect[item]];
  202. }
  203. }
  204. } catch (err) {
  205. console.log(err.message);
  206. message.error(`${err.message}, 导入的postman格式有误`);
  207. }
  208. return res;
  209. }
  210. const handleResponses = data => {
  211. if (data && data.length) {
  212. let res = data[0];
  213. let response = {};
  214. response['res_body_type'] = res.language === 'json' ? 'json' : 'raw';
  215. // response['res_body'] = res.language === 'json' ? transformJsonToSchema(res.text): res.text;
  216. if (res.language === 'json') {
  217. response['res_body_is_json_schema'] = true;
  218. response['res_body'] = transformJsonToSchema(res.text);
  219. } else {
  220. response['res_body'] = res.text;
  221. }
  222. return response;
  223. }
  224. return null;
  225. };
  226. const transformJsonToSchema = json => {
  227. json = json || {};
  228. let jsonData = json_parse(json);
  229. jsonData = GenerateSchema(jsonData);
  230. let schemaData = JSON.stringify(jsonData);
  231. return schemaData;
  232. };
  233. if (!importDataModule || typeof importDataModule !== 'object') {
  234. console.error('obj参数必需是一个对象');
  235. return null;
  236. }
  237. importDataModule.postman = {
  238. name: 'Postman',
  239. run: run,
  240. desc: '注意:只支持json格式数据'
  241. };
  242. }
  243. module.exports = function() {
  244. this.bindHook('import_data', postman);
  245. };