猿教程 Logo

Web API路由

在前面的小节中,我们得知WebApiConfig类可以配置Web API。在这里,我们将学习如何配置Web API的路由。

Web API路由类似于ASP.NET MVC路由。它传入HTTP请求路由到在Web API控制器的一个特定的操作方法。

Web API支持两种类型的路由:

  1. 基于约定的路由

  2. 基于属性的路由



基于约定的路由

在基于约定的路由中,Web API使用模板来确定该请求由哪个路由控制器和操作方法执行。至少有一个路由模板必须添加到路由表,以处理各种HTTP请求。

当我们像之前的课程中,使用Web API模板创建Web API项目时,它还在App_Start文件夹下增加了WebApiConfig类,如下所示:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Enable attribute routing
        config.MapHttpAttributeRoutes();
        
        // Add default route using convention-based routing
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

在上面的WebApiConfig.Register()方法,config.MapHttpAttributeRoutes()使应用支持属性路由,属性路由稍后我们将在这一节中学习。config.Routes是一个路由表或HttpRouteCollection类型的集合。“DefaultApi”路由被MapHttpRoute()扩展方法添加到路由表中。MapHttpRoute()扩展方法在内部创建一个新的IHttpRoute实例,并将其添加到一个HttpRouteCollection中。但是,您可以创建一个新的路由并手动添加到集合,如下所示。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        
        // define route
        IHttpRoute defaultRoute = config.Routes.CreateRoute("api/{controller}/{id}", 
                                            new { id = RouteParameter.Optional }, null);
            
        // Add route
        config.Routes.Add("DefaultApi", defaultRoute);
    }
}

下表列出了MapHttpRoute()方法的参数。

参数描述
name
路由的名称
routeTemplate路由的URL匹配模板
defaults包含默认路由的参数
constraints

正则表达式来指定路线的特征

handler将会被用来处理请求的处理程序

现在,让我们看看Web API如何处理传入的http请求并发送响应。

下面是一个示例HTTP GET请求。

Http Get Request案例:

GET http://localhost:1234/api/values/ HTTP/1.1
User-Agent: Fiddler
Host: localhost: 60464
Content-Type: application/json

根据上述WebApiConfig类中的DefaultApi路由配置,上述请求将执行ValuesController的Get()操作方法,因为HTTP方法是Get, URL是http://localhost:1234/api/values,匹配与DefaultApi路线模板/api/{controller}/{id},{controller}将匹配到ValuesController。默认路由指定id作为一个可选参数,如果url中没有出现Id,那么{ id }将被忽略。请求的HTTP方法是GET,所以ValueController将执行GET()操作方法。

如果Web API框架没有找到与传入请求匹配的路由,就会发送404错误响应。

下图演示了Web API路由。


下表显示了不同的请求对应的不同的操作方法。

请求URL请求HTTP方法Action方法Controller
http://localhost:1234/api/courseGETGet()CourseController
http://localhost:1234/api/productPOSTPost()ProductController
http://localhost:1234/api/teacherPUTPut()TeacherController

注意:

Web API也能支持像MVC那样的路由规则,将方法名包含在URL中。



配置多个路由

前面我们配置了单个路由。但是,您可以在Web API中使用HttpConfiguration对象配置多个路由。

下面的例子演示了配置多个路由。

配置多个路由的案例:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
    
        // school route
        config.Routes.MapHttpRoute(
            name: "School",
            routeTemplate: "api/myschool/{id}",
            defaults: new { controller="school", id = RouteParameter.Optional }
            constraints: new { id ="/d+" }
        );
        // default route
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}


在上面的例子中,School路由配置在DefaultApi路由之前。

所以任何传入请求首先会与School路线匹配,如果传入的请求url不匹配则只会与DefaultApi路由匹配。

例如,请求url是http://localhost:1234/api/myschool,与School路由模板匹配成功,所以它将由SchoolController处理。

访问asp.net来了解路由详细信息



路由特性

Web API 2开始支持Attribute路由。顾名思义,Attribute路由使用[Route()]属性来定义路由。Attribute路由可以应用在任何控制器或操作方法上。

为了在Web API中使用Attribute路由,它必须通过调用config.MapHttpAttributeRoutes()方法启用WebApiConfig。

参考下面的Attribute路由示例。

public class StudentController : ApiController
{
    [Route("api/student/names")]
    public IEnumerable<string> Get()
    {
        return new string[] { "student1", "student2" };
    }
}

在上面的示例中,属性了定义新路由“api/student/names”将由StudentController的Get()操作方法处理。

因此,HTTP GET请求http://localhost:1234/api/student/names将返回学生名单。


访问asp.net来了解属性路由的详细信息



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/webapi/web-api-route.html