了解ASP.Net Web API中的参数绑定

ASP.Net Web API是一个轻量级框架,可用于构建RESTful HTTP服务。 在Web API中使用控制器方法时,通常需要将参数传递给这些方法。 这里的“参数”仅是指方法的参数,而“参数绑定”是指为Web API方法的参数设置值的过程。

请注意,Web API可以通过两种方式绑定参数:模型绑定和格式化程序。 模型绑定用于从查询字符串读取,而格式化程序用于从请求正文读取。 您还可以使用类型转换器来使Web API将类视为简单类型,然后从URI绑定参数。 为此,您需要创建一个自定义TypeConverter。 您也可以通过在类中实现IModelBinder接口,然后实现BindModel方法来创建自定义模型绑定程序。 有关类型转换器和模型绑定器的更多信息, 请参阅此Microsoft文档

[ 什么是GraphQL? 通过设计更好的API •教程: 如何开始使用GraphQL •教程: 如何开始使用GraphQL Microsoft Graph Explorer:一个尚未准备好的好工具 | 通过InfoWorld的App Dev Report新闻通讯了解编程中最热门的话题。 ]

现在,为了绑定参数,Web API遵循以下规则:对于简单类型,Web API尝试从URI获取值,对于复杂类型,Web API尝试从请求正文获取值。 这里的简单类型既指.Net基本类型(int,bool,double,float等),也指其他类型,包括TimeSpan,DateTime,Guid,十进制和字符串。 它还包括任何可以从字符串转换的类型转换器的类型。 在下一节中,我们将探讨[FromBody]和[FromUri]属性,这些属性分别用于绑定请求正文和URI中的值。

何时在Web API中使用[FromBody]和[FromUri]

如果您使用Web API已有一段时间,则可能熟悉[FromBody]和[FromUri]属性。 [FromUri]属性是该参数的前缀,用于指定应从请求的URI读取值,[FromBody]属性用于指定应从请求的正文读取值。

对于所有原始类型(int,double,float等),Web API运行时都会尝试从HTTP请求的URI中读取值。 对于复杂类型(类的实例),Web API运行时尝试使用媒体类型格式化程序从HTTP请求的正文中读取值。 这是Web API的默认行为。

因此,如果请求URI中的值是原始类型,则无需指定[FromUri]属性。 同样,如果您在请求正文中具有复杂类型的值,则无需指定[FromBody]属性。 但是,如果原始类型位于请求主体中,或者复杂类型位于请求URI中,则必须指定[FromBody]或[FromUri]属性。 原因是两种情况下您都偏离默认行为。

如何在Web API中使用[FromBody]和[FromUri]

下面的代码段说明了如何为作为参数传递给Web API方法的基本数据类型指定[FromBody]属性。

public class SecurityController : ApiController
{
    public HttpResponseMessage Post([FromBody]int id)
    {
       //Write your code here
    }
}

下面的代码片段说明了如何使用FromUri属性将复杂类型作为参数传递给Web API方法。

public class SecurityController : ApiController
{
    public HttpResponseMessage Post([FromUri]User user)
    {
       //Write your code here
    }
}

应该注意的是,即使您使用的是SSL,通过URI发送用户身份验证数据(如用户名和密码)也不是一个好习惯。 这是因为此类数据可能会保存到易于暴露的浏览器日志中。 通过请求正文传递任何敏感数据(用户名,密码,信用卡信息等)时,在每种情况下都必须使用[FromBody]。

请注意,在将参数传递给Web API方法的同时使用[FromBody]属性时,Web API运行时将利用内容类型标头来选择正确的格式化程序。 您可以从我的文章中了解有关Web API中的内容协商的更多信息。

From: https://www.infoworld.com/article/3133728/understand-parameter-binding-in-aspnet-web-api.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值