数据绑定

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

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

posted @   beetlex  阅读(255)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2018-09-17 dotnet core高吞吐Http api服务组件FastHttpApi
2014-09-17 azure存储压测的问题(农码主观意识太强被坑了)
点击右上角即可分享
微信分享提示