postman.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>PostmanWeb</title>
  8. <script src="vue.js"></script>
  9. <script src="jquery.min.js"></script>
  10. <style>
  11. .line {
  12. border: 1px solid #cccccc;
  13. border-collapse: collapse;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <h1>PostmanWeb</h1>
  19. <table id="postman" style="width:100%;">
  20. <tr>
  21. <td colspan="2" style="padding-bottom:20px;">
  22. Collection:<textarea rows="2" cols="50" v-model="txt_Collection"></textarea>
  23. Environment:<textarea rows="2" cols="50" v-model="txt_Env"></textarea>
  24. <br />
  25. <input type="file" id="fileCollection" onchange="file_onchange(event,'collection');" style="display:none;">
  26. <input type="file" id="fileEnv" onchange="file_onchange(event,'env');" style="display:none;">
  27. <input type="button" value="打开Collection文件" onclick="fileCollection.click();" />
  28. <input type="button" value="打开Environment文件" onclick="fileEnv.click();" />
  29. <input type="button" value="↓" onclick="loadFromTxt();" />
  30. <input type="button" value="↑" onclick="saveToTxt();" />
  31. <input type="button" value="保存至localStorage" onclick="saveToLocalStorage();" />
  32. <input type="button" value="下载Collection" onclick="SaveFile(vpostman.txt_Collection,'Sers.postman_collection.json');" />
  33. <input type="button" value="下载Environment" onclick="SaveFile(vpostman.txt_Env,'Sers.postman_environment.json');" />
  34. <input type="button" value="发送请求" onclick="sendRequest();" />
  35. </td>
  36. </tr>
  37. <tr style="vertical-align:top;padding-top:20px;">
  38. <td>
  39. <div id="menu" style="overflow:auto;width:500px;height:600px;white-space: nowrap;">
  40. <div v-for="item1 in collection.item" style="">
  41. <div style="">{{item1.name}}</div>
  42. <div v-for="item2 in item1.item" style="padding-left:10px;"><a href="#" @click="select(item2)">{{item2.name}}</a></div>
  43. </div>
  44. </div>
  45. </td>
  46. <td>
  47. <table>
  48. <tr>
  49. <td><a href="#" onclick="vpostman.ui_Env = formatJson(vpostman.ui_Env);" title="点击作为json格式化">env</a></td>
  50. <td>
  51. <textarea rows="6" cols="100" v-model="ui_Env"></textarea>
  52. </td>
  53. </tr>
  54. <tr>
  55. <td>name</td>
  56. <td>
  57. <textarea rows="1" cols="100" v-model="curRequest.name"></textarea>
  58. </td>
  59. </tr>
  60. <tr>
  61. <td>url</td>
  62. <td>
  63. <textarea rows="1" cols="100" v-model="ui_Request.url"></textarea>
  64. </td>
  65. </tr>
  66. <tr>
  67. <td>method</td>
  68. <td>
  69. <textarea rows="1" cols="100" v-model="ui_Request.method"></textarea>
  70. </td>
  71. </tr>
  72. <tr>
  73. <td><a href="#" onclick="vpostman.ui_Request.header = formatJson(vpostman.ui_Request.header);" title="点击作为json格式化">header</a></td>
  74. <td>
  75. <textarea rows="6" cols="100" v-model="ui_Request.header"></textarea>
  76. </td>
  77. </tr>
  78. <tr>
  79. <td>
  80. <a href="#" onclick="vpostman.ui_Request.body = formatJson(vpostman.ui_Request.body);" title="点击作为json格式化">body</a><br />
  81. <input type="checkbox" id="chkBodyAsPlain" /><label for="chkBodyAsPlain" title="直接发送字符串,不进行eval转换">发送原文</label>
  82. </td>
  83. <td>
  84. <textarea rows="10" cols="100" v-model="ui_Request.body"></textarea>
  85. </td>
  86. </tr>
  87. <tr>
  88. <td>
  89. <a href="#" onclick="vpostman.ui_Request.response = formatJson(vpostman.ui_Request.response);" title="点击作为json格式化">response</a><br />
  90. <input type="checkbox" id="chkAutoFormatResponse" checked="checked" /><label for="chkAutoFormatResponse" title="自动作为json格式化">自动格式化</label>
  91. </td>
  92. <td>
  93. <textarea rows="14" cols="100" v-model="ui_Request.response"></textarea>
  94. </td>
  95. </tr>
  96. </table>
  97. </td>
  98. </tr>
  99. </table>
  100. <script type="text/javascript">
  101. /*
  102. --------------------------
  103. | txt |
  104. --------------------------
  105. | ui-menu | ui_Env |
  106. | | ui_Request |
  107. | | |
  108. --------------------------
  109. */
  110. var vpostman = new Vue({
  111. el: '#postman',
  112. data: {
  113. txt_Collection: '{}',
  114. txt_Env: '{}',
  115. collection: {},
  116. curRequest: {},
  117. ui_Env: '',
  118. ui_Request: {}
  119. }, methods: {
  120. select: function (item) {
  121. try {
  122. saveRequestToCollection();
  123. this.curRequest = item;
  124. renderUiRequest();
  125. } catch (e) {
  126. alert('错误:' + e.message);
  127. }
  128. }
  129. }
  130. });
  131. function renderUiRequest() {
  132. var item = vpostman.curRequest;
  133. var ui_item = vpostman.ui_Request;
  134. //ui_item.name = item.name;
  135. ui_item.url = item.request.url.raw;
  136. ui_item.method = item.request.method;
  137. //header
  138. var oriHeader = item.request.header;
  139. var header = {};
  140. for (var t in oriHeader) {
  141. var e = oriHeader[t];
  142. header[e.key] = e.value;
  143. }
  144. ui_item.header = JSON.stringify(header, null, 2);
  145. ui_item.body = item.request.body.raw;
  146. ui_item.response = item.response;
  147. }
  148. function saveRequestToCollection() {
  149. var item = vpostman.curRequest;
  150. var ui_item = vpostman.ui_Request;
  151. if (!item || !item.request || !ui_item) return;
  152. //item.name = ui_item.name ;
  153. item.request.url.raw = ui_item.url;
  154. item.request.method = ui_item.method;
  155. //header
  156. var header = ui_item.header;
  157. header = eval('(' + header + ')');
  158. var oriHeader = [];
  159. for (var k in header) {
  160. oriHeader.push({ type: "text", key: k, value: header[k] });
  161. }
  162. item.request.header = oriHeader;
  163. item.request.body.raw = ui_item.body;
  164. item.response = ui_item.response;
  165. }
  166. function onGetResponse(response) {
  167. //if (typeof (response) != 'string') response = JSON.stringify(response, null, 2);
  168. if ($('#chkAutoFormatResponse').is(':checked')) {
  169. try {
  170. var json = eval('(' + response + ')');
  171. response = JSON.stringify(json, null, 2);
  172. } catch (e) {
  173. console.log('error:' + e.message);
  174. }
  175. }
  176. vpostman.ui_Request.response = response;
  177. }
  178. function sendRequest() {
  179. try {
  180. var req = vpostman.ui_Request;
  181. req.response = '';
  182. var param = { url: req.url, type: req.method, header: req.header, data: req.body };
  183. var envReg = [];
  184. var env = eval('(' + vpostman.ui_Env + ')');
  185. for (var k in env) {
  186. envReg.push({ key: k, reg: new RegExp("\\{\\{" + k + "\\}\\}", "g"), value: env[k] });
  187. }
  188. for (var i in param) {
  189. var v = param[i];
  190. if (!v) continue;
  191. for (var t in envReg) {
  192. var item = envReg[t];
  193. v = v.replace(item.reg, item.value);
  194. }
  195. param[i] = v;
  196. }
  197. if (param.header) {
  198. param.header = eval('(' + param.header + ')');
  199. }
  200. if (param.data) {
  201. if (!$('#chkBodyAsPlain').is(':checked')) {
  202. try {
  203. param.data = eval('(' + param.data + ')');
  204. } catch (e) {
  205. }
  206. }
  207. }
  208. param.onSuc = onGetResponse;
  209. ajax(param);
  210. } catch (e) {
  211. alert('出错:' + e.message);
  212. }
  213. }
  214. </script>
  215. <script type="text/javascript">
  216. //(x.x)ajax
  217. // ajax({ url:'http://a.com/a',type:'POST',header:{},data:{},onSuc:function(apiRet){ } });
  218. // ajax({ api:'/a',type:'POST',header:{},data:{},onSuc:function(apiRet){ } });
  219. function ajax(param) {
  220. var url = param.url, type = param.type || 'GET', header = param.header, data = param.data, onSuc = param.onSuc;
  221. if (!url) {
  222. if (param.api) {
  223. url = 'http://' + ssConfig.apiHost + param.api;
  224. }
  225. }
  226. if (type == 'GET') {
  227. if (typeof (data) == 'object') {
  228. for (var k in data) {
  229. var v = data[k];
  230. if (typeof (v) != 'string') {
  231. data[k] = JSON.stringify(v);
  232. }
  233. }
  234. }
  235. }
  236. if (data != null && data != undefined && type != 'GET') {
  237. if (typeof (data) != 'string') {
  238. data = JSON.stringify(data);
  239. }
  240. }
  241. $.ajax({
  242. type: type,
  243. data: data,
  244. url: url,
  245. dataType: "text",
  246. // 允许携带证书
  247. //xhrFields: {
  248. // withCredentials: true
  249. //},
  250. // 允许跨域
  251. crossDomain: true,
  252. headers: header,
  253. //beforeSend: function (request) {
  254. // if (header) {
  255. // for (var key in header) {
  256. // request.setRequestHeader(key, header[key]);
  257. // }
  258. // }
  259. //},
  260. success: onSuc
  261. });
  262. }
  263. function formatJson(jsonStr) {
  264. try {
  265. var json = eval('(' + jsonStr + ')');
  266. jsonStr = JSON.stringify(json, null, 2);
  267. } catch (e) {
  268. }
  269. return jsonStr;
  270. }
  271. </script>
  272. <script type="text/javascript">
  273. //(x.x)ui
  274. var lastOriEnv;
  275. //file: { collection:'',env:''}
  276. function loadPostmanContent(file) {
  277. //(x.1)
  278. try {
  279. if (file.collection)
  280. vpostman.collection = eval('(' + file.collection + ')');
  281. } catch (e) {
  282. alert('出错:' + e.message);
  283. }
  284. //(x.2)
  285. if (file.env) {
  286. try {
  287. var env = file.env;
  288. env = eval('(' + env + ')');
  289. lastOriEnv = env;
  290. var ui_Env = {};
  291. var values = env.values;
  292. for (var i in values) {
  293. var v = values[i];
  294. if (v.enabled === false) continue;
  295. ui_Env[v.key] = v.value;
  296. }
  297. vpostman.ui_Env = JSON.stringify(ui_Env, null, 2);
  298. } catch (e) {
  299. alert('出错:' + e.message);
  300. }
  301. }
  302. //(x.3)
  303. vpostman.curRequest = {};
  304. vpostman.ui_Request = { response: '' }
  305. }
  306. //return: { collection:'',env:''}
  307. function getPostmanContent() {
  308. var file = { collection: '', env: '' };
  309. //(x.1)
  310. saveRequestToCollection();
  311. //(x.2)collection
  312. try {
  313. file.collection = JSON.stringify(vpostman.collection, null, 2);
  314. } catch (e) {
  315. alert('出错:' + e.message);
  316. }
  317. //(x.3)env
  318. try {
  319. var ui_Env = vpostman.ui_Env;
  320. if (ui_Env) {
  321. ui_Env = eval('(' + ui_Env + ')');
  322. var values = [];
  323. for (var t in ui_Env) {
  324. values.push({ enabled: true, key: t, value: ui_Env[t] });
  325. }
  326. lastOriEnv.values = values;
  327. file.env = JSON.stringify(lastOriEnv, null, 2);
  328. }
  329. } catch (e) {
  330. alert('出错:' + e.message);
  331. }
  332. return file;
  333. }
  334. </script>
  335. <script type="text/javascript">
  336. //(x.x)txt
  337. function loadFromTxt() {
  338. loadPostmanContent({
  339. collection: vpostman.txt_Collection,
  340. env: vpostman.txt_Env
  341. });
  342. }
  343. function saveToTxt() {
  344. var file = getPostmanContent();
  345. vpostman.txt_Collection = file.collection;
  346. vpostman.txt_Env = file.env;
  347. }
  348. </script>
  349. <script type="text/javascript">
  350. //(x.x)localStorage
  351. //saveToLocalStorage
  352. function saveToLocalStorage() {
  353. var file = getPostmanContent();
  354. localStorage.postmanCollection = file.collection;
  355. localStorage.postmanEnvironment = file.env;
  356. }
  357. //load init data
  358. if (window.localStorage && localStorage.postmanCollection) {
  359. //loadFromLocalStorage
  360. try {
  361. loadPostmanContent({
  362. collection: localStorage.postmanCollection,
  363. env: localStorage.postmanEnvironment
  364. });
  365. saveToTxt();
  366. } catch (e) {
  367. alert('出错:' + e.message);
  368. }
  369. } else {
  370. //loadFrom postman_collection.json postman_collection.json
  371. //(x.x.1) postman_collection
  372. ajax({
  373. url: 'postman_collection.json', onSuc: function (apiRet) {
  374. try {
  375. loadPostmanContent({
  376. collection: apiRet
  377. });
  378. saveToTxt();
  379. } catch (e) {
  380. alert('出错:' + e.message);
  381. }
  382. }
  383. });
  384. //(x.x.2) postman_environment
  385. ajax({
  386. url: 'postman_environment.json', onSuc: function (apiRet) {
  387. try {
  388. loadPostmanContent({
  389. env: apiRet
  390. });
  391. saveToTxt();
  392. } catch (e) {
  393. alert('出错:' + e.message);
  394. }
  395. }
  396. });
  397. }
  398. </script>
  399. <script type="text/javascript">
  400. //(x.x)下载文件
  401. function SaveFile(content, filename) { // 创建隐藏的可***链接
  402. var eleLink = document.createElement('a');
  403. eleLink.download = filename;
  404. eleLink.style.display = 'none'; // 字符内容转变成blob地址
  405. var blob = new Blob([content]);
  406. eleLink.href = URL.createObjectURL(blob); // 触发点击
  407. document.body.appendChild(eleLink);
  408. eleLink.click(); // 然后移除
  409. document.body.removeChild(eleLink);
  410. };
  411. </script>
  412. <script type="text/javascript">
  413. //(x.x)打开文件
  414. function file_onchange(event, paramName) {
  415. var file = event.target.files[0];
  416. var reader = new FileReader();
  417. reader.readAsText(file);
  418. reader.onload = function () {
  419. var fileContent = this.result;
  420. var postmanContent = {};
  421. postmanContent[paramName] = fileContent;
  422. loadPostmanContent(postmanContent);
  423. saveToTxt();
  424. }
  425. };
  426. </script>
  427. </body>
  428. </html>