• 使用ASP.Net WebAPI构建REST服务(二)——路由


    REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由。Asp.Net WebAPI的路由方式和Asp.Net MVC是相同的,它支持两种路由方式,传统的路由映射和特性路由。 路由规则WebApiConfig.cs中定义,它的默认内容如下:

     1     public static class WebApiConfig
     2     {
     3         public static void Register(HttpConfiguration config)
     4         {
     5             config.MapHttpAttributeRoutes();
     6 
     7             config.Routes.MapHttpRoute(
     8                 name: "DefaultApi",
     9                 routeTemplate: "api/{controller}/{id}",
    10                 defaults: new { id = RouteParameter.Optional }
    11             );
    12         }
    13     } 

    它默认注册了两种路由规则,第一行注册的是特性路由,第二行注册的则是传统的映射路由。默认情况下,由于我们没有编写特性路由规则,则是按照传统的Controller方式映射路由。

    关于路由规则,MSDN文档ASP.NET 路由介绍得非常详细,但由于其介绍得太详细了,反而不容易得其门而入,这里我只拿默认的路由规则来简单但的介绍一下我的理解,它的uri格式是这样的"api/{controller}/{id}",其中id是可选的。拿前文的例子来说吧,

    1. 当我们对api/products地址进行访问的时候,系统则会首先找到名为ProductsController的控制器。
    2. 然后,根据访问方式查找函数,由于这里是Get操作,则查找Get开头的函数, 这里会找到Get()和Get(int id)两个重载版本。
    3. 最后,根据参数来匹配具体的函数,因为这里没有带参数id。因此匹配到了Get()函数,返回了所有的集合。

    另外,这里也有几个常用的衍生规则:

    1. 根据操作方式找函数的时候,只需要匹配首部即可,因此我们编写函数的时候写成Get()GetProduct()都是可以的。,
    2. 根据操作方式找函数的时候查找的时候不分大小写,因此写成Get()或get()都是可以的

    当我们使用带参数的版本时候,也有几个需要注意的地方:

    1. 参数名不分大小写,我们写成id或ID都是可以的
    2. 参数名要求严格匹配的,我们写成ID2是不行的,此时则会匹配到错误的结果Get()

    默认的规则虽然大多数的时候还是比较方便的,但是很多时候我们需要手动指定个性化的路由规则。例如,我们可以自定义一个按名称来查询的url:api/products/name=xxx。这个时候则可以用特性路由快速的实现了:

    1     [Route("api/{controller}/name={name}")]
    2     public IHttpActionResult GetByName(string name) 

    关于特性路由,MSDN原文Attribute Routing in ASP.NET MVC 5介绍得非常详细,国内也有非常不错的译文版本Attribute Routing in ASP.NET MVC 5 翻译及补充,这里就不做多少介绍了。

  • 相关阅读:
    HDU 4611 Balls Rearrangement 数学
    Educational Codeforces Round 11 D. Number of Parallelograms 暴力
    Knockout.Js官网学习(简介)
    Entity Framework 关系约束配置
    Entity Framework Fluent API
    Entity Framework DataAnnotations
    Entity Framework 系统约定配置
    Entity Framework 自动生成CodeFirst代码
    Entity Framework CodeFirst数据迁移
    Entity Framework CodeFirst尝试
  • 原文地址:https://www.cnblogs.com/caoyc/p/5677105.html
Copyright © 2020-2023  润新知