package rpc import ( "github.com/kataras/iris/v12" "LAPP_AS/container" "LAPP_AS/global" "LAPP_AS/web/middleware/jwts" "LAPP_AS/web/supports" "reflect" ) var DefaultMethodInvokerBuilder = &RouteBuilder{&MethodInvokerBuilder{&ValueParserBuilder{}, map[reflect.Type]valueParser{container.RequestContextType: keepValue}}} type RouteBuilder struct { methodInvokerBuilder *MethodInvokerBuilder } func (builder *RouteBuilder) Build(callerFactory func(string, *global.User) (container.Caller, error), serviceMethodName string, methodType reflect.Type) (container.HttpMethod, string, container.Router, error) { router := func(context iris.Context) { var json interface{} var jsonArray []interface{} if context.GetContentLength() > 0 { if nil != context.ReadJSON(&json) { supports.Error(context, iris.StatusBadRequest, "JSON解析失败!", nil) return } if json != nil { if jsonObject, ok := json.([]interface{}); !ok { supports.Error(context, iris.StatusBadRequest, "JSON解析失败!", nil) return } else { jsonArray = jsonObject } } } user, signature, ok := jwts.ParseTokenAndSignature(context) if !ok { supports.Error(context, iris.StatusBadRequest, supports.ParseParamsFailur, nil) return } requestContext, err := container.NewRequestContext("rc", context) if err != nil { supports.Error(context, iris.StatusInternalServerError, err.Error(), nil) return } jsonArray = append([]interface{}{requestContext}, jsonArray...) caller, err := callerFactory(user.UserId+signature, user) if err != nil { supports.Error(context, iris.StatusInternalServerError, err.Error(), nil) return } methodInvoker, err := builder.methodInvokerBuilder.buildMethodInvoker(serviceMethodName, methodType, caller) if err != nil { supports.Error(context, iris.StatusInternalServerError, err.Error(), nil) return } defer func() { if err := recover(); err != nil { supports.Error(context, iris.StatusInternalServerError, "内部错误", nil) return } }() if result, err := methodInvoker.Process(jsonArray); err != nil { supports.Error(context, iris.StatusInternalServerError, err.Error(), nil) } else { supports.Ok(context, supports.OptionSuccess, result) } } return container.HttpPost, "", router, nil }