获取body参数_WebApi 中请求的JSON数据字段作为POST参数传入

使用 POST 方式请求 JSON 数据到服务器 WebAPI 接口时需要将 JSON 格式封装成数据模型接收参数。即使参数较少,每个接口仍然需要单独创建模型接收。下面方法实现了将 JSON 参数中的字段作为接口参数接收。实现的并不完美,现在只支持 JSON 格式顶级结构字段作为参数使用,且未处理复杂格式参数。

  每个接收参数都会进行 JSON 反序列化操作,故参数多的情况下创建模型接收显然更节省资源。

  以下方法只进行过简单测试,如有问题,还请大佬们自行解决,解决后希望能在此留言与诸位网友分享。

POST 提交的 JSON 数据演示:

{'Code':10000,Msg:'中文测试'}

WebApi 中获取方式:

        [HttpPost]        public string Post([FromJson]int Code,[FromJson]string Msg)        {            return "OK";        }
f92177b19ec5ce0089b05e9756841170.png

FromJson 类:

    public class FromJsonAttribute : Attribute, IBindingSourceMetadata    {        public BindingSource BindingSource        {            get            {                return BindingSource.Custom;            }        }    }

ModelBuilder 类:

    public class JsonParameterModelBinder : IModelBinder    {        private readonly BodyModelBinder bodyModelBinder;        public JsonParameterModelBinder(IList formatters, IHttpRequestStreamReaderFactory readerFactory)        {            bodyModelBinder = new BodyModelBinder(formatters, readerFactory);        }        public Task BindModelAsync(ModelBindingContext bindingContext)        {            if (bindingContext == null)                throw new ArgumentNullException(nameof(bindingContext));            var postStr = string.Empty;            using (StreamReader sr = new StreamReader(bindingContext.HttpContext.Request.Body))                postStr = sr.ReadToEndAsync().Result;            var jobj = Newtonsoft.Json.JsonConvert.DeserializeObject(postStr);            var val = jobj[bindingContext.FieldName]?.ToObject();            if (val != null)                bindingContext.Result = ModelBindingResult.Success(Convert.ChangeType(val, bindingContext.ModelType, null));            //将流重新写回 Request.Body 不然第二个参数再操作时会报错            bindingContext.HttpContext.Request.Body = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(postStr));            return Task.CompletedTask;        }    }

Provider 类:

    public class JsonParameterModelBinderProvider : IModelBinderProvider    {        private readonly IList _formatters;        public JsonParameterModelBinderProvider(IList Formatters)        {            _formatters = Formatters;        }        public IModelBinder GetBinder(ModelBinderProviderContext context)        {            if (context == null)                throw new ArgumentNullException(nameof(context));            if (context.BindingInfo.BindingSource != null && context.BindingInfo.BindingSource.CanAcceptDataFrom(BindingSource.Custom))                return new JsonParameterModelBinder(_formatters, context.Services.GetRequiredService());            return null;        }    }

修改 Startup.cs 的 void ConfigureServices(IServiceCollection services) 方法,增加:

            services.AddMvc(options =>            {                options.ModelBinderProviders.Insert(0, new JsonParameterModelBinderProvider(options.InputFormatters));            });

插入到 0 位置,优先处理,尽量不要使用 Add 方法插入到末位,否则可能不会被处理。

以上代码在 .Net 5 下测试通过。其他框架版本未测试。

作者:OAngs

链接:https://www.cnblogs.com/oangs/p/14273813.html

2fcf740f07505a01c39e1fdf0b193035.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 .NET WebAPI ,我们可以通过多种方式接收参数。以下是其一些常用的方式: 1. 通过 URI 的查询字符串传递参数 我们可以使用 [FromUri] 特性来获取从 URI 传递的参数。例如,以下代码演示了如何通过查询字符串传递参数: ```csharp public IHttpActionResult Get([FromUri] string name, [FromUri] int age) { // 处理参数 } ``` 在这个例子,我们使用 [FromUri] 特性将 name 和 age 参数标记为从 URI 获取。如果我们发出 GET 请求 `http://example.com/api/person?name=John&age=30`,那么 WebAPI 将正确地将 name 和 age 参数设置为 "John" 和 30。 2. 通过请求正文传递参数 我们可以使用 [FromBody] 特性将参数绑定到请求正文数据。例如,以下代码演示了如何使用 [FromBody] 特性传递一个自定义对象: ```csharp public IHttpActionResult Post([FromBody] Person person) { // 处理 person 对象 } ``` 在这个例子,我们使用 [FromBody] 特性将 person 参数标记为从请求正文获取。如果我们发送一个 POST 请求,并将以下 JSON 数据作为请求正文发送: ```json { "Name": "John", "Age": 30 } ``` 那么 WebAPI 将正确地将 person 对象设置为一个名为 "John" 年龄为 30 的 person 对象。 3. 通过请求头传递参数 我们可以使用 [FromHeader] 特性将参数绑定到请求的值。例如,以下代码演示了如何使用 [FromHeader] 特性传递一个字符串参数: ```csharp public IHttpActionResult Get([FromHeader] string authToken) { // 处理 authToken } ``` 在这个例子,我们使用 [FromHeader] 特性将 authToken 参数标记为从请求获取。如果我们发送一个 GET 请求,并将以下请求头包含在其: ``` authToken: 123456 ``` 那么 WebAPI 将正确地将 authToken 参数设置为 "123456"。 以上是 .NET WebAPI 接收参数的一些常用方式,但还有其他方式可以使用。根据不同的场景和需求,我们可以使用不同的方式来接收参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值