Web API路由

简介: 译者:jiankunking 出处:http://blog.csdn.net/jiankunking原文地址本文讲解ASP.NET Web API如何将HTTP请求路由至控制器。 如果你熟悉ASP.NET MVC,Web API路由与MVC路由非常相似。主要差别是Web API使用HTTP方法,而不是URI路径来选择Action。你也可以按照之前配置M

译者:jiankunking 出处:http://blog.csdn.net/jiankunking

原文地址

本文讲解ASP.NET Web API如何将HTTP请求路由至控制器。

如果你熟悉ASP.NET MVC,Web API路由与MVC路由非常相似。主要差别是Web API使用HTTP方法,而不是URI路径来选择Action。你也可以按照之前配置MVC路由的方式来配置Web API路由。本文不需要任何ASP.NET MVC知识。

Routing Tables路由表

在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public 方法被叫做action方法或者简单的Aciton。当Web API接收到一个请求的时候,它将这个请求路由到一个Action。

为了确定那个Action被调用,这个框架使用了一个路由表。Visual Studio中Web API的项目模板会创建一个默认路由:

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

这个路由是在WebApiConfig.cs文件中定义的,该文件位于App_Start目录。

这里写图片描述

关于WebApiConfig类的更多信息参阅“配置ASP.NET Web API”

如果你要自己托管(self-host )Web API,你必须直接在HttpSelfHostConfiguration对象上设置路由表。更多信息参阅“自托管Web API“。

路由表中的每一个条目都包含一个路由模板。这个Web API默认的路由模版是”api/{controller}/{id}”。在这个模版中,“api”是一个文字式路径片段(literal path segment),而{controller}和{id}则是占位符变量。

当Web API框架接收一个HTTP请求时,它会试图根据路由表中的一个路由模板来匹配其URI。如果无路由匹配,客户端会接收到一个404(未找到)错误。例如,以下URI与这个默认路由的匹配:

/api/contacts
/api/contacts/1
/api/products/gizmo1

然而,以下URI不匹配,因为它缺少“api”片段:

/contacts/1

小注:
在路由中使用“api”的原因是为了避免与ASP.NET MVC的路由冲突。通过这种方式,可以用“/contacts”进入一个MVC控制器,而“/api/contacts”进入一个Web API控制器。当然,如果你不喜欢这种约定,你也可以修改这个默认路由表。

一旦一个匹配的路由被发现,Web API便会选择相应的Controller和Action:

  • 为了找到Controller,Web API会把“控制器”加到{controller}变量的值。
  • 为了找到Action,Web API会查找HTTP方法,然后寻找一个名称以HTTP方法名开头的方法。例如,对于一个Get请求,Web API会查找一个以“Get…”开头的动作,如“GetContact”或“GetAllContacts”等。这种约定只应用于GET、POST、PUT和DELETE方法。通过在你的Controller上使用attributes,你可以启用其他的HTTP方法。稍后我们就会看到一个例子。
  • 路由模版中其他的占位变量,例如{id},将被映射成Action的参数。

让我们来看一个简单的例子,假设你定义了以下控制器:

public class ProductsController : ApiController
{
    public void GetAllProducts() { }
    public IEnumerable<Product> GetProductById(int id) { }
    public HttpResponseMessage DeleteProduct(int id){ }
}

以下是一些可能的HTTP请求,以及要被调用的每个动作:

HTTP Method URI Path Action Parameter
GET api/products GetAllProducts (none)
GET api/products/4 GetProductById 4
DELETE api/products/4 DeleteProduct 4
POST api/products (no match)

注意,URI中的{id}片段如果出现,会被映射成Action的id参数。在这个例子中,这个控制器定义了两个GET方法,一个带有id参数的和一个不带有id参数的。

另外要注意,POST请求是失败的,因为该控制器未定义“Post…”方法。

Routing Variations路由变化

上一节描述了ASP.NET Web API基本的路由机制。本小节描述一些变化。

HTTP方法

替代使用HTTP方法的命名约定,你可以明确的为一个Action指定HTTP方法,通过以HttpGet、HttpPost、HttpPut或者HttpDelete属性来对Action方法进行修饰。

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

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

允许一个Action对应多个HTTP方法,或者允许除了Get、Put、Post、Delete方法之外的HTTP方法,需要使用AcceptVerbs注解属性,它以HTTP方法列表作为参数。

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

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

通过Action名称路由

在默认的路由模版中,这个Web API使用HTTP方法去选择Action。然而,你也可以在URI中创建包含动作名的路由:

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

在这个路由模板中,{action}参数命名了控制器上的动作方法。采用这种风格的路由,需要使用注解属性来指明所允许的HTTP方法。例如,假设你的控制器已有如下方法:

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

在这种情况下,一个Get请求”api/Products/Details/1”将会映射到这个这个Details方法。这种风格的路由类似于Asp.Net MVC,而且可能与RPC式的API相接近。

你也可以通过使用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);
}

Non-Actions

为了防止一个方法被作为一个动作所请求,可以使用NonAction注解属性。它对框架发出信号:这个方法不是一个动作,,即使它可能与路由规则匹配。

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

初次接触Web API,首次翻译外文文章,如有不对的地方,麻烦斧正。
译者:jiankunking 出处:http://blog.csdn.net/jiankunking

小注:本文部分内容参考网络资料。

相关文章
|
5月前
|
设计模式 Java Linux
Java I/O的演进——从BIO到NIO再到AIO的异步革命
Java I/O模型经历了从阻塞I/O(BIO)到非阻塞I/O(NIO)再到异步I/O(AIO)的演进,每一次演进都是对高并发、高吞吐量需求的回应。
300 1
|
传感器 数据可视化 知识图谱
计算轴向磁铁和环状磁铁的磁场(Matlab代码实现)
计算轴向磁铁和环状磁铁的磁场(Matlab代码实现)
594 2
|
8月前
|
存储 弹性计算 缓存
阿里云新用户购买云服务器有优惠吗?新手便宜选配阿里云服务器指南
阿里云新用户有丰富首购优惠,选配置核心是匹配业务场景、CPU/内存比、带宽与存储,再结合预算弹性调整。下面分两部分说清楚,全是技术视角的实在建议。
354 14
|
6月前
|
存储 监控 Java
炸穿 JVM 瓶颈!全网最硬核 JVM 核心参数・线上配置规范与调优 SOP
本文聚焦JDK17实战调优,直击90%线上JVM问题根源——参数配置不合理、内存规划错误、GC选型失当。详解堆内存、元空间、ZGC/G1、线程栈等核心参数,提供微服务/大数据/网关三类标准化配置SOP及可直接复用的监控代码与诊断方案。
742 1
|
9月前
|
机器学习/深度学习 人工智能 算法
2025年高口碑数字人公司推荐,解锁互动新体验
2025年高口碑AI数字人榜单揭晓!集之互动以0.8秒实时响应、私有化部署和多场景闭环应用领先;Synthesia凭借超写实3D建模与多语言支持,助力全球化内容生产;D-ID创新隐私保护算法,守护敏感行业数据安全。三者分别在交互体验、内容效率与合规安全上表现卓越,满足企业多样化需求,推动数字人从“像真人”迈向“如员工”的实用新时代。
379 0
2025年高口碑数字人公司推荐,解锁互动新体验
|
消息中间件 存储 Kafka
10倍降本、10倍无损弹性!Kafka Serverless 基础版与专业版重磅发布!
云消息队列 Kafka 版基于 Apache Kafka 构建,提供高吞吐量与高可扩展性的分布式消息队列服务,广泛应用于日志收集、监控数据聚合、流式数据处理及在离线分析等场景,是 AI 与大数据时代企业数据处理体系的核心组件。
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
789 0
|
监控 JavaScript Shell
模拟zabbix通过snmp实现接口流量监控
模拟zabbix通过snmp实现接口流量监控
模拟zabbix通过snmp实现接口流量监控
|
人工智能 小程序 数据处理
uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
近期,多家康复机构咨询AI运动识别插件是否适用于肢力运动受限患者的康复锻炼。本文介绍该插件在康复锻炼中的应用场景,包括康复运动指导、运动记录、恢复程度记录及过程监测。插件集成了人体检测、姿态识别等功能,支持微信小程序平台,使用便捷,安全可靠,帮助康复治疗更加高效精准。
|
云安全 存储 运维
带你读《阿里云安全白皮书》(十七)——云上安全重要支柱(11)
阿里云提供了《阿里云安全白皮书(2024版)》,介绍客户数据安全保护技术能力。针对敏感行业,阿里云推出了专属区域和云盒两种形态,确保数据本地存储和合规要求,同时提供标准的公有云产品。此外,阿里云数据安全中心提供敏感数据识别、细粒度数据审计、数据脱敏/列加密、数据泄露检测与防护等四大功能,全面保障数据安全。

热门文章

最新文章