文档章节

.net core Web API参数绑定规则

o
 osc_wcq210y3
发布于 07/04 07:24
字数 941
阅读 169
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

参数推理绑定

先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到。
Web API代码(.netcore 3.1)如下:

[HttpGet("Login")]
public LoginResult Login(string code)
{
  ...
}
[HttpPost("PostAvatar")]
public BaseResult<string> PostAvatar(int id,string imgUrl)
{
...
}

客户端代码(微信小程序js)如下:

    wx.request({
      url: '/api/Login',
      data:{code:'xxx'},
      method:'GET',
      success:function(res){}
    })
    wx.request({
      url: '/api/PostAvatar',
      data: { id: 1,imgUrl:'xxx' },
      method: 'POST',
      success: function (res) { }
    })

后来发现如果把参数放在一个实体里就可以接收到,像这样

[HttpPost("PostAvatar")]
public BaseResult<string> PostAvatar(Avatar model)
{
...
}
...
public class Avatar 
{
   public int Id { get; set; }
   public string imgUrl{ get; set; }
}

于是找到官方文档对于绑定源参数推理的解释:

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





Web API 还有一套默认的推理规则,意思就是上面的这些特性可以加在参数的前面用来强制的指定这个参数是用那种方式获取,但是如果不显式的声明,它会按照这套规则默认匹配。规则如下:

绑定源推理规则的行为如下:
[FromBody] 针对复杂类型参数进行推断。 [FromBody] 不适用于具有特殊含义的任何复杂的内置类型,如 IFormCollection 和 CancellationToken。 绑定源推理代码将忽略这些特殊类型。
[FromForm] 针对 IFormFile 和 IFormFileCollection 类型的操作参数进行推断。 该特性不针对任何简单类型或用户定义类型进行推断。
[FromRoute] 针对与路由模板中的参数相匹配的任何操作参数名称进行推断。 当多个路由与一个操作参数匹配时,任何路由值都视为 [FromRoute]。
[FromQuery] 针对任何其他操作参数进行推断。



默认按照从上到下的顺序去匹配,最后才是FromQuery,所以最开始的问题就解释通了,因为简单类型的参数如果不显式指定类型就是从Query里取,而我们的用的post请求方式,参数都在body里所以服务器接收不到。

简单类型、复杂类型混合

知道了上面的推理规则,所以下面的这个例子里,wechat参数因为是简单类型所以不会跟其他的参数在一起,必须放在URL里。

[HttpPost("PostAvatar")]
public BaseResult<string> PostAvatar(Avatar model,int wechat)
{
...
}
...
public class Avatar 
{
   public int id { get; set; }
   public string imgUrl{ get; set; }
}

js的请求必须是这样才行

    wx.request({
      url: '/api/PostAvatar?wechat=1',//增加在这
      data:{
        id:1,
        imgUrl:'',
        //wechat:1 放在data里一样取不到
      },
      method:"POST",
      success:function(res){
      ...
      }
    })

空key问题

问题还没完,如果想把所有POST请求使用统一的格式,单个参数也想放在body里请求,是不是按照上面的绑定规则显式指定为FromBody就可以呢?

public IActionResult Post([FromBody] string name) { ... }

答案是:依然取不到,因为js发送的body是这样的

{"name":"xxxx"}

而webapi期望的body里只有xxxx。

总结

Web API 参数的绑定如果不是显式的指定会按照一定默认规则识别参数的来源,GET请求比较简单从QueryString中取值,POST请求会因为参数的类型有所不同。

[FromBody][FromForm]还是有些差别的,涉及到了ContentType后续可能还会针对HTTP请求的一些细节做些说明。

文章中有错误的还请留言交流!!!

参考文章:

o
粉丝 0
博文 62
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Web开发组件管理器--Bower

Bower 是一个针对Web开发的包管理器。该工具主要用来帮助用户轻松安装CSS、JavaScript、图像等相关包,并管理这些包之间的依赖。 功能有些类似于Component。不同之处是,Component是围绕Git...

匿名
2013/02/01
1.2W
2
C/C++ 代码文档生成器--cldoc

cldoc 是一个使用 clang 实现的 C/C++ 代码文档生成器。 特点: 使用 clang 可靠解析大多数复杂的 C++ 项目 零配置 使用 markdown 做为文档格式 生成描述 API 的 XML 文档 使用简单格式用于文...

匿名
2013/02/14
1.4K
0
Web 的 SSH 控制台--KeyBox

KeyBox 是一个基于 Web 的 SSH 控制台,用于同步管理多个系统并且可执行远程命令。允许你共享终端命令并上传文件到所有系统。但连接会话打开时你可选择在其中一个终端或者多个终端上执行命令...

匿名
2013/02/28
8.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

在C#中调用基本构造函数 - Calling the base constructor in C#

问题: If I inherit from a base class and want to pass something from the constructor of the inherited class to the constructor of the base class, how do I do that? 如果我从基类......

富含淀粉
28分钟前
7
0
用Python构建个性化智能闹钟

作者|Kumar Shubham 编译|VK 来源|Towards Data Science 你可能之前有见过有人使用Python语言构建闹钟,帮助他唤醒或提醒他一个重要的会议。 这些都是很简单,没有任何智能,他们所做的只是播...

人工智能遇见磐创
37分钟前
12
0
前端学数据结构与算法(二):数组与栈

前言 数据结构与算法有相互依存的关系,如果将这个两个又进行划分,无疑数据结构又是这座大厦的基础。首先从线性数据结构开始,介绍大家耳熟能详的数据结构-数组。因为JavaScript已经为数组封...

飞跃疯人院
46分钟前
7
0
emsdk 开发环境搭建

https://emscripten.org/docs/getting_started/Tutorial.html 安装cmake sudo apt install cmake -ysudo apt install gcc g++ -ysudo apt-get install default-jre -y git clone......

阿豪boy
52分钟前
19
0
重写GetHashCode的最佳算法是什么? - What is the best algorithm for overriding GetHashCode?

问题: In .NET, the GetHashCode method is used in a lot of places throughout the .NET base class libraries. 在.NET中,整个.NET基类库的许多地方都使用GetHashCode方法 。 Implementi......

fyin1314
59分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部