<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>JSON接口测试工具(ver1.2)</title> <script src="http://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script> <script src="http://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="http://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.js"></script> <script src="http://cdn.bootcss.com/clipboard.js/1.7.1/clipboard.min.js"></script> <link href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link href="http://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet"> <!-- <script src="js/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> <script src="js/sweetalert.min.js"></script> <script src="js/clipboard.min.js"></script> <link href="css/bootstrap.min.css" rel="stylesheet"> <link href="css/sweetalert.min.css" rel="stylesheet"> --> <style> * { padding: 0; margin: 0px; } li { list-style: none; } a { text-decoration: none; } .container-fluid { transition: all 0.3s; } .container-fluid.open { transform: scale(0.9); } .row { padding-top: 5px; padding-bottom: 5px; } pre { min-height: 100px; max-width: 100%; word-wrap: break-word; white-space: pre-wrap; } .get-data-group { max-height: 100vh; overflow-y: auto; } .from-data {} .get-data.error { color: red; } .border-bottom { margin: 10px 0px; border-bottom: 1px solid #cecece; } .ver_doc { width: 100%; height: 100%; top: 0px; left: 0px; position: fixed; color: #fff; background: rgba(0, 0, 0, 0.8); z-index: 20; transition: all .3s linear; } .ver_doc.hide { display: none; } .ver_doc.init { background: rgba(0, 0, 0, 0); } .ver_doc.close { background: rgba(0, 0, 0, 0); } .ver_doc .abs { position: absolute; left: 50%; top: 30%; transform: translate(-50%, -50%); transition: all .3s; } .ver_doc.init .abs { transform: scale(5); } .ver_doc.close .abs { transform: scale(5); } .ver_doc .title { font-size: 20px; } .ver_doc .content { font-size: 14px; } </style> <script> var _from = {}; var _get = {}; var _row = ''; var _configList = {}; $(function() { _row = '<div class="row from-data">' + $(".from-data").html() + '</div>'; keyUpInit(); loadSaveInit(); loadConfigList(localStorage.getItem("apiTestConfigList")); $(".ver").click(function() { var title_html = "<p>WHAT'S NEW?</p>" var content_html = "<P>1,重新构建了保存机制,保存的配置列表将存在localStorage里,再次访问将直接加载。</P>" content_html += "<p>2,可对已保存的配置删除与覆盖,接口地址将作为已保存配置的唯一标识。</p>" content_html += "<p>3,增加了导入,导出功能,可把单条或所有配置信息复制到剪切板通过QQ等聊天工具传播,实现配置异地化。</p>" content_html += "<p> </p><p>对于接口需要session验证的使用方法说明:</p>" content_html += "<p>将本文件放到web服务目录下,通过web服务访问登录页登录获取session,在通过web服务访问此文件</p>" content_html += "<p>例如:先访问http://localhost:8080/login.jsp登录,再访问同域名同端口下的http://localhost:8080/testApi(v1.2).html进行测试接口</p>" content_html += "<p><br>祝大家测试一次通过,永无bug。</p>" //$(".container-fluid").addClass("open") $(".ver_doc").removeClass("hide") setTimeout(function() { $(".ver_doc").removeClass("init"); }, 10) $(".ver_doc").find(".title").html(title_html) $(".ver_doc").find(".content").html(content_html) $(".ver_doc").click(function() { //$(".container-fluid").removeClass("open"); $(".ver_doc").addClass("close"); setTimeout(function() { $(".ver_doc").addClass("hide").addClass("init").removeClass("close"); }, 300) }) }) }) function alert(msg) { swal("", msg); } function confirm(msg, callback) { swal({ title: "", text: msg, type: "info", showCancelButton: true, cancelButtonText: "取消", showConfirmButton: true, confirmButtonText: "确定" }, function(isConfirm) { if(isConfirm && $.isFunction(callback)) { callback(); } }) } //加载保存配置列表 function loadConfigList(jsontext) { if(jsontext != "" && jsontext != null) { try { _configList = eval('(' + jsontext + ')'); $(".saveConfigList option.config").remove(); if(!$.isEmptyObject(_configList)) { $.each(_configList, function(index, obj) { $(".saveConfigList").append('<option class="form-control config" value="' + index + '">' + index + '</option>'); }) } } catch(e) { _configList = {}; console.dir(e) } } else { console.log(1) } } //回车事件 function keyUpInit() { $(document).on("keyup", "input.form-control", function(e) { if(e.which == 13) { send(); } }) $(document).on("click", "textarea#exportConfigTextarea", function() { $(this).select(); }) } //删除行 function deleteRow(e) { $(e).parent().parent().remove(); } //增加行 function addRow() { $(".from-data-list").append(_row); } //转义 function HTMLEncode(html) { var temp = document.createElement("div"); (temp.textContent != null) ? (temp.textContent = html) : (temp.innerText = html); var output = temp.innerHTML; temp = null; return output; } //导入当前配置 function importConfig() { var html = '<textarea placehoder="请把导出的配置粘贴到此文本框中" id="importConfigTextarea" class="form-control" style="height:100px;resize:none;">' + '' + '</textarea>'; html += '<p>请把导出的配置粘贴到该文本框中</p>'; swal({ title: "", text: html, html: true, closeOnConfirm: false, showConfirmButton: true, showCancelButton: true, confirmButtonText: "导入", cancelButtonText: "关闭" }, function(isConfirm) { if(isConfirm) { var content = $("#importConfigTextarea").val(); try { importJson = eval('(' + content + ')'); } catch(e) { swal("导入失败", "json格式不正确1", "error"); } if(importJson && importJson['testApiSaveConfigList']) { for(key in importJson['testApiSaveConfigList']) { _configList[key] = importJson['testApiSaveConfigList'][key] } swal("导入成功", "配置已导入到保存配置列表", "success"); window.localStorage.setItem("apiTestConfigList", JSON.stringify(_configList)); loadConfigList(localStorage.getItem("apiTestConfigList")); } else { swal("导入失败", "json格式不正确", "error"); } } }) } //导出当前保存配置 function exportConfig(isAll) { var apiurl = $.trim($(".api_url").val()); if(apiurl != "" || isAll) { if(isAll) { var exportConfigList = {}; exportConfigList['testApiSaveConfigList'] = {}; exportConfigList['testApiSaveConfigList'] = _configList; } else { var exportConfigList = {}; exportConfigList['testApiSaveConfigList'] = {}; var exportConfig = {}; exportConfig[apiurl] = []; $(".from-data").each(function() { if($(this).find(".key").val() != "") { exportConfig[apiurl].push({ "key": $(this).find(".key").val(), "value": $(this).find(".value").val() }); } }) exportConfigList['testApiSaveConfigList'] = exportConfig; } console.dir(exportConfigList) var html = '<textarea id="exportConfigTextarea" class="form-control" style="height:100px;resize:none;">' + HTMLEncode(JSON.stringify(exportConfigList)) + '</textarea>'; html += '<p></p>'; swal({ title: "", text: html, type: "", html: true, closeOnConfirm: false, showConfirmButton: true, showCancelButton: true, confirmButtonText: "复制", cancelButtonText: "关闭" }, function(isConfirm) { if(!isConfirm) { endClipboard(); } }) $(".sweet-alert .sa-button-container .confirm").attr("data-clipboard-action", "copy") $(".sweet-alert .sa-button-container .confirm").attr("data-clipboard-target", "#exportConfigTextarea") var clipboard = new Clipboard('.sweet-alert .sa-button-container .confirm'); clipboard.on('success', function(e) { swal("", "复制成功", "success"); endClipboard(); }); clipboard.on('error', function(e) { swal("", "复制失败", "error") $("textarea#exportConfig").select(); endClipboard(); }); } else { swal("", "接口地址不能为空!", "warning") } function endClipboard() { $(".sweet-alert .sa-button-container .confirm").removeAttr("data-clipboard-action") $(".sweet-alert .sa-button-container .confirm").removeAttr("data-clipboard-target") console.log(clipboard) clipboard.destroy(); console.log(clipboard) } } //保存当前配置 function saveConfig() { if($.trim($(".api_url").val()) != "") { var apiurl = $(".api_url").val(); if(!_configList[apiurl]) { $(".saveConfigList").append('<option class="form-control config" value="' + apiurl + '">' + apiurl + '</option>'); } _configList[apiurl] = []; $(".from-data").each(function() { if($(this).find(".key").val() != "") { _configList[apiurl].push({ "key": $(this).find(".key").val(), "value": $(this).find(".value").val() }); } }) $(".saveConfigList option[value='" + apiurl + "']").attr("selected", "true"); swal("保存成功", "该配置已保存到缓存中", "success"); window.localStorage.setItem("apiTestConfigList", JSON.stringify(_configList)); } else { swal("", "接口地址不能为空!", "warning") } } //删除选中配置 function deleteConfig() { if($("option.config:selected").length > 0) { delete _configList[$("option.config:selected").val()]; window.localStorage.setItem("apiTestConfigList", JSON.stringify(_configList)) $("option.config:selected").remove(); resetConfig(); } else { alert("未选择接口配置") } } //清空保存配置列表 function deleteAllConfig() { _configList = {}; window.localStorage.setItem("apiTestConfigList", "{}"); loadConfigList(localStorage.getItem("apiTestConfigList")); } //更换保存配置初始化 function loadSaveInit() { $(".saveConfigList").on("change", function() { if($("option.config:selected").length > 0) { apiurl = $("option.config:selected").val(); var config = _configList[apiurl]; $(".from-data").remove(); for(n = 0; n < config.length; n++) { addRow() } $(".api_url").val(apiurl) $.each(config, function(index, obj) { $(".key").eq(index).val(obj.key) $(".value").eq(index).val(obj.value) }); $(".send-data,.get-data").html("") } else { resetConfig(); } }) } //重置 function resetConfig() { $(".saveConfigList option").eq(0).attr('selected', 'true'); $(".api_url").val(""); $(".from-data").remove(); addRow(); } function send() { _from = {}; if($.trim($(".api_url").val()) != "") { var api = $.trim($(".api_url").val()); $(".from-data").each(function() { if($.trim($(this).find(".key").val()) != "") { _from[$.trim($(this).find(".key").val())] = $.trim($(this).find(".value").val()) } }) console.log("发送的数据:") console.dir(_from) $(".send-data").html(JSON.stringify(_from, null, 2)); var startTime = 0; var endTime = 0; var responseTime = 0; $.ajax({ url: api, type: "get", dataType: "json", data: _from, success: function(data) { console.log("获取的数据:"); console.dir(data); $(".get-data").html(HTMLEncode(JSON.stringify(data, null, 2))); }, error: function(XMLHttpRequest, textStatus, errorThrown) { swal("", textStatus, "error") $(".get-data").addClass("error").append(JSON.stringify(XMLHttpRequest, null, 2)); }, beforeSend: function() { startTime = new Date().getTime(); $(".get-data").empty(); $(".get-data").removeClass("error"); $(".responseTime").html("(正在加载...)"); }, complete: function() { endTime = new Date().getTime(); responseTime = endTime - startTime; $(".responseTime").html("(响应时间:" + responseTime + " ms)") } }) } else { swal("", "接口地址不能为空", "warning") } } </script> </head> <body> <div class="container-fluid"> <div class="row" style="padding-top: 0px; padding-bottom: 0px;"> <div class="col-sm-6 from-data-group"> <div class="row text-center"> <h3>JSON接口测试工具(<a href="javascript:;" title="what's new?" class="ver">ver1.2</a>)</h3> </div> <div class="row"> <div class="col-sm-10"> <select placeholder="" class="saveConfigList form-control"> <option class="no-config form-control">--保存接口配置列表--</option> </select> </div> <div class="col-sm-2"> <button id="deleteConfig" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="btn btn-block btn-default"> 删除 <span class="caret"></span> </button> <ul class="dropdown-menu" aria-labelledby="deleteConfig"> <li> <a href="javascript:;" onclick="deleteConfig()">删除当前接口配置</a> </li> <li role="separator" class="divider"></li> <li> <a href="javascript:;" onclick="deleteAllConfig()">删除所有接口配置</a> </li> </ul> </div> </div> <div class="row"> <div class="col-sm-2"> <button id="importConfig" class="btn btn-block btn-default" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 导入 <span class="caret"></span> </button> <ul class="dropdown-menu" aria-labelledby="importConfig"> <li> <a href="javascript:;" onclick="importConfig()">从剪切板导入</a> </li> </ul> </div> <div class="col-sm-2"> <button id="exportConfig" class="btn btn-block btn-default" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 导出 <span class="caret"></span> </button> <ul class="dropdown-menu" aria-labelledby="exportConfig"> <li> <a href="javascript:;" onclick="exportConfig(false)">导出当前接口配置到剪切板</a> </li> <li role="separator" class="divider"></li> <li> <a href="javascript:;" onclick="exportConfig(true)">导出所有接口配置到剪切板</a> </li> </ul> </div> <div class="col-sm-2 pull-right"> <button class="btn btn-block btn-default" onclick="resetConfig()">重置</button> </div> <div class="col-sm-2 pull-right"> <button class="btn btn-block btn-default" onclick="saveConfig()">保存</button> </div> </div> <div class="border-bottom"> </div> <div class="row"> <div class="col-sm-8"> <input type="text" placeholder="API URL" class="api_url form-control"> </div> <div class="col-sm-2"> <button class="btn btn-block btn-success" onclick="send()">SEND</button> </div> <div class="col-sm-2 pull-right"> <button class="btn btn-block btn-default" onclick="addRow()">增加</button> </div> </div> <div class="from-data-list"> <div class="row from-data"> <div class="col-sm-3"> <input type="text" placeholder="KEY" class="form-control key"> </div> <div class="col-sm-7"> <input type="text" placeholder="VALUE" class="form-control value"> </div> <div class="col-sm-2"> <button class="btn btn-block btn-default" onclick="deleteRow(this)">删除</button> </div> </div> </div> <div class="row"> </div> </div> <div class="col-sm-6 get-data-group"> <div class="row"> 发送的数据: </div> <div class="row"> <pre class="send-data"></pre> </div> <div class="row"> 返回的数据:<span class="responseTime"></span> </div> <div class="row"> <pre class="get-data"></pre> </div> </div> </div> </div> <div class="ver_doc init hide"> <div class="container abs"> <div class="title"></div> <div class="content"></div> </div> </div> </body> </html>