using Serein.Library; using Serein.Library.Api; using Serein.Library.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; namespace Serein.Proto.HttpApi { /// /// api请求处理模块 /// public class ApiHandleConfig { private readonly DelegateDetails delegateDetails; /// /// Post请求处理方法中,入参参数类型 /// public enum PostArgType { /// /// 不做处理 /// None, /// /// 使用Url参数 /// IsUrlData, /// /// 使用整体的Boby参数 /// IsBobyData, } /// /// 添加处理配置 /// /// public ApiHandleConfig(RouterInfo routerInfo) { var methodInfo = routerInfo.MethodInfo; delegateDetails = new DelegateDetails(methodInfo); var parameterInfos = methodInfo.GetParameters(); ParameterType = parameterInfos.Select(t => t.ParameterType).ToArray(); ParameterName = parameterInfos.Select(t => t.Name!).ToArray(); PostArgTypes = parameterInfos.Select(p => { bool isUrlData = p.GetCustomAttribute(typeof(UrlAttribute)) != null; bool isBobyData = p.GetCustomAttribute(typeof(BodyAttribute)) != null; if (isBobyData) { return PostArgType.IsBobyData; } else if (isUrlData) { return PostArgType.IsUrlData; } else { return PostArgType.None; } }).ToArray(); RouterInfo = routerInfo; } /// /// 路由信息 /// public RouterInfo RouterInfo { get; } /// /// Post请求处理方法中,入参参数类型 /// public PostArgType[] PostArgTypes { get;private set; } /// /// 参数名称 /// public string[] ParameterName { get; private set; } /// /// 参数类型 /// public Type[] ParameterType { get; private set; } /// /// 处理Get请求 /// /// public object?[] GetArgsOfGet(Dictionary routeData) { object?[] args = new object[ParameterType.Length]; for (int i = 0; i < ParameterType.Length; i++) { var type = ParameterType[i]; var argName = ParameterName[i]; if (routeData.TryGetValue(argName, out var argValue)) { if (type == typeof(string)) { args[i] = argValue; } else // if (type.IsValueType) { args[i] = JsonHelper.Deserialize(argValue, type); // JsonConvert.DeserializeObject(argValue, type); } } else { args[i] = type.IsValueType ? Activator.CreateInstance(type) : null; } } return args; } /// /// 从 POST 获取参数 /// /// /// /// public (bool, int, Type, Exception?) TryGetArgsOfPost(Dictionary routeData, IJsonToken jsonObject, out object?[] argData) { argData = null; object?[] args = new object[ParameterType.Length]; int i = 0; try { for (; i < ParameterType.Length; i++) { var type = ParameterType[i]; var argName = ParameterName[i]; if (PostArgTypes[i] == PostArgType.IsUrlData) { if (routeData.TryGetValue(argName, out var argValue)) { if (type == typeof(string)) { args[i] = argValue; } else // if (type.IsValueType) { args[i] = JsonHelper.Deserialize(argValue, type); } } else { args[i] = type.IsValueType ? Activator.CreateInstance(type) : null; } } else if (jsonObject != null && PostArgTypes[i] == PostArgType.IsBobyData) { if (type.IsEnum) { args[i] = jsonObject.ToObject(type); } else { args[i] = jsonObject.ToObject(type); } } else if (jsonObject != null) { if (jsonObject.TryGetValue(argName, out var jsonToken)) { args[i] = jsonToken.ToObject(type); } else { args[i] = type.IsValueType ? Activator.CreateInstance(type) : null; } } } argData = args; return (true ,-1, null, null); } catch (Exception ex) { argData = []; return (false,i, ParameterType[i], ex); } } /// /// 处理请求 /// /// /// /// public async Task HandleAsync(object instance, object?[] args) { var result = await delegateDetails.InvokeAsync(instance, args); return result; } } }