zoukankan      html  css  js  c++  java
  • ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置

    ASP.NET Web API的路由和ASP.NET MVC相似,也是把路由放在RouteTable中的。可以在App_Start文件夹中的WebApiConfig.cs中设置路由模版。默认的路由模版是:

     

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

    ● 静态片段api,主要用来区分ASP.NET MVC的路由。
    ● 为什么没有{action}?默认情况下,可以根据惯例找到Action,只要Action的名称符合惯例。
    ● 占位符变量{id}映射Action的参数。

     

    □ 根据惯例路由

     

    对于GET,POST,PUT,DELETE请求,如果Action的名称以Get, Post, Put, Delete开头,这就是符合惯例,意味着在请求的url中无需指明Action,就可以路由到对应的Action中。

     

    假设有这样的一个api控制器:

    public class BooksController : ApiController
    
    {
    
        public void GetAllBooks(){}
    
        public IEnumerable<Book> GetBookById(int id)
    
        public HttpResponseMessage DeleteProduct(int id){}
    
    }

    ● 浏览器输入:api/books 并且是Get请求

    不带参数,由于GetAllBooks的名称以Get开头,符合惯例,这里会映射到GetAllBooks方法。

     

    ● 浏览器输入:api/books/8 并且是Get请求

    带参数,会映射到GetBookById(int id)方法上。Web API会把字符串类型的8赋值给int类型的参数变量id。

     

    ● 浏览器输入:api/books/8 并且是DELETE请求
    映射到DeleteProduct(int id)

     

    ● 浏览器输入:api/books 并且是POST请求
    没有对应POST请求的Action。返回404状态码。

     

    □ 根据HTTP方法路由

     

    HttpGet, HttpPut, HttpPost, HttpDelete属性可以打在Action上面。

     

    public class BooksController : ApiController
    
    {
    
        [HttpGet]
    
        public Book FindBook(id){}
    
    }

     

    如果一个Action允许有多个HTTP方法,就使用AcceptVerbs属性。

    public class BooksController ; ApiController
    
    {
    
        [AcceptVerbs("GET","HEAD")]
    
        public Book FindProduct(id){}
    
    }

    □ 考虑Action的路由

     

    我们可以在WebApiConfig.cs中设置路由的模版,把Action考虑进去。

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

     

    在api控制器中:

    public class BooksController : ApiController
    
    {
    
        [HttpGet]
    
        public string Details(int id);
    
    }

    此时,在浏览器中输入类似"api/books/details/8"的格式,才能映射到Details(int id)方法上。

    还可以通过ActionName属性给Action取别名:

    public class BooksController : ApiController
    
    {
    
        [ActionName("Sth")]
    
        public HttpResposneMessage GetSth(int id);
    
    }

     

    如果不想让Action参与到路由中,可以使用NoAction属性。

    public class BooksController : ApiController
    
    {
    
        [NonAction]
    
        public string GetSomeData(){}
    
    }

    总结:在WebApiConfig.cs中定义的路由模版都被放到了RouteTable中了。在Action层面,如果想让请求路由到Action上,可以通过惯例、Http方法属性来实现。

     

  • 相关阅读:
    ORM框架
    js获取浏览器和元素对象的尺寸
    js中的兼容问题
    JS页面上的流氓广告功能
    JS计算1到10的每一个数字的阶乘之和
    JS中 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg,第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量
    JS中99乘法表
    JS 中计算 1
    JS中判断一个数是否为质数
    JS水仙花数
  • 原文地址:https://www.cnblogs.com/darrenji/p/4049738.html
Copyright © 2011-2022 走看看