C# webAPI ——请求路由

Web API路由

路由的目的是用于解析请求的URL来确定Controller和Action。Web API默认路由是通过http的方法(get/post/put/delete)去匹配对应的action,也就是说webapi的默认路由并不需要指定action的名称,当然,WebApi也支持MVC里面的路由机制,但RestFul风格的服务要求请求的url里面不能包含action,所以,在WebApi里面是并不提倡使用MVC路由机制的。下边通过例子介绍Web API路由原理以及使用。

资源对象和控制器以名称关联,请求和动作 用 [Route(“Home1/{action}”)] 关联

路由表

默认路由设置

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

此路由在 WebApiConfig.cs 文件中定义,该文件放置在 App_Start 目录中

匹配过程

找到匹配路由后,Web API 会选择控制器和操作:

若要查找控制器,Web API 会将“控制器”添加到 {controller} 变量的值。
若要查找操作,Web API 将查看 HTTP 谓词,然后查找名称以该 HTTP 谓词名称开头的操作。 例如,对于 GET 请求,Web API 查找前缀为“Get”的操作,例如“GetContact”或“GetAllContacts”。 此约定仅适用于 GET、POST、PUT、DELETE、HEAD、OPTIONS 和 PATCH 谓词。 可以使用控制器上的属性启用其他 HTTP 谓词。 稍后我们将看到一个示例。
路由模板中的其他占位符变量(如 {id}) 映射到操作参数。

路由变体

可以使用下列属性之一修饰操作方法,而不是对 HTTP 谓词使用命名约定来显式指定操作的 HTTP 谓词:

[HttpGet]
[HttpPut]
[HttpPost]
[HttpDelete]
[HttpHead]
[HttpOptions]
[HttpPatch]

在以下示例中,该方法 FindProduct 映射到 GET 请求:

public class ProductsController : ApiController
{
[HttpGet]
public Product FindProduct(id) {}
}

若要允许操作的多个 HTTP 谓词,或者允许除 GET、PUT、POST、DELETE、HEAD、OPTIONS 和 PATCH 以外的 HTTP 谓词,请使用采用 [AcceptVerbs] HTTP 谓词列表的属性。

public class ProductsController : ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Product FindProduct(id) { }

    // WebDAV method
    [AcceptVerbs("MKCOL")]
    public void MakeCollection() { }
} 	

标题按操作名称路由

使用默认路由模板,Web API 使用 HTTP 谓词选择操作。 但是,还可以创建一个路由,其中操作名称包含在 URI 中:

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
可以使用属性替代操作名称 [ActionName] 。 在以下示例中,有两个操作映射到“api/products/thumbnail/id”。一个支持 GET,另一个支持 POST:
public class ProductsController : ApiController
{
    [HttpGet]
    [ActionName("Thumbnail")]
    public HttpResponseMessage GetThumbnailImage(int id);

    [HttpPost]
    [ActionName("Thumbnail")]
    public void AddThumbnailImage(int id);
}

属性路由

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

路由前缀

可以使用 [RoutePrefix] 属性为整个控制器设置通用前缀:

[RoutePrefix("api/books")]
public class BooksController : ApiController
{
    // GET api/books
    [Route("")]
    public IEnumerable<Book> Get() { ... }

    // GET api/books/5
    [Route("{id:int}")]
    public Book Get(int id) { ... }

    // POST api/books
    [Route("")]
    public HttpResponseMessage Post(Book book) { ... }
}

使用方法属性上的平铺 (~) 替代路由前缀:

[RoutePrefix("api/books")]
public class BooksController : ApiController
{
    // GET /api/authors/1/books
    [Route("~/api/authors/{authorId:int}/books")]
    public IEnumerable<Book> GetByAuthor(int authorId) { ... }

    // ...
}

路由约束

[Route("users/{id:int}")]
public User GetUserById(int id) { ... }

[Route("users/{name}")]
public User GetUserByName(string name) { ... }

可选 URI 参数和默认值

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值