/// <summary> /// 是否支持RequestContent /// </summary> /// <param name="method"></param> /// <param name="requestMappingBaseAttribute"></param> /// <returns></returns> protected bool SupportRequestContent(MethodInfo method, RequestMappingBaseAttribute requestMappingBaseAttribute) { return (requestMappingBaseAttribute.IsHttpMethod(HttpMethod.Post) || requestMappingBaseAttribute.IsHttpMethod(HttpMethod.Put) || requestMappingBaseAttribute.IsHttpMethod(HttpMethod.Delete)); }
/// <summary> /// 处理参数 /// </summary> /// <param name="typeBuilder"></param> /// <param name="requestMapping"></param> /// <param name="iLGenerator"></param> /// <param name="method"></param> /// <param name="uri"></param> /// <returns></returns> protected List <EmitRequestContent> EmitParameter(TypeBuilder typeBuilder, RequestMappingBaseAttribute requestMapping, ILGenerator iLGenerator, MethodInfo method, LocalBuilder uri) { int index = 0; List <EmitRequestContent> emitRequestContents = new List <EmitRequestContent>(); foreach (var parameterInfo in method.GetParameters()) { index++; if (parameterInfo.GetCustomAttributes().Any(s => s is INotRequestParameter)) { continue; } if (typeof(IHttpRequestFileForm).IsAssignableFrom(parameterInfo.ParameterType)) { emitRequestContents.Add(new EmitRequestContent { MediaType = Constants.MediaTypes.MULTIPART_FORMDATA, Parameter = parameterInfo, SupportMultipart = false, ParameterIndex = index }); continue; } if (typeof(IHttpRequestFile).IsAssignableFrom(parameterInfo.ParameterType)) { emitRequestContents.Add(new EmitRequestContent { MediaType = Constants.MediaTypes.FORMDATA, Parameter = parameterInfo, SupportMultipart = true, ParameterIndex = index }); continue; } if (parameterInfo.IsDefined(typeof(RequestBodyAttribute))) { emitRequestContents.Add(new EmitRequestContent { MediaType = Constants.MediaTypes.APPLICATION_JSON, Parameter = parameterInfo, SupportMultipart = false, ParameterIndex = index }); continue; } if (parameterInfo.IsDefined(typeof(RequestFormAttribute))) { emitRequestContents.Add(new EmitRequestContent { MediaType = Constants.MediaTypes.APPLICATION_FORM_URLENCODED, Parameter = parameterInfo, SupportMultipart = true, ParameterIndex = index }); continue; } MethodInfo replaceValueMethod; string name; if (parameterInfo.IsDefined(typeof(RequestParamAttribute))) { //如果是 HttpGet , 拼接到url上 if (requestMapping.IsHttpMethod(HttpMethod.Get) || requestMapping.IsHttpMethod(HttpMethod.Head)) { name = parameterInfo.GetCustomAttribute <RequestParamAttribute>().Name ?? parameterInfo.Name; //replaceValueMethod = ReplaceRequestParamMethod; replaceValueMethod = GetReplaceRequestQueryMethod(typeBuilder, parameterInfo.ParameterType); } else { emitRequestContents.Add(new EmitRequestContent { MediaType = Constants.MediaTypes.APPLICATION_FORM_URLENCODED, Parameter = parameterInfo, SupportMultipart = true, ParameterIndex = index }); continue; } } else if (parameterInfo.IsDefined(typeof(RequestQueryAttribute))) { name = parameterInfo.Name; //replaceValueMethod = ReplaceRequestQueryMethod; replaceValueMethod = GetReplaceRequestQueryMethod(typeBuilder, parameterInfo.ParameterType); } else { name = parameterInfo.IsDefined(typeof(PathVariableAttribute)) ? parameterInfo.GetCustomAttribute <PathVariableAttribute>().Name : parameterInfo.Name; //replaceValueMethod = ReplacePathVariableMethod; replaceValueMethod = GetReplacePathVariableMethod(typeBuilder, parameterInfo.ParameterType); } if (string.IsNullOrWhiteSpace(name)) { name = parameterInfo.Name; } iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldloc, uri); iLGenerator.Emit(OpCodes.Ldstr, name); iLGenerator.Emit(OpCodes.Ldarg_S, index); iLGenerator.Emit(OpCodes.Call, replaceValueMethod); iLGenerator.Emit(OpCodes.Stloc, uri); } return(emitRequestContents); }