路由表
在 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 请求,以及为每个请求调用的操作:
HTTP 谓词 | URI 路径 | 操作 | 参数 |
---|---|---|---|
GET | api/产品 | 获取所有产品 | (无) |
GET | api/产品/4 | 获取产品 ById | 4 |
DELETE | api/产品/4 | 删除产品 | 4 |
POST | api/产品 | (不匹配) |
请注意,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属性指定