grpc文档开发
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package com.zyplayer.doc.grpc.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.nxest.grpc.client.GrpcChannelFactory;
|
||||
import com.nxest.grpc.server.GrpcService;
|
||||
@@ -31,6 +32,8 @@ public class GrpcDocController {
|
||||
|
||||
@Resource
|
||||
GrpcChannelFactory grpcChannelFactory;
|
||||
private static Map<String, ColumnInfo> allColumnsMap = new HashMap<>();
|
||||
private static Map<String, Object> allBlockingStubMap = new HashMap<>();
|
||||
|
||||
@RequestMapping("/service")
|
||||
public DocResponseJson service() throws Exception {
|
||||
@@ -48,14 +51,8 @@ public class GrpcDocController {
|
||||
// 找所有的参数列表
|
||||
Map<String, ColumnInfo> columnsMap = new HashMap<>();
|
||||
for (GrpcDocInfo grpcDocInfo : grpcDocInfoList) {
|
||||
String paramType = grpcDocInfo.getParamType();
|
||||
String resultType = grpcDocInfo.getResultType();
|
||||
if (!columnsMap.containsKey(paramType)) {
|
||||
columnsMap.put(paramType, this.findColumnInfo(paramType));
|
||||
}
|
||||
if (!columnsMap.containsKey(resultType)) {
|
||||
columnsMap.put(resultType, this.findColumnInfo(resultType));
|
||||
}
|
||||
this.setColumnsInfo(grpcDocInfo.getParamType(), columnsMap);
|
||||
this.setColumnsInfo(grpcDocInfo.getResultType(), columnsMap);
|
||||
}
|
||||
GrpcServiceAndColumn grpcServiceAndColumn = new GrpcServiceAndColumn();
|
||||
grpcServiceAndColumn.setServiceList(grpcDocInfoList);
|
||||
@@ -68,40 +65,48 @@ public class GrpcDocController {
|
||||
List<GrpcDocInfo> grpcDocInfoList = this.getDefinitionByJar(Class.forName(service));
|
||||
String executeResult = "执行失败";
|
||||
if (grpcDocInfoList != null && grpcDocInfoList.size() > 0) {
|
||||
Map<String, Object> paramMap = JSON.parseObject(params, new TypeReference<HashMap<String, Object>>() {});
|
||||
JSONObject paramMap = JSON.parseObject(params);
|
||||
executeResult = this.executeFunction(grpcDocInfoList.get(0), paramMap);
|
||||
}
|
||||
return executeResult;
|
||||
}
|
||||
|
||||
private String executeFunction(GrpcDocInfo grpcDocInfo, Map<String, Object> paramMap) throws Exception {
|
||||
Class<?> aClass = Class.forName(grpcDocInfo.getParamType());
|
||||
Method getMoney = aClass.getMethod("newBuilder");
|
||||
Object newBuilder = getMoney.invoke(aClass);
|
||||
|
||||
List<MethodParam> setterFunction = this.getSetterFunction(newBuilder.getClass());
|
||||
for (MethodParam methodParam : setterFunction) {
|
||||
if (!Const.BASE_TYPE.contains(methodParam.getType())) {
|
||||
Method setName = newBuilder.getClass().getMethod(methodParam.getSetterName(), Class.forName(methodParam.getType()));
|
||||
Object paramObj = paramMap.get(methodParam.getName());
|
||||
if (paramObj != null) {
|
||||
newBuilder = setName.invoke(newBuilder, paramObj);
|
||||
}
|
||||
private void setColumnsInfo(String typeName, Map<String, ColumnInfo> columnsMap) {
|
||||
if (!columnsMap.containsKey(typeName)) {
|
||||
if (allColumnsMap.containsKey(typeName)) {
|
||||
columnsMap.put(typeName, allColumnsMap.get(typeName));
|
||||
} else {
|
||||
ColumnInfo columnInfo = this.findColumnInfo(typeName);
|
||||
columnsMap.put(typeName, columnInfo);
|
||||
allColumnsMap.put(typeName, columnInfo);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String executeFunction(GrpcDocInfo grpcDocInfo, JSONObject paramMap) throws Exception {
|
||||
Object newBuilder = this.createParamBuilder(grpcDocInfo.getParamType(), paramMap);
|
||||
if (newBuilder == null) {
|
||||
return "组装参数失败";
|
||||
}
|
||||
// 创建参数对象
|
||||
Method build = newBuilder.getClass().getMethod("build");
|
||||
Object request = build.invoke(newBuilder);
|
||||
|
||||
Class<?> serviceClass = Class.forName(grpcDocInfo.getService());
|
||||
String serviceSuperName = serviceClass.getSuperclass().getName();
|
||||
String superClassName = serviceSuperName.substring(0, serviceSuperName.indexOf("$"));
|
||||
|
||||
Class<?> superClass = Class.forName(superClassName);
|
||||
Method newBlockingStubMethod = superClass.getMethod("newBlockingStub", Channel.class);
|
||||
Object blockingStub = newBlockingStubMethod.invoke(null, grpcChannelFactory.createChannel());
|
||||
|
||||
System.out.println(request.toString());
|
||||
// 为创建过则创建
|
||||
Object blockingStub = allBlockingStubMap.get(grpcDocInfo.getService());
|
||||
if (blockingStub == null) {
|
||||
// 找到父类
|
||||
Class<?> serviceClass = Class.forName(grpcDocInfo.getService());
|
||||
String serviceSuperName = serviceClass.getSuperclass().getName();
|
||||
String superClassName = serviceSuperName.substring(0, serviceSuperName.indexOf("$"));
|
||||
// 注册
|
||||
Class<?> superClass = Class.forName(superClassName);
|
||||
Method newBlockingStubMethod = superClass.getMethod("newBlockingStub", Channel.class);
|
||||
blockingStub = newBlockingStubMethod.invoke(null, grpcChannelFactory.createChannel());
|
||||
allBlockingStubMap.put(grpcDocInfo.getService(), blockingStub);
|
||||
}
|
||||
Method sayHello = blockingStub.getClass().getMethod(grpcDocInfo.getMethod(), Class.forName(grpcDocInfo.getParamType()));
|
||||
// 执行请求
|
||||
Object response = sayHello.invoke(blockingStub, request);
|
||||
|
||||
// Method messageMethod = response.getClass().getMethod("getMessage");
|
||||
@@ -112,6 +117,36 @@ public class GrpcDocController {
|
||||
return response.toString();
|
||||
}
|
||||
|
||||
private Object createParamBuilder(String paramType, JSONObject paramMap) {
|
||||
try {
|
||||
Class<?> aClassSub = Class.forName(paramType);
|
||||
Method newBuilderMethod = aClassSub.getMethod("newBuilder");
|
||||
Object newBuilder = newBuilderMethod.invoke(aClassSub);
|
||||
List<MethodParam> functionTemp = this.getSetterFunction(newBuilder.getClass());
|
||||
for (MethodParam paramTemp : functionTemp) {
|
||||
Class<?> baseTypeClass = Const.BASE_TYPE.get(paramTemp.getType());
|
||||
if (baseTypeClass != null) {
|
||||
Method setNameSub = newBuilder.getClass().getMethod(paramTemp.getSetterName(), baseTypeClass);
|
||||
Object paramObjTemp = paramMap.getObject(paramTemp.getName(), baseTypeClass);
|
||||
if (paramObjTemp != null) {
|
||||
newBuilder = setNameSub.invoke(newBuilder, paramObjTemp);
|
||||
}
|
||||
} else {
|
||||
Class<?> typeClassSub = Class.forName(paramTemp.getType());
|
||||
Object newBuilderSub = this.createParamBuilder(paramTemp.getType(), paramMap);
|
||||
Method build = newBuilderSub.getClass().getMethod("build");
|
||||
Object request = build.invoke(newBuilderSub);
|
||||
Method setNameSub = newBuilder.getClass().getMethod(paramTemp.getSetterName(), typeClassSub);
|
||||
newBuilder = setNameSub.invoke(newBuilder, request);
|
||||
}
|
||||
}
|
||||
return newBuilder;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String toLowerCaseFirstOne(String str) {
|
||||
if (Character.isLowerCase(str.charAt(0))) {
|
||||
return str;
|
||||
@@ -174,7 +209,7 @@ public class GrpcDocController {
|
||||
ColumnInfo info = new ColumnInfo();
|
||||
info.setType(param.getType());
|
||||
info.setName(param.getName());
|
||||
if (!Const.BASE_TYPE.contains(param.getType())) {
|
||||
if (!Const.BASE_TYPE.containsKey(param.getType())) {
|
||||
List<ColumnInfo> classColumn = this.findClassColumns(Class.forName(param.getType()));
|
||||
info.setParam(classColumn);
|
||||
}
|
||||
|
||||
@@ -3,30 +3,28 @@ package com.zyplayer.doc.grpc.framework.consts;
|
||||
import com.google.protobuf.ByteString;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
public class Const {
|
||||
|
||||
public static final Set<String> BASE_TYPE;
|
||||
public static final Map<String, Class<?>> BASE_TYPE;
|
||||
static {
|
||||
BASE_TYPE = new HashSet<>();
|
||||
BASE_TYPE.add(String.class.getName());
|
||||
BASE_TYPE.add(Integer.class.getName());
|
||||
BASE_TYPE.add(Long.class.getName());
|
||||
BASE_TYPE.add(Double.class.getName());
|
||||
BASE_TYPE.add(Date.class.getName());
|
||||
BASE_TYPE.add(Byte.class.getName());
|
||||
BASE_TYPE.add(Float.class.getName());
|
||||
BASE_TYPE.add(BigDecimal.class.getName());
|
||||
BASE_TYPE.add(ByteString.class.getName());
|
||||
BASE_TYPE = new HashMap<>();
|
||||
BASE_TYPE.put(String.class.getName(), String.class);
|
||||
BASE_TYPE.put(Integer.class.getName(), Integer.class);
|
||||
BASE_TYPE.put(Long.class.getName(), Long.class);
|
||||
BASE_TYPE.put(Double.class.getName(), Double.class);
|
||||
BASE_TYPE.put(Date.class.getName(), Date.class);
|
||||
BASE_TYPE.put(Byte.class.getName(), Byte.class);
|
||||
BASE_TYPE.put(Float.class.getName(), Float.class);
|
||||
BASE_TYPE.put(BigDecimal.class.getName(), BigDecimal.class);
|
||||
BASE_TYPE.put(ByteString.class.getName(), ByteString.class);
|
||||
|
||||
BASE_TYPE.add(char.class.getName());
|
||||
BASE_TYPE.add(int.class.getName());
|
||||
BASE_TYPE.add(long.class.getName());
|
||||
BASE_TYPE.add(double.class.getName());
|
||||
BASE_TYPE.add(byte.class.getName());
|
||||
BASE_TYPE.add(float.class.getName());
|
||||
BASE_TYPE.put(char.class.getName(), char.class);
|
||||
BASE_TYPE.put(int.class.getName(), int.class);
|
||||
BASE_TYPE.put(long.class.getName(), long.class);
|
||||
BASE_TYPE.put(double.class.getName(), double.class);
|
||||
BASE_TYPE.put(byte.class.getName(), byte.class);
|
||||
BASE_TYPE.put(float.class.getName(), float.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,10 +47,10 @@
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="参数:">
|
||||
{{dubboInfo.paramColumn}}
|
||||
<div v-html="dubboInfo.paramColumn"></div>
|
||||
</el-form-item>
|
||||
<el-form-item label="返回值:">
|
||||
{{dubboInfo.resultColumn}}
|
||||
<div v-html="dubboInfo.resultColumn"></div>
|
||||
</el-form-item>
|
||||
<el-form-item label="结果:">
|
||||
<div v-if="dubboInfoResultShow">
|
||||
@@ -74,25 +74,7 @@
|
||||
</el-input>
|
||||
<el-form label-width="100px" label-position="top">
|
||||
<el-form-item label="请求参数:">
|
||||
<el-table :data="docParamRequestList" border style="width: 100%; margin: 10px 0;">
|
||||
<el-table-column label="顺序" width="100">
|
||||
<template slot-scope="scope">{{scope.$index}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="参数名">
|
||||
<template slot-scope="scope">{{scope.row.paramName}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="类型">
|
||||
<template slot-scope="scope">{{scope.row.paramType}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="参数值">
|
||||
<template slot-scope="scope">
|
||||
<el-input v-model="scope.row.paramValue"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="说明">
|
||||
<template slot-scope="scope">{{scope.row.paramDesc}}</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-input type="textarea" :rows="20" placeholder="请求参数" v-model="paramColumnRequest"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="请求结果:">
|
||||
<div v-html="requestResult"></div>
|
||||
@@ -157,6 +139,7 @@
|
||||
searchKeywords: "",
|
||||
docParamList: [],
|
||||
docParamRequestList: [],
|
||||
paramColumnRequest: "",
|
||||
// 参数类型选项
|
||||
paramTypeOptions: [{
|
||||
value: 'java.lang.String'
|
||||
@@ -214,9 +197,12 @@
|
||||
var resultColumn = app.columnMap[grpcInfo.resultType];
|
||||
grpcInfo.method = method;
|
||||
grpcInfo.function = path;
|
||||
grpcInfo.paramColumn = this.columnToJsonString(paramColumn || {});
|
||||
grpcInfo.resultColumn = resultColumn || {};
|
||||
grpcInfo.docInfo = {};
|
||||
var paramColumnTemp = this.columnToJsonString(paramColumn || {});
|
||||
app.paramColumnRequest = JSON.stringify(paramColumnTemp, null, 4);
|
||||
grpcInfo.paramColumn = this.processObjectToHtmlPre(paramColumnTemp);
|
||||
var resultColumnTemp = this.columnToJsonString(resultColumn || {});
|
||||
grpcInfo.resultColumn = this.processObjectToHtmlPre(resultColumnTemp);
|
||||
// 清空再赋值才会重新渲染
|
||||
app.dubboInfo = {};
|
||||
app.dubboInfo = grpcInfo;
|
||||
@@ -230,9 +216,7 @@
|
||||
columnToJsonString(columns){
|
||||
var param = {};
|
||||
if(!!columns.param && columns.param.length > 0) {
|
||||
param[columns.name] = this.columnArrToJsonString(columns.param);
|
||||
} else {
|
||||
param[columns.name] = "";//columns.type;
|
||||
param = this.columnArrToJsonString(columns.param);
|
||||
}
|
||||
return param;
|
||||
},
|
||||
@@ -344,41 +328,37 @@
|
||||
var fuc = app.dubboInfo.function;
|
||||
var service = fuc.substring(0, fuc.lastIndexOf("."));
|
||||
var method = fuc.substring(fuc.lastIndexOf(".") + 1, fuc.length);
|
||||
var paramTypes = [];
|
||||
var params = [];
|
||||
for (var i = 0; i < app.docParamList.length; i++) {
|
||||
var item = app.docParamList[i];
|
||||
if (isNotEmpty(item.paramType) && isNotEmpty(item.paramValue)) {
|
||||
paramTypes.push(item.paramType);
|
||||
params.push(item.paramValue);
|
||||
}
|
||||
}
|
||||
var paramColumnRequest = JSON.stringify(JSON.parse(app.paramColumnRequest));
|
||||
var param = {
|
||||
service: service,
|
||||
method: method,
|
||||
paramTypes: JSON.stringify(paramTypes),
|
||||
params: "{}",//JSON.stringify(params),
|
||||
params: paramColumnRequest,//JSON.stringify(params),
|
||||
};
|
||||
app.requestResult = "";
|
||||
app.onlineDebugLoading = true;
|
||||
ajaxTemp("zyplayer-doc-grpc/execute", "post", "json", param, function (json) {
|
||||
app.onlineDebugLoading = false;
|
||||
if (json.errCode == 200) {
|
||||
try {
|
||||
app.requestResult = Formatjson.processObjectToHtmlPre(JSON.parse(json.data), 0, false, false, false, false);
|
||||
} catch (e) {
|
||||
try {
|
||||
app.requestResult = Formatjson.processObjectToHtmlPre(json.data, 0, false, false, false, false);
|
||||
} catch (e) {
|
||||
app.requestResult = json.data;
|
||||
}
|
||||
}
|
||||
app.requestResult = app.processObjectToHtmlPre(json.data);
|
||||
var paramsJson = JSON.stringify(app.docParamRequestList);
|
||||
app.doSaveDocInfo(null, paramsJson, null, false);
|
||||
} else {
|
||||
app.requestResult = json;
|
||||
}
|
||||
});
|
||||
},
|
||||
processObjectToHtmlPre(data){
|
||||
var requestResult = "";
|
||||
try {
|
||||
requestResult = Formatjson.processObjectToHtmlPre(JSON.parse(data), 0, false, false, false, false);
|
||||
} catch (e) {
|
||||
try {
|
||||
requestResult = Formatjson.processObjectToHtmlPre(data, 0, false, false, false, false);
|
||||
} catch (e) {
|
||||
requestResult = data;
|
||||
}
|
||||
}
|
||||
return requestResult;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user