Commit 7477abd8 by inrgihc

获取接口出参

parent febf1e56
docs/images/002.PNG

80.4 KB | W: | H:

docs/images/002.PNG

55.2 KB | W: | H:

docs/images/002.PNG
docs/images/002.PNG
docs/images/002.PNG
docs/images/002.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/003.PNG

88.5 KB | W: | H:

docs/images/003.PNG

70.4 KB | W: | H:

docs/images/003.PNG
docs/images/003.PNG
docs/images/003.PNG
docs/images/003.PNG
  • 2-up
  • Swipe
  • Onion skin
......@@ -12,7 +12,7 @@ import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("参数信息")
@ApiModel("入参信息")
public class ItemParam implements Serializable {
@ApiModelProperty("参数名")
......
package com.gitee.sqlrest.common.dto;
import com.gitee.sqlrest.common.enums.ParamTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("出参信息")
public class OutParam implements Serializable {
@ApiModelProperty("参数名")
private String name;
@ApiModelProperty("参数类型")
private ParamTypeEnum type;
@ApiModelProperty("参数描述")
private String remark;
}
......@@ -2,6 +2,7 @@ package com.gitee.sqlrest.core.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.gitee.sqlrest.common.dto.ItemParam;
import com.gitee.sqlrest.common.dto.OutParam;
import com.gitee.sqlrest.common.enums.NamingStrategyEnum;
import com.gitee.sqlrest.persistence.entity.ApiContextEntity;
import io.swagger.annotations.ApiModel;
......@@ -30,6 +31,9 @@ public class ApiAssignmentDetailResponse extends ApiAssignmentBaseResponse {
@ApiModelProperty("接口入参")
private List<ItemParam> params;
@ApiModelProperty("接口出参")
private List<OutParam> outputs;
@ApiModelProperty("HTTP请求的contentType")
private String contentType;
......
package com.gitee.sqlrest.core.dto;
import com.gitee.sqlrest.common.dto.ItemParam;
import com.gitee.sqlrest.common.enums.DataTypeFormatEnum;
import com.gitee.sqlrest.common.dto.OutParam;
import com.gitee.sqlrest.common.enums.ExecuteEngineEnum;
import com.gitee.sqlrest.common.enums.HttpMethodEnum;
import com.gitee.sqlrest.common.enums.NamingStrategyEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
import java.util.Map;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -56,6 +55,9 @@ public class ApiAssignmentSaveRequest {
@ApiModelProperty("接口入参列表")
private List<ItemParam> params;
@ApiModelProperty("接口出参列表")
private List<OutParam> outputs;
@ApiModelProperty("接口出参数据类型转换格式")
private List<DataTypeFormatMapValue> formatMap;
......
......@@ -37,6 +37,7 @@ import com.gitee.sqlrest.persistence.util.PageUtils;
import com.gitee.sqlrest.template.Configuration;
import com.gitee.sqlrest.template.SqlTemplate;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableMap;
import com.zaxxer.hikari.HikariDataSource;
import java.io.File;
import java.io.IOException;
......@@ -160,7 +161,9 @@ public class ApiAssignmentService {
List<Object> results = ApiExecutorEngineFactory
.getExecutor(request.getEngine(), dataSource, dataSourceEntity.getType())
.execute(scripts, params, request.getNamingStrategy());
entity = ResultEntity.success(results.size() > 1 ? results : results.get(0));
Object answer = results.size() > 1 ? results : results.get(0);
Map<String, ParamTypeEnum> types = JacksonUtils.parseFieldTypes(results);
entity = ResultEntity.success(ImmutableMap.of("answer", answer, "types", types));
} catch (Exception e) {
entity = ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(e));
}
......@@ -207,6 +210,7 @@ public class ApiAssignmentService {
assignmentEntity.setPath(request.getPath());
assignmentEntity.setContentType(request.getContentType());
assignmentEntity.setParams(request.getParams());
assignmentEntity.setOutputs(request.getOutputs());
assignmentEntity.setOpen(Optional.ofNullable(request.getOpen()).orElse(false));
assignmentEntity.setEngine(request.getEngine());
assignmentEntity.setStatus(false);
......@@ -267,6 +271,7 @@ public class ApiAssignmentService {
//assignmentEntity.setPath(request.getPath());
assignmentEntity.setContentType(request.getContentType());
assignmentEntity.setParams(request.getParams());
assignmentEntity.setOutputs(request.getOutputs());
assignmentEntity.setOpen(Optional.ofNullable(request.getOpen()).orElse(false));
assignmentEntity.setStatus(false);
assignmentEntity.setEngine(request.getEngine());
......@@ -304,31 +309,6 @@ public class ApiAssignmentService {
return response;
}
public void testAssignment(Long id, HttpServletRequest request, HttpServletResponse response) {
ApiAssignmentEntity assignmentEntity = apiAssignmentDao.getById(id, true);
if (null == assignmentEntity) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_NOT_EXISTS, "id=" + id);
}
String json;
ResultEntity result = apiExecuteService.execute(assignmentEntity, request);
if (0 != result.getCode()) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
json = JacksonUtils.toJsonStr(ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR));
} else {
response.setStatus(HttpServletResponse.SC_OK);
json = JacksonUtils.toJsonStr(result, assignmentEntity.getResponseFormat());
}
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding(Charsets.UTF_8.name());
try {
response.getWriter().append(json);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void deleteAssignment(Long id) {
ApiAssignmentEntity assignmentEntity = apiAssignmentDao.getById(id, false);
if (null != assignmentEntity) {
......
......@@ -6,9 +6,16 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.gitee.sqlrest.common.enums.DataTypeFormatEnum;
import com.gitee.sqlrest.common.enums.ParamTypeEnum;
import com.gitee.sqlrest.core.serdes.DateTimeSerDesFactory;
import java.math.BigInteger;
import java.sql.Time;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
public final class JacksonUtils {
......@@ -40,4 +47,64 @@ public final class JacksonUtils {
return module;
}
public static Map<String, ParamTypeEnum> parseFieldTypes(Object obj) {
Map<String, ParamTypeEnum> results = new LinkedHashMap<>();
if (null == obj) {
return results;
}
if (obj instanceof Map) {
parseFieldTypes("", (Map) obj, results);
} else if (obj instanceof Collection) {
Collection collection = (Collection) obj;
Object item = collection.stream().findFirst().get();
if (item instanceof Map) {
parseFieldTypes("", (Map) item, results);
} else if (item instanceof Collection) {
Collection subCollection = (Collection) item;
Object subItem = subCollection.stream().findFirst().get();
if (subItem instanceof Map) {
parseFieldTypes("", (Map) subItem, results);
} else if (subItem instanceof Collection) {
Collection thSubCollection = (Collection) subItem;
Object thSubItem = thSubCollection.stream().findFirst().get();
if (thSubItem instanceof Map) {
parseFieldTypes("", (Map) thSubItem, results);
}
}
}
}
return results;
}
private static void parseFieldTypes(String prefix, Map<String, Object> map, Map<String, ParamTypeEnum> results) {
for (String name : map.keySet()) {
Object value = map.get(name);
results.put(name, parseValueType(value));
String subPrefix = StringUtils.isBlank(prefix) ? name : prefix + "." + name;
if (value instanceof Map) {
parseFieldTypes(subPrefix, (Map) value, results);
} else if (value instanceof Collection) {
Collection collection = (Collection) value;
Object item = collection.stream().findFirst().get();
parseFieldTypes(subPrefix, (Map) item, results);
}
}
}
private static ParamTypeEnum parseValueType(Object value) {
if (value instanceof Boolean || value instanceof Byte) {
return ParamTypeEnum.BOOLEAN;
} else if (value instanceof Integer || value instanceof Long || value instanceof BigInteger) {
return ParamTypeEnum.LONG;
} else if (value instanceof Number) {
return ParamTypeEnum.DOUBLE;
} else if (value instanceof Time) {
return ParamTypeEnum.TIME;
} else if (value instanceof Date) {
return ParamTypeEnum.DATE;
} else {
return ParamTypeEnum.STRING;
}
}
}
......@@ -108,12 +108,6 @@ public class ApiAssignmentController {
return ResultEntity.success(apiAssignmentService.detailAssignment(id));
}
@ApiOperation(value = "测试API执行")
@PostMapping(value = "/test/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public void test(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response) {
apiAssignmentService.testAssignment(id, request, response);
}
@ApiOperation(value = "删除API配置")
@DeleteMapping(value = "/delete/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity delete(@PathVariable("id") Long id) {
......
ALTER TABLE `SQLREST_API_ASSIGNMENT` ADD COLUMN `outputs` text NULL COMMENT '出参JSON列表' AFTER `params`;
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>SQLREST工具</title><link href=/static/css/app.fe7f344bb1980454cbe37f37645f94e6.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.373873d38594fb61f409.js></script><script type=text/javascript src=/static/js/vendor.b8089f9fd73f8896df25.js></script><script type=text/javascript src=/static/js/app.f528b7ee91d3c4683835.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>SQLREST工具</title><link href=/static/css/app.5f31ee68e0b980f9181f389dfcacaf32.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.4a0ab5fbb9b32cb65fc3.js></script><script type=text/javascript src=/static/js/vendor.b8089f9fd73f8896df25.js></script><script type=text/javascript src=/static/js/app.f528b7ee91d3c4683835.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,a){for(var d,f,i,u=0,s=[];u<r.length;u++)f=r[u],t[f]&&s.push(t[f][0]),t[f]=0;for(d in o)Object.prototype.hasOwnProperty.call(o,d)&&(e[d]=o[d]);for(n&&n(r,o,a);s.length;)s.shift()();if(a)for(u=0;u<a.length;u++)i=c(c.s=a[u]);return i};var r={},t={22:0};function c(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,c){n=t[e]=[r,c]});n[2]=r;var o=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+e+"."+{0:"c6b968f702956d23cafc",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"ef31773dbc0e4bd73d87",4:"f8494b8dd039413f79c8",5:"6a80c59d0b7ae08a93a1",6:"8f85de06573e2a5f9562",7:"7ea6008d16a44e79a428",8:"7483ee6d3a25506eb489",9:"1f165c58c9933d0da8a7",10:"cdd03027e5c73f31170c",11:"cdde61370dec5108c322",12:"57d1188c7336fe654844",13:"cdc0bd22251263ac4669",14:"42cdbd66a7803b30c641",15:"3b3f0c03ff4fed9903cc",16:"4de955682c1f7710c7ea",17:"819547b2361d544d3b8b",18:"5e7f065a8d031847e833",19:"3936346cb7e30aa279e2"}[e]+".js";var d=setTimeout(f,12e4);function f(){a.onerror=a.onload=null,clearTimeout(d);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=f,o.appendChild(a),r},c.m=e,c.c=r,c.d=function(e,n,r){c.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},c.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(n,"a",n),n},c.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},c.p="/",c.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.373873d38594fb61f409.js.map
\ No newline at end of file
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,a){for(var d,f,i,u=0,s=[];u<r.length;u++)f=r[u],t[f]&&s.push(t[f][0]),t[f]=0;for(d in o)Object.prototype.hasOwnProperty.call(o,d)&&(e[d]=o[d]);for(n&&n(r,o,a);s.length;)s.shift()();if(a)for(u=0;u<a.length;u++)i=c(c.s=a[u]);return i};var r={},t={22:0};function c(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,c){n=t[e]=[r,c]});n[2]=r;var o=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+e+"."+{0:"f4513daf7e2679187d35",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"ef31773dbc0e4bd73d87",4:"f8494b8dd039413f79c8",5:"6a80c59d0b7ae08a93a1",6:"8f85de06573e2a5f9562",7:"7ea6008d16a44e79a428",8:"7483ee6d3a25506eb489",9:"1f165c58c9933d0da8a7",10:"cdd03027e5c73f31170c",11:"cdde61370dec5108c322",12:"57d1188c7336fe654844",13:"cdc0bd22251263ac4669",14:"42cdbd66a7803b30c641",15:"3b3f0c03ff4fed9903cc",16:"4de955682c1f7710c7ea",17:"819547b2361d544d3b8b",18:"5e7f065a8d031847e833",19:"3936346cb7e30aa279e2"}[e]+".js";var d=setTimeout(f,12e4);function f(){a.onerror=a.onload=null,clearTimeout(d);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=f,o.appendChild(a),r},c.m=e,c.c=r,c.d=function(e,n,r){c.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},c.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(n,"a",n),n},c.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},c.p="/",c.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.4a0ab5fbb9b32cb65fc3.js.map
\ No newline at end of file
......@@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.gitee.sqlrest.common.dto.ItemParam;
import com.gitee.sqlrest.common.dto.OutParam;
import com.gitee.sqlrest.common.enums.DataTypeFormatEnum;
import com.gitee.sqlrest.common.enums.ExecuteEngineEnum;
import com.gitee.sqlrest.common.enums.HttpMethodEnum;
import com.gitee.sqlrest.common.enums.NamingStrategyEnum;
import com.gitee.sqlrest.persistence.handler.FormatMapHandler;
import com.gitee.sqlrest.persistence.handler.ListOutputHandler;
import com.gitee.sqlrest.persistence.handler.ListParamHandler;
import java.sql.Timestamp;
import java.util.List;
......@@ -55,6 +57,9 @@ public class ApiAssignmentEntity {
@TableField(value = "params", typeHandler = ListParamHandler.class)
private List<ItemParam> params;
@TableField(value = "outputs", typeHandler = ListOutputHandler.class)
private List<OutParam> outputs;
@TableField("status")
private Boolean status;
......
package com.gitee.sqlrest.persistence.handler;
import com.gitee.sqlrest.common.dto.OutParam;
import com.gitee.sqlrest.persistence.util.JsonUtils;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class ListOutputHandler extends BaseTypeHandler<List<OutParam>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<OutParam> list, JdbcType jdbcType)
throws SQLException {
ps.setString(i, list2string(list));
}
@Override
public List<OutParam> getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String r = rs.getString(columnName);
if (rs.wasNull()) {
return null;
}
return string2list(r);
}
@Override
public List<OutParam> getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
String r = rs.getString(columnIndex);
if (rs.wasNull()) {
return null;
}
return string2list(r);
}
@Override
public List<OutParam> getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String r = cs.getString(columnIndex);
if (cs.wasNull()) {
return null;
}
return string2list(r);
}
private String list2string(List<OutParam> list) {
if (list == null || list.isEmpty()) {
return null;
}
return JsonUtils.toJsonString(list);
}
private List<OutParam> string2list(String str) {
if (str == null || str.isEmpty()) {
return new ArrayList<>();
}
return JsonUtils.toBeanList(str, OutParam.class);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment