了解了 Web API 如何将 HTTP 请求路由到 Controller 和 Action 方法。我们将再看看 Web API 如何将 HTTP 请求数据绑定到操作方法的参数。
Model Binding
Web API 将操作方法参数与 URL 的 Query String 或 Request Body 绑定,具体取决于参数类型。
默认情况下,如果参数类型是 .NET 基本类型,则它从 Query String 设置参数的值,如果参数类型是复杂类型,则 Web API 会尝试默认从 Request Body 中获取值。
默认 Binding 规则
| HTTP Method | Query String | Request Body |
|---|---|---|
| GET | Primitive Type,Complex Type | NA |
| POST | Primitive Type | Complex Type |
| PUT | Primitive Type | Complex Type |
| PATCH | Primitive Type | Complex Type |
| DELETE | Primitive Type,Complex Type | NA |
[FromUri] 和 [FromBody]
使用 [FromUri] 特性强制 Web API 从 Query String 获取复杂类型的值,[FromBody] 特性从 Request Body 获取基本类型的值。
注意: FromBody 特性只能应用于 Action 方法的一个基本参数。它不能应用于同一个 Action 方法的多个原始参数。
注意与 Web MVC 的区别:
Web MVC 中,不论是复杂类型还是简单类型,只要是 Get 请求,都从 Query String 获取值,只要是 Post 请求,都从 Request Body 中获取值。
Web API 中,默认情况,简单类型从 Query String 中获取值,复杂类型根据请求方法: Get请求,从 Query String 获取值,Post 请求从 Request Body 获取值。
我们可以使用 [FromUri] 和 [FromBody] 特性强制 Post 请求中简单类型可以从 Request Body 获取,复杂类型可以从 Query String 获取。
Action 方法返回类型
Web API Action 方法可以具有以下返回类型:
- void
- 原始类型或复杂类型
- HttpResponseMessage
- IHttpActionResult
void
并非所有 Action 方法都必须返回某些内容。它可以有 void 返回类型。
原始类型或复杂类型
Action 方法可以返回原始或其他自定义复杂类型。
HttpResponseMessage
Web API Controller 始终将 HttpResponseMessage 的对象返回到托管基础结构.
从 Action 方法发送 HttpResponseMessage 响应的优点是可以按照自己的方式配置响应。如状态码或错误消息等。
|
IHttpActionResult
IHttpActionResult 是在 Web API 2(.NET 4.5)中引入的。 Web API 2 中的 Action 方法可以返回IHttpActionResult 类的实现,类似于 MVC 中的 ActionResult。
我们可以创建自己的类来实现 IHttpActionResult 或者使用 ApiController 类方法返回 IHttpActionResult 的对象。
下面是 ApiController 类方法,它返回实现 IHttpActionResult 接口的类的对象。
| ApiController Method | 描述 |
|---|---|
| BadRequest() | 创建一个 BadRequestResult 对象,状态码 400. |
| Conflict() | 创建一个 ConflictResult 对象,状态码 409. |
| Content() | 创建一个特殊状态码和内容的 NegotiatedContentResult 对象 |
| Created() | 创建一个 CreatedNegotiatedContentResult 对象,状态码 201 |
| CreatedAtRoute() | 创建一个 CreatedAtRouteNegotiatedContentResult 对象,状态码 201 |
| InternalServerError() | 创建一个 InternalServerErrorResult 对象,状态码 500 Internal server error. |
| NotFound() | 创建一个 NotFoundResult 对象,状态码 404 |
| Ok() | 创建一个 OkResult 对象,状态码 200 |
| Redirect() | 创建一个 RedirectResult 对象,状态码 302 |
| RedirectToRoute() | 创建一个 RedirectToRouteResult 对象,状态码 302 |
| ResponseMessage() | 创建一个特殊的 HttpResponseMessage 的 ResponseMessageResult 对象 |
| StatusCode() | 创建一个特殊状态码的 StatusCodeResult |
| Unauthorized() | 创建一个 UnauthorizedResult 对象,状态码 401 |