• Web API之路由浅谈


    Web API的路由,是指明接口地址的方向,是照亮获取数据路上的灯塔,其重要性不言而喻。

    本篇文章以vs2015为例,一步步说明路由的创建及使用,其中包括默认路由、自定义路由和特性路由。

    一、默认路由

    我们创建一个新的web api项目,其初始的默认路由是这样的:

     

    不难看出,默认路由的名称(name)是DefaultApi。路由模板(routeTemplate)是api/{controller}{id},api是固定的,{controller}匹配控制器,{id}匹配行为的参数,由defaults可以看出,id这个路由参数值可以自定义,也就是说,id值可以有或者没有。只要客户端传进来的url地址匹配该路由,就能找到对应的action并执行之。

    接下来新建一个model类Product,新建一个控制器ProductsController。

    我们的controller控制器内容为:

    这时,我们用到的路由全是创建初期默认的路由。那么,当客户端访问进来时,路由怎么去匹配相关的action呢?这时,可以取一个巧:如果客户端是以GET请求的,但是web api的action方法没有指明http的动词(httpget/httppost等等之类的),那么路由便会去匹配以Get字符串开头命名的action方法,再去匹配请求参数相同的action方法,其他诸如post/delete/put等请求都是相同的原理。

    就拿GetAllProducts()这个action方法举例。

    1、浏览器输入http://localhost:8026/api/products

    2、路由匹配到GetAllProducts方法

    是不是很简单!api是固定的,products是控制器名称,url后面没有跟参数,而且客户端是以Get方式提交到后台的,所以路由就自动匹配到了。

    以上讲解的是没有给控制器的action方法指定客户端提交方式,路由会自动去按照action名称所包含的字符串去匹配。其实,我们还可以给action方法指定这些http动词。如:

    从上图可以看出,客户端可以通过GET或POST方式请求GetAllProducts这个操作的结果。但是,只能通过GET的方式请求GetProductById这个操作的结果,如果是以POST方式提交的话,服务器会返回{"Message":"The requested resource does not support http method 'POST'."}

    二、自定义路由

    可以在WebApiConfig.cs的Register方法中设置自定义路由匹配规则。如:

    这时,我们在客户端以Get方式提交一个url地址:http://localhost:8026/ActApi/Products/GetProductById/1,自定义路由会将该地址匹配并对应到GetProductById()方法。首先ActApi是固定的,Products是controller控制器名称,GetProductById是一个action方法名称,1是这个action方法的参数。其实,使用默认路由的http://localhost:8026/Api/Products/1这个地址也能访问到该方法。

    需要注意:每个路由的名称name都不能相同。在路由模板中,控制器的匹配字符串{controller}和参数的匹配字符串(例如:{id})一定要写进去。

    根据以上两种路由来看,当一个请求到来之时,路由做的工作如下步骤所示:

    1、首先匹配固定字符串;

    2、其次匹配相关控制器;

    3、然后匹配控制器中的action方法,通过http提交方式之类的;

    4、最后根据action方法的参数去匹配。首先匹配没有参数的,如果失败,则去匹配参数类型一致的,如果找到多条记录,则返回Multiple controller types were found that match the URL这个错误说明,如果没有找到,则返回not found错误说明,如果匹配到一个action方法,那么就是它了,真的是蓦然回首,那action特么却在黑灯瞎火处,真尼玛难找!

    三、特性路由

     如果需要使用特性路由,需要在WebApiConfig.cs的Register方法中加入config.MapHttpAttributeRoutes()这行代码。如:

    然后,我们就可以在控制器中使用特性路由。如:

    通过特性的方式,使用RoutePrefix给控制器加上路由前缀,使用Route给每个action加上路由。这样,客户端可以通过具体的路由找到具体的action。比如http://localhost:8026/Products/1这个地址,通过特性路由,可以匹配到GetProductById这个action方法;http://localhost:8026/Products/Hardware这个地址可以匹配到GetProductsByCategory方法。

     特别注意:如果一个action方法被设置了特性路由,那么默认路由和自定义路由就会被作废,只能通过特性路由去匹配到该action方法。

     举个例子,控制器中某两个action方法如下图定义:

    GetAllProducts:该方法没有定义特性路由,可以通过默认路由或自定义路由去访问该action方法。如:http://localhost:8026/api/products 或 http://localhost:8026/ActApi/products/GetAllProducts ;

    GetProductById:定义了特性路由,通过默认路由和自定义路由访问不到,只能通过特性路由去访问。如:http://localhost:8026/products 或 http://localhost:8026/products/1,其实这两个地址返回来的结果是相同的,因为该方法的Id参数默认的是1。

    扩展两个技巧:ActionName和NoAction。

    ActionName:可通过ActionName更改其指定action的方法名,客户端在请求的时候,以ActionName提供的为主。

    NoAction:指定某个action方法不能被访问。

    如下图:

  • 相关阅读:
    【笔记】:sort排序大法
    【模块】:torndb
    【模块】:CSV文件 数据可视化
    【模块】:Pygal 绘制直方图
    【模块】:matplotlib 绘制折线图
    【Django】:重构Admin
    【数据结构】:基础
    【数据结构】:排序练习
    【数据结构】:算法(二)
    【数据结构】:算法(一)
  • 原文地址:https://www.cnblogs.com/williamwsj/p/7145142.html
Copyright © 2020-2023  润新知