IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> .Net Core WebAPI 绑定源参数推理、接收http参数写法(SuppressInferBindingSourcesForParameters ) -> 正文阅读

[网络协议].Net Core WebAPI 绑定源参数推理、接收http参数写法(SuppressInferBindingSourcesForParameters )

背景:.Net Core WebAPI 控制器中接收参数一般情况下分为简单类型(int、string、double....)、实体类dto、数据集合类型。

?事实上,http请求可以把请求参数放到query、header、form、body中,而.net core WebAPI中默认启用了推理规则,可以自动推理参数在哪里并传入控制器参数中

特性绑定源
[FromBody]请求正文
[FromForm]请求正文中的表单数据
[FromHeader]请求标头
[FromQuery]请求查询字符串参数
[FromRoute]当前请求中的路由数据
[FromServices]作为操作参数插入的请求服务

只是开启默认推理规则时,对于简单类型参数的接收,不能推理出去哪里接收,需要显示指定为[FromForm]或者[FromBody]

以下是默认规则下的接收参数方式:

    /// <summary>
    /// 默认启用参数推理规则时
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {

        [HttpPost]
        public ActionResult AddFormPara1([FromForm]string id)
        {
            //application/x-www-form-urlencoded
            //对于简单类型(string、int),推理不出来,所以需要显示指定参数来源FromForm
            var context = HttpContext.Request;
            return Ok(new { id = id });
        }

        [HttpPost]
        public ActionResult AddFormPara([FromForm] string id, [FromForm] string name)
        {
            //application/x-www-form-urlencoded
            //对于简单类型(string、int),推理不出来,所以需要显示指定参数来源FromForm
            var context = HttpContext.Request;
            return Ok(new { id = id, name = name });
        }

        [HttpPost]
        public IActionResult AddJsonPara1([FromBody] string id)
        {
            //json格式请求过来时Request中的data直接就是id的值,例:data:"111"
            var context = HttpContext.Request;
            return Ok(new { id = id });
        }


        [HttpPost]
        public ActionResult AddJsonPara(dto dto)
        {
            //application/json {"id":"111","name":"winston"}
            var context = HttpContext.Request;
            return Ok(new { id = dto.id, name = dto.name });
        }

        [HttpPost]
        public ActionResult AddJsonParaList(List<dto> dto)
        {
            application/json [{"id":"111","name":"winston"}]
            var context = HttpContext.Request;
            return Ok(dto);
        }
    
        //[HttpPost]
        //public ActionResult AddJsonPara1([FromBody] string id, [FromBody] string name)
        //{
        //    //这种写法是不行的,FromBody只能指定一个参数
        //    var context = HttpContext.Request;
        //    return Ok(new { id = id, name = name });
        //}
    }


    public class dto
    {
        public string id { get; set; }

        public string name { get; set; }

    }

如果不想开启默认推理规则,即可以通过配置SuppressInferBindingSourcesForParameters来禁用

   services.AddControllers(options =>
            {
                
            }).ConfigureApiBehaviorOptions(options =>
            {
                //options.SuppressConsumesConstraintForFormFileParameters = true;//禁用当[FromForm]属性批注时,推理multipart/form-data请求内容类型
                options.SuppressInferBindingSourcesForParameters = true;//禁用api的推理规则,这样就支持post方式直接括号接受参数和model参数方式
            });

禁用推理规则后,WebApi默认从form中取参,此时接参方式:

    /// <summary>
    /// 禁用参数推理规则时
    /// </summary>
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class Test1Controller : ControllerBase
    {

        [HttpPost]
        public IActionResult AddFormPara1(string id)
        {
            //application/x-www-form-urlencoded
            //禁用推理规则后,application/x-www-form-urlencoded对于简单类型就不需要显示指定参数来源FromForm
            //但对于application/json的还是接不到
            var context = HttpContext.Request;
            return Ok(new { id = id });
        }

        [HttpPost]
        public IActionResult AddFormPara(string id,string name)
        {
            //application/x-www-form-urlencoded
            //禁用推理规则后,application/x-www-form-urlencoded对于简单类型就不需要显示指定参数来源FromForm
            //但对于application/json的还是接不到
            var context = HttpContext.Request;
            return Ok(new { id = id, name = name });
        }

        [HttpPost]
        public IActionResult AddJsonPara(dto1 dto)
        {
            //application/x-www-form-urlencoded
            //禁用推理规则后,依然可以用实体类来接收json格式数据,但前提是application/x-www-form-urlencoded
            var context = HttpContext.Request;
            return Ok(new { id = dto.id, name = dto.name });
        }

        [HttpPost]
        public IActionResult AddListJsonPara([FromBody]List<dto1> dto)
        {
            //禁用推理规则后,对于json格式数据集合参数,需指定FromBody
            var context = HttpContext.Request;
            return Ok(dto);
        }
    }

    public class dto1
    {
        public string id { get; set; }

        public string name { get; set; }

    }

总结:对于.Net Core WebAPI的默认推理规则,最好还是要开启,只是针对简单类型,需要显示指定FromBody或者FromForm,但是对于json格式参数和数据集合参数接收良好。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:15:05  更:2022-04-22 19:17:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:40:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码