/// <summary> /// 绑定路由参数到模版 /// </summary> /// <param name="template">路由模版</param> /// <param name="parameter">参数</param> /// <returns></returns> private string GetPathQuery(string template, ApiParameterDescriptor parameter) { var _params = new RouteValueDictionary(); if (parameter.IsUriParameterType) { _params.Add(parameter.Name, string.Format(CultureInfo.InvariantCulture, "{0}", parameter.Value)); } else if (parameter.ParameterType.IsArray && parameter.Value is Array array) { foreach (var item in array) { _params.Add(parameter.Name, string.Format(CultureInfo.InvariantCulture, "{0}", item)); } } else { var instance = parameter.Value; var instanceType = parameter.ParameterType; var properties = Property.GetProperties(instanceType); foreach (var p in properties) { var value = instance == null ? null : p.GetValue(instance); _params.Add(p.Name, string.Format(CultureInfo.InvariantCulture, "{0}", value)); } } return(BoundTemplate(template, _params)); }
/// <summary> /// 生成数组的表单内容 /// </summary> /// <param name="parameter">参数</param> /// <param name="encoding">编码</param> /// <returns></returns> private string GetContentArray(ApiParameterDescriptor parameter, Encoding encoding) { if (!(parameter.Value is Array array)) { return(null); } var keyValues = array.Cast <object>().Select(item => this.GetContentSimple(parameter.Name, item, encoding)); return(string.Join("&", keyValues)); }
/// <summary> /// 获取http请求内容 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> protected override HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter) { var xmlSerializer = new XmlSerializer(parameter.ParameterType); using (var stream = new MemoryStream()) { xmlSerializer.Serialize(stream, parameter.Value); var xml = Encoding.UTF8.GetString(stream.ToArray()); return(new StringContent(xml, Encoding.UTF8, "application/xml")); } }
/// <summary> /// http请求之前 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> public override async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter) { if (this.IgnoreWhenNull && parameter.Value == null) { return; } var uri = context.RequestMessage.RequestUri; var baseUrl = uri.Scheme + "://" + uri.Host + (uri.IsDefaultPort ? "" : ":" + uri.Port); var pathQuery = GetPathQuery(uri.LocalPath.Trim('/'), parameter); context.RequestMessage.RequestUri = new Uri(new Uri(baseUrl), pathQuery); await TaskExtensions.CompletedTask; }
/// <summary> /// http请求之前 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> public override async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter) { if (this.IgnoreWhenNull && parameter.Value == null) { return; } var uri = context.RequestMessage.RequestUri; var pathQuery = this.GetPathQuery(uri.LocalPath + uri.Query, parameter); context.RequestMessage.RequestUri = new Uri(uri, pathQuery); await TaskExtensions.CompletedTask; }
/// <summary> /// 生成复杂类型的表单内容 /// </summary> /// <param name="parameter">参数</param> /// <param name="encoding">编码</param> /// <returns></returns> private string GetContentComplex(ApiParameterDescriptor parameter, Encoding encoding) { var instance = parameter.Value; var keyValues = Property .GetProperties(parameter.ParameterType) .Select(p => { var value = instance == null ? null : p.GetValue(instance); return(this.GetContentSimple(p.Name, value, encoding)); }); return(string.Join("&", keyValues)); }
/// <summary> /// 生成表单内容 /// key1=value1&key2=value2 /// </summary> /// <param name="parameter">参数</param> /// <param name="encoding">编码</param> /// <returns></returns> protected virtual string GetFormContent(ApiParameterDescriptor parameter, Encoding encoding) { if (parameter.IsSimpleType == true) { return(this.GetContentSimple(parameter.Name, parameter.Value, encoding)); } else if (parameter.ParameterType.IsArray == true) { return(this.GetContentArray(parameter, encoding)); } return(this.GetContentComplex(parameter, encoding)); }
/// <summary> /// 获取新的Path与Query /// </summary> /// <param name="pathQuery">原始path与query</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> private string GetPathQuery(string pathQuery, ApiParameterDescriptor parameter) { if (parameter.IsSimpleType == true) { return(this.GetPathQuerySimple(pathQuery, parameter.Name, parameter.Value)); } if (parameter.ParameterType.IsArray == true) { return(this.GetPathQueryArray(pathQuery, parameter)); } return(this.GetPathQueryComplex(pathQuery, parameter)); }
/// <summary> /// 获取新的Path与Query /// </summary> /// <param name="pathQuery">原始path与query</param> /// <param name="parameter">参数</param> /// <returns></returns> private string GetPathQueryComplex(string pathQuery, ApiParameterDescriptor parameter) { var instance = parameter.Value; var instanceType = parameter.ParameterType; var properties = Property.GetProperties(instanceType); foreach (var p in properties) { var value = instance == null ? null : p.GetValue(instance); pathQuery = this.GetPathQuerySimple(pathQuery, p.Name, value); } return(pathQuery); }
/// <summary> /// 获取新的Path与Query /// </summary> /// <param name="pathQuery">原始path与query</param> /// <param name="parameter">参数</param> /// <returns></returns> private string GetPathQueryArray(string pathQuery, ApiParameterDescriptor parameter) { var array = parameter.Value as Array; if (array == null) { return(pathQuery); } foreach (var item in array) { pathQuery = this.GetPathQuerySimple(pathQuery, parameter.Name, item); } return(pathQuery); }
/// <summary> /// 生成ApiParameterDescriptor /// </summary> /// <param name="parameter">参数信息</param> /// <param name="index">参数索引</param> /// <returns></returns> private static ApiParameterDescriptor GetParameterDescriptor(ParameterInfo parameter, int index) { var parameterDescriptor = new ApiParameterDescriptor { Name = parameter.Name, Index = index, ParameterType = parameter.ParameterType, IsSimpleType = CastleContext.IsSimple(parameter.ParameterType), Attributes = parameter.GetCustomAttributes <ApiParameterAttribute>(true).ToArray() }; if (typeof(HttpContent).IsAssignableFrom(parameter.ParameterType)) { parameterDescriptor.Attributes = new[] { new HttpContentAttribute() }; } else if (parameterDescriptor.Attributes.Length == 0) { parameterDescriptor.Attributes = new[] { new PathQueryAttribute() }; } return(parameterDescriptor); }
/// <summary> /// 获取http请求内容 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的属性</param> /// <returns></returns> protected virtual HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter) { return(parameter.Value as HttpContent); }
/// <summary> /// http请求之前 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> public sealed override async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter) { if (context.RequestMessage.Method == HttpMethod.Get) { return; } var httpContent = this.GetHttpContent(context, parameter); context.RequestMessage.Content = httpContent; await TaskExtensions.CompletedTask; }
/// <summary> /// http请求之前 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> public abstract Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter);
/// <summary> /// 获取http请求内容 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> protected override HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter) { var json = parameter.Value == null ? null : context.HttpApiClient.JsonFormatter.Serialize(parameter.Value); return(new StringContent(json, Encoding.UTF8, "application/json")); }
/// <summary> /// 获取http请求内容 /// </summary> /// <param name="context">上下文</param> /// <param name="parameter">特性关联的参数</param> /// <returns></returns> protected sealed override HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter) { var encoding = Encoding.UTF8; var body = this.GetFormContent(parameter, encoding); return(new StringContent(body, encoding, "application/x-www-form-urlencoded")); }