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方法属性来实现。

时间: 2024-10-06 08:02:37

ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置的相关文章

ASP.NET Web API实践系列04,通过Route等特性设置路由

ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一文中,体验了通过模版.惯例.HTTP方法来设置路由,这种做法的好处是把路由模版统一放在了App_Start文件夹下的WebApiConfig类中,方便管理,但缺点是不够灵活. REST把一切都看成资源,有时候,一个资源连带子资源,比如Customer和Orders密切关联,我们可能希望输入这样的请求:cust

ASP.NET Web API实践系列05,消息处理管道

ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的自定义处理.所有的请求被封装到HttpRequestMessage这个类中,所有的响应被封装到HttpResponseMessage这个类中. 既然消息处理管道是可扩展的,那么,ASP.NET Web API一定为我们准备了便于扩展的接口或抽象类,它就是HttpMessageHandler抽象类.

ASP.NET Web API实践系列07,获取数据, 使用Ninject实现依赖倒置,使用Konockout实现页面元素和视图模型的双向绑定

本篇接着上一篇"ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API",尝试获取数据. 在Models文件夹下创建Comment类: namespace MvcApplication5.Models { public class Comment { public int ID { get; set; } public string Author { get; set; } public string Text { ge

ASP.NET Web Api 实践系列(一)自我寄宿

从今天开始,研究ASP.NET Web Api(以下有时会简称Web Api).我会写一个实践系列专题,不一定成理论体系,只是遇到问题或心得,记下来.争取用一段较长的时间对ASP.NET Web Api有个较深入的理解.这里我是使用VS2013集成开发环境,如果版本不够,可以用NuGet去下载Web Api相关dll. 今天讨论自我寄宿Web Api. Web Api继承了WCF的优点,除了常规的Web寄宿(IIS)外,还可以在NET的控制台.WinForms等程序中寄宿.这里讲一讲在控制台中寄

ASP.NET Web API实践系列01,以ASP.NET Web Form方式寄宿

创建一个空的ASP.NET Web Form项目. 右键项目,添加新项,创建Web API控制器类,TestController. 删除掉TestController默认的内容,编写如下: using System.Web.Http; namespace WebApplication1 { public class TestController : ApiController { [AcceptVerbs("Get")] public string SayHello() { retur

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set

ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API

本篇尝试在现有的ASP.NET MVC 4 项目上增加使用ASP.NET Web API. 新建项目,选择"ASP.NET MVC 4 Web应用程序". 选择"基本"项目模版. 在Controllers文件夹下添加一个名称为"TestController"的空API控制器. 在引用文件夹中多了以下程序集:System.Web.HttpSystem.Web.Http.WebHostSystem.Net.HttpSystem.Net.Http.Fo

ASP.NET Web Api 实践系列(二)Get/Post方式调用Web Api

本文给出Get/Post方式访问Web Api的帮助方法,对于Put/Delete方式的调用跟Post调用类似. 一.Web Api调用帮助类 下面给出Web Api调用帮助类的代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Net.Http; 4 using System.Net.Http.Headers; 5 using System.Text; 6 using System.Web; 7 8 na

Asp.Net Web API 2第八课——Web API 2中的属性路由

参考页面: http://www.yuanjiaocheng.net/webapi/web-api-gaisu.html http://www.yuanjiaocheng.net/webapi/create-web-api-proj.html http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-api-controller.html http://www.yuan