数据绑定
数据绑定作为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); } } }
更详细的实现可查看组件源码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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存储压测的问题(农码主观意识太强被坑了)