ASP.NET Web API -- 路由

https://docs.microsoft.com/zh-cn/aspnet/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

路由表

在 Web API ASP.NET,控制器是处理 HTTP 请求的类。 控制器的公共方法称为操作方法或简单的操作。 当 Web API 框架收到请求时,它将请求路由到操作。  路由就是:走哪条路。

 

// 此路由在WebApiConfig.cs文件中定义,该文件放置在 "App_Start" 目录中:
routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

路由表中的每个条目都包含一个路由模板。 Web API 的默认路由模板"是 api/{控制器}/{id}。" 在此模板中",api"是文本路径段,[控制器] 和 {id} 是占位符变量。

路由举例:

路由表中的每个条目都包含一个路由模板。 Web API 的默认路由模板"是 api/{控制器}/{id}。" 在此模板中",api"是文本路径段,[控制器] 和 {id} 是占位符变量。

当 Web API 框架收到 HTTP 请求时,它会尝试将 URI 与路由表中的路由模板之一匹配。 如果没有路由匹配,客户端将收到 404 错误。 例如,以下 URI 与默认路由匹配:

  • /api/触点
  • /api/触点/1
  • /api/产品/gizmo1

但是,以下 URI 不匹配,因为它缺少"api"段:

  • /触点/1

Web API 将选择控制器和操作:

  • 要查找控制器,Web API"将"控制器添加到 [控制器] 变量的值。
  • 要查找操作,Web API 将查看 HTTP 谓词,然后查找名称以该 HTTP 谓词名称开头的操作。 例如,对于 GET 请求,Web "API 会查找使用 Get"预置的操作",例如"获取"联系人或获取"所有联系人。 此约定仅适用于 GET、POST、PUT、DELETE、头、选项和 PATCH 谓词。 您可以使用控制器上的属性启用其他 HTTP 谓词。 稍后我们将看到示例。
  • 工艺路线模板中的其他占位符变量(如 {id}) 映射到操作参数。
// 定义的控制器
public class ProductsController : ApiController
{
    public IEnumerable<Product> GetAllProducts() { }
    public Product GetProductById(int id) { }
    public HttpResponseMessage DeleteProduct(int id){ }
}

下面是一些可能的 HTTP 请求,以及为每个请求调用的操作:

表 1
HTTP 谓词URI 路径操作参数
GETapi/产品获取所有产品(无)
GETapi/产品/4获取产品 ById4
DELETEapi/产品/4删除产品4
POSTapi/产品(不匹配)

请注意,URI 的 [id] 段(如果存在)映射到操作的id参数。 在此示例中,控制器定义了两个 GET 方法,一个使用id参数,另一个没有参数。

此外,请注意,POST 请求将失败,因为控制器未定义"Post..."方法。

如果要要指定 HTTP 请求指定操作,则可以显示的指定操作:

  • [HttpGet]
  • [HttpPut]
  • [HttpPost]
  • [HttpDelete]
  • [HttpHead]
  • [HttpOptions]
  • [HttpPatch]
// FindProduct该方法映射到 GET 请求
// 如果不指定,则默认寻找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
{
    // 定义多个请求,就是说自定义请求
    // 这个例子中,你就可以发送GET 和 HEADSB 请求,后台的反馈接口就都是这一个
    [AcceptVerbs("GET", "HEADSB")]
    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 }
);

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

/*
In this case, a GET request for "api/products/details" would map to the Details method. 
This style of routing is similar to ASP.NET MVC, and may be appropriate for an RPC-style API.

you can send a request GET --> api/products/details
*/

也可以自定义Action名称

// 那么该 uri --> api/products/thumbnail/id
public class ProductsController : ApiController
{
    [HttpGet]
    [ActionName("Thumbnail")]
    public HttpResponseMessage GetThumbnailImage(int id);

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

 

非操作

要防止将方法作为操作调用,请使用 属性[NonAction]。 这向框架发出信号,说明该方法不是操作,即使它以其他方式与路由规则匹配也是如此。

// Not an action method.
[NonAction]  
public string GetPrivateData() { ... }

 

写了这么多,总结一下:

其实就是  怎么确定路由

1、采用[HTTP+请求方法] 来自己指定,

2、采用 “请求方法 + 控制器名称 + Action”  组合

     1)请求方法可以自定义:可以采用 AcceptVerbs属性指定请求方法。

     2)Action采用 ActionName属性指定

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值