Skip to content

数据绑定

Henry edited this page Sep 10, 2019 · 1 revision

数据绑定作为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);
            }
        }
    }

更详细的实现可查看组件源码