-
-
Notifications
You must be signed in to change notification settings - Fork 175
数据绑定
Henry edited this page Sep 10, 2019
·
1 revision
数据绑定作为WebApi
的核心数据处理功能,如果应用上支持不够好的情况下,那会大大增加了使用的难度。组件针对数据绑定进行特别的优化,默认提供支持的请求数据有multipart/form-data
,x-www-form-urlencoded
,Json
和流解释器。如有特别的需要的还可以扩展符合应用需要的数据绑定器。
请求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}";
}
提交内容
{"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
是指你实际的业务实体类型,可以根据情况来代替).
提交内容
name=aaa&value=aaa
方法
[Post]
[FormUrlDataConvert]
public object PostForm(string name, string value, IHttpContext context)
{
Console.WriteLine(context.Data);
return $"{name}={value}";
}
[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);
}
}
}
更详细的实现可查看组件源码