数据绑定
数据绑定作为WebApi的核心数据处理功能,如果应用上支持不够好的情况下,那会大大增加了使用的难度。组件针对数据绑定进行特别的优化,默认提供支持的请求数据有multipart/form-data,x-www-form-urlencoded,Json和流解释器。如有特别的需要的还可以扩展符合应用需要的数据绑定器。
URL绑定
请求URL
/hello?name=xxx
或者
/hello/henry
接收方法
[Get(Route = "{name}")] public object Hello(string name) { return $"hello {name} {DateTime.Now}"; }
/SetValue?id=xxx&value=xxxx
或者
/SetValue/xxx-xxx
接收方法
[Get(Route = "{id}-{value}")] public object SetValue(string id, string value) { return $"{id}={value} {DateTime.Now}"; }
JSON绑定
提交内容
{"name":"xxxx","value":"xxx"}
方法
[Post] [JsonDataConvert] public object Post(string name, string value, IHttpContext context) { Console.WriteLine(context.Data); return $"{name}={value}"; }
或者
[Post] [JsonDataConvert] public object Post(Property body, IHttpContext context) { Console.WriteLine(context.Data); return $"{body.name}={body.value}"; }
[JsonDataConvert]标记可以不用,会根据Content-Type内容来处理,如果加上这标记则不管请求头是什么类型都强行用Json解释。当参数名定义为body的情况,则对应绑定的是整个提交的json内容(这里的Property 是指你实际的业务实体类型,可以根据情况来代替).
form-urlencoded
提交内容
name=aaa&value=aaa
方法
[Post] [FormUrlDataConvert] public object PostForm(string name, string value, IHttpContext context) { Console.WriteLine(context.Data); return $"{name}={value}"; }
multipart/form
[Post] [MultiDataConvert] public object UploadFile(string remark, IHttpContext context) { foreach (var file in context.Request.Files) using (System.IO.Stream stream = System.IO.File.Create(file.FileName)) { file.Data.CopyTo(stream); } return $"{DateTime.Now} {remark} {string.Join(",", (from fs in context.Request.Files select fs.FileName).ToArray())}"; }
数据流
[Post] [NoDataConvert] public object PostStream(IHttpContext context) { Console.WriteLine(context.Data); string value = context.Request.Stream.ReadString(context.Request.Length); return value; }
自定义解释器
组件提供一个数据解释器的规则,只要继承这个规则实现相关方法即可,具体规则如下:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] public abstract class DataConvertAttribute : Attribute { public abstract void Execute(IDataContext dataContext, HttpRequest request); }
以下是相关解释器的实现
public class FormUrlDataConvertAttribute : DataConvertAttribute { public override void Execute(IDataContext dataContext, HttpRequest request) { if (request.Length > 0) { string data = request.Stream.ReadString(request.Length); DataContextBind.BindFormUrl(dataContext, data); } } } public class MultiDataConvertAttribute : DataConvertAttribute { public override void Execute(IDataContext dataContext, HttpRequest request) { if (request.Method == HttpParse.POST_TAG) { DataLoader dataLoader = new DataLoader(request.ContentType); dataLoader.Load(dataContext, request); } } }
更详细的实现可查看组件源码
访问Beetlex的Github

浙公网安备 33010602011771号