WEBAPI学习之路(1)——路由

前言

每一个做后端的程序猿必须知道的HTTP服务,所以WEBAPI是.net软件开发工程师必须会的,在这里留下我学习WEBAPI的一些心得和体会,我们从最基础的一点一点学习。

正题

从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分。

WEBAPI的学习最基础也是第一个应该学习的就应该是WEBAPI的路由,若连路由都不懂(都不知道怎么请求方法)谈何学习后面的知识?(划重点)

下面正式揭开WEBAPI使用RESTful风格定义路由的面纱

一:WEBAPI路由的基础

首先创建一个WEBAPI项目(使用的是VS2015)

选择WEBAPI项目

创建完成之后会找到在App_Start目录下有一个WebApiConfig.cs,这个文件就是今天的主角,以下步骤将围绕着这个文件进行学习。

贴上主角代码:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

我们主要看MapHttpRoute方法,这个方法有4个重载方法。

分别来看一下它的方法参数有什么用:

  1. name:表示路由的名称
  2. routeTemplate:路由的规则,向这个Api中请求什么方法完全看这个routeTemplate的规则制定
  3. defaults:路由规则的参数设定。
  4. constraints:路由的约束,如参数约束等。

这些参数若是不懂可以暂不理解,在后续的学习中会慢慢的体会到这些参数的用法。

二。WEBAPI的路由设定

上面讲述了一些WEBAPI的项目创建和路由文件的基础解释,下面开始介绍WEBAPI的路由如何配置,有什么让人眼前一亮的规则。

 a.默认路由

首先创建一个API控制器

并写下以下代码:

public class StartController : ApiController
    {
        [HttpGet]
        public string Get()
        {
            return "MyApi";
        }
    }

 很简单的一个Get方法,下面我们运行项目去访问这个方法

我们来分析一下这个URL,localhost:64437本地运行端口为64437,不用解释;

/api/Start 对应我们在WebApiConfig.cs文件中的默认路由对应api/{controller}没毛病,

路由另一个参数defaults设定为new { id = RouteParameter.Optional }(表示可以带参数也可以不带参数)也没问题。

小结:

  WEBAPI路由匹配规则根据请求的类型(Get,Post,put,delete)和参数去匹配对应的方法,MVC的路由规则WEBAPI同样适用但    不提倡,WEBAPI提倡RESTful风格(个人理解)

b.自定义路由

我们在Start控制器中重载一个Get方法

public class StartController : ApiController
    {
        [HttpGet]
        public string Get()
        {
            return "MyApi";
        }
        [HttpGet]
        public string Get(int ID)
        {
            return "MyApi" + ID;
        }
    }

在路由中写上我们自定义的路由

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            //自定义路由
            config.Routes.MapHttpRoute(
                name: "StartApi",
                routeTemplate: "Start/{controller}/{OrderCode}/{id}",
                defaults: new { orderCode = "123", id = RouteParameter.Optional }
            );
        }

 然后运行项目通过几个例子来了解WEBAPI的路由规则

第一个例子:

这里成功请求到了无参的Get方法,分析一下Url,/Start/Start/123/匹配到Start/{controller}/{OrderCode}/{id} 。基础部分讲解到了defaults这个参数是设定路由参数的,这里我们设定orderCode = "123",所以在URL中我们也要写上123,写别的就不能成功请求。

第二个例子:

成功请求到带Int类型参数的Get方法,由此可见WEBAPI路由规则是通过请求类型和请求参数来匹配到具体方法 

c.WEBAPI特性路由

有一种情况:

        [HttpGet]
        public string Get()
        {
            return "MyApi";
        }
        [HttpGet]
        public string Get1()
        {
            return "MyApi1";
        }

当我这个API控制器里面两个方法都是Get请求,且参数都是一样的 ,那就不好办了。

有这种出现时我们需要启用特性路由

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            //启用WenAPI特性路由
            config.MapHttpAttributeRoutes();

            //默认路由
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            //自动以路由
            config.Routes.MapHttpRoute(
                name: "StartApi",
                routeTemplate: "Start/{controller}/{OrderCode}/{id}",
                defaults: new { orderCode = "123", id = RouteParameter.Optional }
            );
        }

特性路由如何使用,请看以下代码:

public class StartController : ApiController
    {
        [Route("Start/AAAA")]
        [HttpGet]
        public string Get()
        {
            return "MyApi";
        }
        [Route("Start/BBBB")]
        [HttpGet]
        public string Get1()
        {
            return "MyApi1";
        }
    }

只需要加上[Route()]特性

成功请求到第一个Get方法

 

成功请求到第二个Get方法

带参数的特性路由:[Route("Start/{ID}/AAAA")]

 带默认值和约束参数的特性路由:带参数的特性路由:[Route("Start/{ID:int=3 }/AAAA")]

PS: 错误写法[Route("Start/{ID : int  = 3 }/AAAA")],特性路由中间不能有空格否则会报错

d.路由前缀

若整个API控制器里面的方法都用同一个前缀,则需要在控制器类上加上特性

[RoutePrefix("api/Start")]

代码如下

[RoutePrefix("api/Start")]
    public class StartController : ApiController
    {
        [Route("{ID:int=3}/AAAA")]
        [HttpGet]
        public string Get(int ID)
        {
            return "MyApi" + ID;
        }
        [Route("BBBB")]
        [HttpGet]
        public string Get1()
        {
            return "MyApi1";
        }
    }

总结:以上便是WEBAPI的路由规则学习。
           在此谢谢懒得安分大牛分享的文章。

猜你喜欢

转载自blog.csdn.net/wengpiwang/article/details/84313184