fix(接口定义): 修复 swagger 导出时,请求体为 array 导出失败的情况

This commit is contained in:
Coooder-X 2021-04-29 17:21:51 +08:00 committed by jianxing
parent ee0a41fa02
commit d929cc484a
2 changed files with 83 additions and 20 deletions

View File

@ -498,6 +498,14 @@ public class Swagger3Parser extends SwaggerAbstractParser {
swaggerParam.setDescription((String) param.get("description"));
swaggerParam.setName((String) param.get("name"));
swaggerParam.setRequired((boolean) param.get("required"));
// 请求头 value 没有导出
// JSONObject schema = new JSONObject();
// swaggerParam.setSchema(schema);
// if(type.equals("headers")) {
// schema.put("type", "string");
// schema.put("example", param.getString("value"));
// swaggerParam.setSchema(schema);
// }
paramsList.add(JSON.parseObject(JSON.toJSONString(swaggerParam)));
}
}
@ -522,6 +530,55 @@ public class Swagger3Parser extends SwaggerAbstractParser {
return schema;
}
// 请求体是 array 类型的情况
/* 例子"schema":{
"type":"array",
"items":{
"type":"object",
"properties":{
"ids":{
"type":"string"
}
}
}
} */
private JSONObject buildRequestBodyJsonInfo(JSONArray requestBody) {
if(requestBody == null)
return null;
JSONObject schema = new JSONObject();
schema.put("type", "array");
JSONObject items = new JSONObject();
if(requestBody.size() > 0) {
Object example = requestBody.get(0);
if(example instanceof JSONObject) {
items.put("type", "object");
items.put("properties", buildSchema((JSONObject) example));
} else if(example instanceof java.lang.String) {
items.put("type", "string");
} else if(example instanceof java.lang.Integer) {
items.put("type", "integer");
items.put("format", "int64");
} else if(example instanceof java.lang.Boolean) {
items.put("type", "boolean");
} else if(example instanceof java.math.BigDecimal) {
items.put("type", "double");
}
else { // JSONOArray
items.put("type", "array");
JSONObject item = new JSONObject();
if(((JSONArray) example).size() > 0) {
if(((JSONArray) example).get(0) instanceof JSONObject) {
item = buildRequestBodyJsonInfo((JSONObject) ((JSONArray) example).get(0));
}
}
items.put("items", item);
}
}
schema.put("items", items);
return schema;
}
// 设置一个 json 对象的属性在 swagger 格式中的类型
private JSONObject buildSchema(JSONObject requestBody) {
JSONObject schema = new JSONObject();
@ -650,16 +707,25 @@ public class Swagger3Parser extends SwaggerAbstractParser {
put("Form Data", org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE);
put("WWW_FORM", org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE);
}};
JSONObject bodyInfo = new JSONObject();
Object bodyInfo = new Object();
JSONObject body = respOrReq.getJSONObject("body");
try {
if(body != null) { // 将请求体转换成相应的格式导出
String bodyType = body.getString("type");
if(bodyType == null) {
}else if(bodyType.equals("JSON")) {
try{ // 若请求体是一个 object
bodyInfo = buildRequestBodyJsonInfo(body.getJSONArray("raw"));
} catch (Exception e) {
try { // 若请求体是一个 array
bodyInfo = buildRequestBodyJsonInfo(body.getJSONObject("raw"));
} catch (Exception e1) { // 若请求体 json 不合法则忽略错误原样字符串导出/导入
bodyInfo = new JSONObject();
((JSONObject) bodyInfo).put("type", "string");
((JSONObject) bodyInfo).put("example", body.get("raw").toString());
}
}
} else if(bodyType.equals("XML")) {
String xmlText = body.getString("raw");
JSONObject xmlToJson = XMLUtils.XmlToJson(xmlText);
@ -669,18 +735,13 @@ public class Swagger3Parser extends SwaggerAbstractParser {
bodyInfo = buildformDataSchema(formData);
}
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
}
String type = respOrReq.getJSONObject("body").getString("type");
JSONObject content = new JSONObject();
JSONObject schema = bodyInfo; // 请求体部分
Object schema = bodyInfo; // 请求体部分
JSONObject typeName = new JSONObject();
if (schema != null) {
schema.put("type", null);
schema.put("format", null);
typeName.put("schema", schema);
typeName.put("schema", schema);//schema.getJSONObject("properties").size() == 0? "" :
}
if (type != null && StringUtils.isNotBlank(type)) {
content.put(typeMap.get(type), typeName);

View File

@ -1,5 +1,6 @@
package io.metersphere.api.dto.definition.parse.swagger;
import com.alibaba.fastjson.JSONObject;
import lombok.*;
@Getter
@ -9,4 +10,5 @@ public class SwaggerParams {
private String in; // 参数类型可选值为 path,header,query
private String description;
private boolean required; // 是否是必填参数
private JSONObject schema;
}