Contact Manager Web API 示例[2] Web API Routing

联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373dContact Manager Web API 示例[1]CRUD 操作 已经做了一个基本的介绍,本文主要介绍Web API Routing。

如果你已经熟悉 ASP.NET MVC,你会发现 Web API Routing(路由)与 MVC 非常类似。主要差异在 Web API 使用 HTTP Method ( GET, POST, PUT, DELETE ...) 而不是使用 URI 路径来选择 Action。你也可以在 Web API 里使用 MVC 样式的路由。以下讨论专注在 Web API 且可以没有 ASP.MVC 基础。

ROUTING TABLES, 路由表

在 ASP.NET Web API,一个 controller 是一个 class(类) 以处理 HTTP 请求(requests)。在 controller 里所有的公开方法(public  methods)都称为 Action方法 或简称 Action。当 Web API Framework 接收到一个请求,它路由请求到一个 Action。 Framework 会使用路由表(Routing Table),决定那一个 Action 会被调用。如果你在 ASP.NET 里使用 Web API,路由表会定义在 Global.asax 档案中。默认使用 Visual Studio 去新增一个 Web API 项目,项目样版会建立默认路由给你:

config.Routes.MapHttpRoute(    
             "Default", // Route name     
             "{controller}/{id}/{ext}", // URL with parameters     
             new { id = RouteParameter.Optional, ext = RouteParameter.Optional } // Parameter defaults     
         ); 

注意,如果你使用 self-host Web API,你必须在 HttpSelfHostConfiguration对象 上直接设定路由表。

每个实体(entry)在路由表里都包含一个路由样板(route template)。Web API 的路由样板默认是 "api/{controller}/{id}",此样板里,"api" 是文字路径片段,{controller} 和 {id} 是定位参数。 当 Web API Framework 接收到一个 HTTP 请求,它会去尝试比对 URI 对路由表的路由样板之一, 如果没有符合的路由,Client 会收到一个 404 错误。例如,以下 URI 会符合默认路由:

· /api/contacts

· /api/contacts/1

当发现一个符合的路由,Web API 会选择 controller 与 action:

· 寻找 controller,Web API 新增 "Controller" 到 {controller} 变数的值。

· 寻找 action,Web API 查看 HTTP 方法,然后查看 action,哪一个名称的开始与是 HTTP 方法名称。例如,一个 GET 请求,Web API 会查看那一个 action 是以 "Get..."  开头,像是 "GetContact" 或 "GetAllContacts"。此惯例使用在 GET, POST, PUT, DELETE 方法。你也能在 controller 里使用属性(attributes)去启用其他 HTTP 方法。

· 在路由样板里其他定位变量,像是 {id},会对应至 action 的参数。

以下有一些可能 HTTP 请求:

Web API Routing and HTTP Method

HTTP Method

URI路径

Action

参数

GET

/api/contacts

GetAllContacts

(无)

GET

/api/contacts/5

GetContactById

5

DELETE

/api/contacts/5

DeleteContact

5

POST

/api/contacts

(无符合)

留意 URI 的 {id} 段落,如果存在,会对应到 action 里的 id 参数。上述范例, controller 定义了两个 GET 方法,一个 id 参数一个 id 参数。另外,POST 请求会失败,因为在 controller 里没有定义 "Post..." 方法。

路由参数, ROUTING VARIATIONS

接下来我们讨论路由参数。

HTTP 方法, HTTP Methods

Web API 使用HTTP 方法的名称惯例(naming convention)来替代。你也可以明确在 action 方法上指定使用 HttpGet, HttpPost, HttpPut, HttpDelete 属性。 例如,以下的 Get 方法会对应至 GET 请求:

       [HttpGet]    
      public HttpResponseMessage<Contact> Get(int id)     
      {     
         ……
      }

Action 名称的路由

在默认路由模板,Web API 使用 HTTP 方法来选择 action。不管如何,你也能建立一个 URI 含有 action 名称的路由。

config.Routes.MapHttpRoute(    
                "Default", // Route name     
                "/api/{controller}/{action}/{id}", // URL with parameters     
                new { id = RouteParameter.Optional} // Parameter defaults     
            );

此路由样板,在 controller 里的 action 方法会与 {action} 参数对应。使用此种路由样式,你必须明确指定允许属性在 HTTP 方法。例如,在 controller 里有一个 Details 方法:

       [HttpGet]    
      public HttpResponseMessage<Contact> Details(int id)     
      {
      }

一个 "/api/contacts/details/1" 的 GET 请求将会对应至 Details 方法。这种路由样式非常类似 ASP.NET MVC,或是接近一个 RPC-style API。在一个 RESTful API,你应该避免在 URI 使用动词(verbs),因为 URI 应该是定义资源而不是action。

非 Action

如果要预防一个 ACTION 被呼叫,可以使用 NONACTION 属性。这是一个信号跟 FRAMEWORK 说此方法不是一个 ACTION 方法。

      [NonAction]    
      public Contact GetPrivateContact(int id)     
      {
            ……
      } 

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

Python3.6学习笔记(五)

网络程序出现的比互联网要早很多,实现方式主要依靠网络上不同主机间进程的通信,通信协议最重要的是TCP/IP协议。在这两个协议基础上还有很多更高级的协议,包括HT...

1282
来自专栏流柯技术学院

LoadRunner上传及下载文件

         web_submit_data("importStudent.do",

2412
来自专栏MasiMaro 的技术博文

PE文件详解(八)

本文转载自小甲鱼PE文件详解系列教程原文传送门 当应用程序需要调用DLL中的函数时,会由系统将DLL中的函数映射到程序的虚拟内存中,dll中本身没有自己的栈...

912
来自专栏逸鹏说道

在 ASP.NET MVC 中使用异步控制器

可以通过 AsyncController 类编写异步操作方法。 可以对长时间运行的、非 CPU 绑定的请求使用异步操作方法。 这样可避免在处理请求时阻塞 Web...

35811
来自专栏谈补锅

ios线程和GCD和队列同步异步的关系

  进程是指在系统中正在运行的一个应用程序。比如同时打开QQ、Xcode,系统就会分别启动2个进程。截图

4424
来自专栏me的随笔

ASP.NET MVC5 ModelBinder

ASP.NET MVC中,所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应。为了能够正确处理请求,Act...

1052
来自专栏跟着阿笨一起玩NET

我的WCF之旅(1):创建一个简单的WCF程序

为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构。对...

681
来自专栏c#开发者

Msmq设计文档(赋源代码)

Msmq设计文档 文件状态: [√] 草稿 [ ] 正式发布 [ ] 正在修改 文件标识: ECI-MSMQ v01 当前版本: 0.5...

3458
来自专栏大内老A

[WCF权限控制]模拟(Impersonation)与委托(Delegation)[上篇]

由于服务操作是在寄宿进程中执行,在默认的情况下,服务操作是否具有足够的权限访问某个资源(比如文件)决定于执行寄宿进程Windows帐号的权限设置,而与作为客户端...

2546
来自专栏salesforce零基础学习

salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)

Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pd...

2916

扫码关注云+社区

领取腾讯云代金券