package grmi
|
|
|
|
import (
|
|
"LEIT_PM/container"
|
|
"LEIT_PM/rpc"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/kataras/iris/v12"
|
|
"reflect"
|
|
)
|
|
|
|
type ParameterInfo struct {
|
|
Type reflect.Type
|
|
UrlParameterName string
|
|
Parser ParameterParser
|
|
}
|
|
|
|
func buildStringFromUrlParameterParser(urlParameterName string) ParameterParser {
|
|
return func(context iris.Context) (interface{}, error) {
|
|
return context.Params().Get(urlParameterName), nil
|
|
}
|
|
}
|
|
|
|
var getMoudleNameFromUrlParameter = buildStringFromUrlParameterParser("moudleName")
|
|
|
|
var getModelNameFromUrlParameter = buildStringFromUrlParameterParser("modelName")
|
|
|
|
func BuildParserOfType(bodyParser rpc.ValueParser) ParameterParser {
|
|
|
|
return func(context iris.Context) (interface{}, error) {
|
|
|
|
if context.GetContentLength() <= 0 {
|
|
return nil, nil
|
|
}
|
|
var json interface{}
|
|
err := context.ReadJSON(&json)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
entityValue, err := bodyParser(json, "json")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return nil, err
|
|
}
|
|
return entityValue, nil
|
|
}
|
|
}
|
|
|
|
func getJsonObjectFromHttpContent(context iris.Context) (interface{}, error) {
|
|
var json interface{}
|
|
if context.GetContentLength() <= 0 {
|
|
return nil, errors.New(fmt.Sprintf("未找到内容!"))
|
|
}
|
|
err := context.ReadJSON(&json)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if json == nil {
|
|
return nil, errors.New(fmt.Sprintf("JSON解析失败!"))
|
|
}
|
|
jsonObject, ok := json.(map[string]interface{})
|
|
if !ok {
|
|
return nil, errors.New(fmt.Sprintf("JSON对象解析失败!"))
|
|
}
|
|
return jsonObject, nil
|
|
}
|
|
|
|
func getJsonListFromHttpContent(context iris.Context) (interface{}, error) {
|
|
var json interface{}
|
|
if context.GetContentLength() <= 0 {
|
|
return nil, errors.New(fmt.Sprintf("未找到内容!"))
|
|
}
|
|
err := context.ReadJSON(&json)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if json == nil {
|
|
return nil, errors.New(fmt.Sprintf("JSON解析失败!"))
|
|
}
|
|
jsonList, ok := json.([]interface{})
|
|
if !ok {
|
|
return nil, errors.New(fmt.Sprintf("JSON数组解析失败!"))
|
|
}
|
|
return jsonList, nil
|
|
}
|
|
|
|
func getUrlParameters(context iris.Context) (interface{}, error) {
|
|
return context.URLParams(), nil
|
|
}
|
|
|
|
func buildParametersParser(parsers []ParameterParser) func(context iris.Context) ([]interface{}, error) {
|
|
|
|
return func(context iris.Context) ([]interface{}, error) {
|
|
parameters := make([]interface{}, len(parsers))
|
|
for i := 0; i < len(parsers); i++ {
|
|
parser := parsers[i]
|
|
value, err := parser(context)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
parameters[i] = value
|
|
}
|
|
return parameters, nil
|
|
}
|
|
}
|
|
|
|
var MoudleNameInfo = &ParameterInfo{
|
|
container.StringType,
|
|
"moudleName",
|
|
getMoudleNameFromUrlParameter,
|
|
}
|
|
|
|
var ModelNameInfo = &ParameterInfo{
|
|
container.StringType,
|
|
"modelName",
|
|
getModelNameFromUrlParameter,
|
|
}
|
|
|
|
var JsonObjectContentInfo = &ParameterInfo{
|
|
container.JsonObjectType,
|
|
"",
|
|
getJsonObjectFromHttpContent,
|
|
}
|
|
|
|
var JsonListContentInfo = &ParameterInfo{
|
|
container.JsonListType,
|
|
"",
|
|
getJsonListFromHttpContent,
|
|
}
|
|
|
|
var UrlParametersInfo = &ParameterInfo{
|
|
reflect.TypeOf(map[string]string{}),
|
|
"",
|
|
getUrlParameters,
|
|
}
|
|
|
|
func BuildWebParser(httpMethod container.HttpMethod, inInfos []*ParameterInfo, outTypes []reflect.Type) container.WebParser {
|
|
return func(serviceMethodName string, methodType container.Method) (container.HttpMethod, container.ParametersParser, string, error) {
|
|
if methodType.NumIn() != len(inInfos)+1 {
|
|
return "", nil, "", errors.New(fmt.Sprintf("参数数量错误! Service: %s 参数数量: %d", serviceMethodName, methodType.NumIn()))
|
|
}
|
|
path := ""
|
|
parsers := make([]ParameterParser, len(inInfos))
|
|
for i := 1; i <= len(inInfos); i++ {
|
|
inInfo := inInfos[i-1]
|
|
urlParameterName := inInfo.UrlParameterName
|
|
if urlParameterName != "" {
|
|
path += fmt.Sprintf("/{%s}", urlParameterName)
|
|
}
|
|
inType := inInfo.Type
|
|
if inType == nil {
|
|
if !container.IsEmptyInterface(methodType.In(i)) {
|
|
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型错误! Service: %s 参数类型: %s", i, serviceMethodName, inType.String()))
|
|
}
|
|
} else {
|
|
if methodType.In(i) != inType {
|
|
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型错误! Service: %s 参数类型: %s", i, serviceMethodName, inType.String()))
|
|
}
|
|
}
|
|
parsers[i-1] = inInfo.Parser
|
|
}
|
|
if methodType.NumOut() != len(outTypes)+1 {
|
|
return "", nil, "", errors.New(fmt.Sprintf("返回值数量错误! Service: %s 返回值数量: %d", serviceMethodName, methodType.NumOut()))
|
|
}
|
|
for i := 0; i <= len(outTypes)-1; i++ {
|
|
outType := outTypes[i]
|
|
if outType == nil {
|
|
if !container.IsEmptyInterface(methodType.Out(i)) {
|
|
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型不能为空! Service: %s", i, serviceMethodName))
|
|
}
|
|
} else {
|
|
if methodType.Out(i) != outType {
|
|
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型错误! Service: %s 参数类型: %s", i, serviceMethodName, outType.String()))
|
|
}
|
|
}
|
|
}
|
|
return httpMethod, buildParametersParser(parsers), path, nil
|
|
}
|
|
}
|