猿教程 Logo

参数绑定

在前面的部分中,我们学会了Web API 如何将HTTP请求路由到一个对应的控制器和操作方法。

在这里,我们将了解如何Web API如何将HTTP请求数据绑定到一个动作方法的参数中。

操作方法在Web API控制器中可以有一个或多个不同类型的参数。它可以是原始类型或复杂类型。Web API根据URL的查询字符串或请求主体中参数类型来绑定操作方法的参数。

默认情况下,如果参数类型为原始类型,如int, bool, double, string, GUID, DateTime, decimal或任何其他可以从字符串类型转换的类型,将会从query string中获取。

如果参数类型是复杂类型,Web API默认将试图从请求主体获取值。

下表列出了参数绑定的默认规则。

HTTP方法Query stringRequest Body
Get简单类型、复制类型
Post简单类型复杂类型
PUT简单类型复杂类型
PATCH简单类型复杂类型
DELETE简单类型、复杂类型

让我们看看Web API如何从HTTP请求获得Action方法的参数值。


单个基本类型参数

参考下面的例子Get操作方法,包括单个基本类型参数。

public class StudentController : ApiController
{
    public Student Get(int id) 
    {
              
    }
}

可以看到上面Get操作函数包含一个int类型的id参数。

因此,Web API将试图从请求的URL的查询中提取id对应的值,将它转换成int,并将其分配给操作方法的参数id。

例如,如果HTTP请求是http://localhost/api/student?id=1,那么id参数值将是1。

以下是上述操作方法有效的HTTP GET请求。

http://localhost/api/student?id=1

http://localhost/api/student?ID=1

注意:查询字符串参数名称和操作方法参数名称必须相同(不区分大小写)。名称不匹配的参数将不会赋值,参数的先后顺序没有要求。



多个基本类型参数

参考下面的例子,操作方法的多个基本类型参数赋值。

public class StudentController : ApiController
{
    public Student Get(int id, string name) 
    {
    }
}

如您所见,Get方法包括多个基本类型参数。因此,Web API将试图从请求URL的查询字符串的值中提取这些参数的值。

例如,如果HTTP请求是http://localhost/api/student?id=1&name=steve,那么Get函数的id将为1,name为Steve。

以下是上述操作方法有效的HTTP GET请求。

http://localhost/api/student?id=1&name=steve

http://localhost/api/student?ID=1&NAME=steve

http://localhost/api/student?name=steve&id=1

注意:查询字符串参数名称和操作方法的名称必须匹配。然而,他们顺序可以不一致。



POST基本类型参数

使用HTTP POST请求来创建新的资源。他可以将请求数据放在Request Body中,也可以放在Query String中。

参考下面的Post操作方法。

public class StudentController : ApiController
{
    public Student Post(id id, string name)
    {
           
    }
}

如您所见,Post()操作方法包括基本类型参数id和name。所以,默认情况下,Web API将查询字符串值。例如,如果一个HTTP POST请求是http://localhost/api/student?id=1&name=steve,那么id的值为1,name的值为steve。

现在,考虑以下Post()方法与复杂类型参数。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class StudentController : ApiController
{
    public Student Post(Student stud)
    {
           
    }
}

上面的Post()方法包括Student生类型参数。作为一个默认的规则,Web API将试图从HTTP Request Body中获取stud的值。

下面是Fiddler发送的一个有效的HTTP POST请求。


Web API将从上述请求体中提取JSON对象并自动将它转换成Student对象,因为JSON对象属性的名称与Student类属性的名称匹配(不区分大小写)。


POST复杂类型参数

Post操作方法可以包括基本类型和复杂类型参数。参考下面的例子。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
     
}
public class StudentController : ApiController
{
    public Student Post(int age, Student student)
    {
    }
}


上面的Post方法包括原始和复杂类型参数。所以,默认情况下,Web API将从query string中获取id的值,从request body中获取student的值。

下面是Fiddler发送的一个有效的HTTP POST请求。


注意:Post操作方法不能包含多个复杂类型的参数,因为最多允许一个参数读取请求主体中的数据。

Web API中Put和Patch方式的参数绑定方法与Post方式相同,所以Put和Patch方式的参数绑定将不再单独讲解。


FromURI与FromBody

你已经看到,默认情况下,Web API从查询字符串中得到基本类型参数的值,从请求主体中得到复杂类型参数的值。

但是,如果我们想改变这种默认行为呢?

可以使用[FromUri]属性,使Web API来从查询字符串中获取复杂类型的值,使用(FromBody)属性可以使Web API从请求主体获取原始类型的值,相反的默认规则。

例如,参考下面的Get方法。

public class StudentController : ApiController
{
    public Student Get([FromUri] Student stud)
    {
    }
}

在上面的例子中,Get方法包括复杂的类型参数,参数有[FromUri]属性。

Web API将试图从查询字符串得到Student类型参数的值。

例如,如果HTTP GET请求为http://localhost:xxxx/api/student?id=1&name=steve,那么Web API将创建一个Student对象,然后从查询字符串中获取id和name的值并赋值给该Student对象。

注意:复杂类型属性和查询字符串参数的名称必须匹配。

同样,参考以下Post方法的例子。

public class StudentController : ApiController
{
    public Student Post([FromUri]Student stud)
    {
    }
}

现在,Web API将从查询字符串中提取Student参数的属性的值,而不是请求主体。

以同样的方式,应用[FromBody]属性可以让web api从请求主体中获取简单类型的参数的值,而不是从查询字符串中获取。

public class StudentController : ApiController
{
    public Student Post([FromBody]string name)
    {
    }
}

下面是使用Fiddler操作的一个有效的HTTP POST请求。


注意:FromBody属性只能应用于一个Action方法的一个基本参数。它不能被应用在一个Action方法的多个基本参数中。

下图总结了参数绑定规则。



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/webapi/parameter-binding.html