zoukankan      html  css  js  c++  java
  • 2.1WebApi的路由

    这篇文章描述 ASP.NET Web API如何将 HTTP 请求通过路由去访问控制器。

    如果你熟悉 ASP.NET MVC,Web API 路由是非常类似于 MVC 路由。主要的区别是 Web API 使用的 HTTP 方法,而不是 URI 路径,选择的操作。您还可以使用 MVC 那样的路由在Web API 中。这篇文章不承担任何的 ASP.NET MVC 的知识。

    路由表

    在 ASP.NET Web API,控制器是一个类,负责处理 HTTP 请求。控制器的公共方法被称为操作方法或简单地行动当 Web API 框架收到请求时,它将请求路由到行动。

    若要确定要调用哪个操作,框架使用的路由表Web API 的 Visual Studio 项目模板创建一个默认路由 ︰

    1 routes.MapHttpRoute(
    2     name: "API Default",
    3     routeTemplate: "api/{controller}/{id}",
    4     defaults: new { id = RouteParameter.Optional }
    5 );

    这条路线被定义在 WebApiConfig.cs 文件中,放置在 App_Start 目录中 ︰

    更多的信息去向WebApiConfig类,请参见配置 ASP.NET Web API.

    如果你自承载 Web API,您必须直接在HttpSelfHostConfiguration对象上设置的路由表。更多的信息,请参阅自承载 Web API.

    在路由表中的每个条目包含一个路线模板Web API 的默认路由模板是"api / {控制器} / {id}"。在此模板中,"api"是一种文字路径段和 {控制器} 和 {id} 占位符变量。

    当 Web API 框架收到 HTTP 请求时,它尝试匹配的 URI 对路由表中路由模板之一。如果没有路由匹配,客户端收到一个 404 错误。例如,以下 Uri 匹配的默认路由 ︰

    • / api/联系人
    • /api/contacts/1
    • /api/products/gizmo1

    然而,以下的 URI 不匹配,因为它缺乏"api"部分 ︰

    • 联系人/1

    注 ︰在流程中使用"api"的原因是为了避免碰撞与 ASP.NET MVC 路由。这种方式,你可以有"/ 联系人"转到 MVC 控制器和"/ api/联系人"转到 Web API 控制器。当然,如果你不喜欢本公约,您可以更改默认的路由表。

    一旦找到匹配的路由,则 Web API 选择控制器和操作 ︰

    • 若要查找控制器,Web API 中添加"控制器" {控制器}变量的值。
    • 若要查找行动,Web API 看 HTTP 方法,,,然后寻找其名称以该 HTTP 方法名称开始行动。例如,与一个 GET 请求,Web API 查找入手"得到...",如"GetContact"或"GetAllContacts"的行动。本公约只适用于获取、 发布、 放,和删除方法。你可以通过在您的控制器上使用属性启用其他 HTTP 方法。我们会再见的例子。
    • 在路线的模板,例如{id},其他占位符变量映射到操作参数。

    让我们看看一个例子。假设你定义以下控制器 ︰

    1 public class ProductsController : ApiController
    2 {
    3     public void GetAllProducts() { }
    4     public IEnumerable<Product> GetProductById(int id) { }
    5     public HttpResponseMessage DeleteProduct(int id){ }
    6 }

    下面是一些可能的 HTTP 请求,以及获取调用每个行动 ︰

    请注意, {id}部分的 URI,是否存在,映射到行动的id参数。在此示例中,控制器定义两个 GET 方法,一个带id参数,另一个不带参数。

    同时,要注意,POST 请求将失败,因为该控制器未定义"邮政..."方法。

    路由的变化

    上一节描述了 ASP.NET Web API 的基本路由机制。本节描述了一些变化。

    HTTP 方法

    而不是使用 HTTP 方法的命名约定,你可以通过装饰与公共、 HttpPut、 HttpPostHttpDelete属性的操作方法显式指定的 HTTP 方法的行动。

    在以下示例中,FindProduct 方法被映射到 GET 请求 ︰

    1 public class ProductsController : ApiController
    2 {
    3     [HttpGet]
    4     public Product FindProduct(id) {}
    5 }    

    若要允许多个 HTTP 方法采取行动,或不允许 HTTP 方法得到,放,张贴,和删除,使用AcceptVerbs属性,采用 HTTP 方法的列表。

    1 public class ProductsController : ApiController
    2 {
    3     [AcceptVerbs("GET", "HEAD")]
    4     public Product FindProduct(id) { }
    5 
    6     // WebDAV method
    7     [AcceptVerbs("MKCOL")]
    8     public void MakeCollection() { }
    9 }

    路由的操作名称

    与默认路由选择模板,Web API 使用的 HTTP 方法选择的操作。不过,您还可以创建 URI 中包括的操作名称是哪里一条路线 ︰

    1 routes.MapHttpRoute(
    2     name: "ActionApi",
    3     routeTemplate: "api/{controller}/{action}/{id}",
    4     defaults: new { id = RouteParameter.Optional }
    5 );

    此路线模板中的{行动}参数名称在控制器上的操作方法。与这种风格的路由,使用属性来指定允许的 HTTP 方法。例如,假设您的控制器具有以下方法 ︰

  • 相关阅读:
    33.数组声明方式(var构造函数) 、检测数组类型、数组的属性(封装好的就一个length)、数组的方法
    31.this指向(写出调用链,找最近对象) this的默认绑定 隐式绑定 显示绑定(call(绑定对象) apply(绑定对象) 当括号内没放绑定对象的时候恢复默认绑定) bind
    31.
    30.函数作用域链 (GO AO 也叫词法作用域链)、 调用栈、调用栈涉及this绑定
    29.包装类(构造函数) 包装类作用及调用栈
    916. Word Subsets
    246. Strobogrammatic Number
    445. Add Two Numbers II
    2. Add Two Numbers
    341. Flatten Nested List Iterator
  • 原文地址:https://www.cnblogs.com/duyao/p/5442602.html
Copyright © 2011-2022 走看看