www.cftea.com

.NET MVC 方式实现 Web API-高级路由映射

ITPOW2017/5/7 19:35:53

一、忽略大小写

http://www.itpow.com/Member 与 http://www.itpow.com/member 是等效的。

二、忽略结尾斜杠

http://www.itpow.com/Member 与 http://www.itpow.com/Member/ 是等效的。

同理,路由模板:{controller} 与 {controller}/ 也是等效的。

三、默认响应类

路由模板中有一个 {controller} 这个决定了由哪个类的响应,比如 http://www.itpow.com/Member 交由 MemberController 这个类来响应。 

四、默认响应方法

默认响应方法为 HTTP 谓词开头的方法

比如 GET 提交时,默认由 Get 或 Get 开头的方法来处理,方法名称 Get 也忽略大小写,比如 get 也可以。如果有多个 Get 或 Get 开头的方法,则根据更进一步的路由来匹配,如无更进一步路由,则可能会报错。

五、更改默认响应方法

[HttpPost] 指定了方法响应的是 POST,而不是 GET,尽管方法名称是 Get。

[Route] 指定了响应的路由,这个配置也可以在 App_Start/WebApiConfig.cs 中用 config.Routes.MapHttpRoute 配置。

六、配置路由是 name 应该唯一

这里的 name 是指如下这里的 name:

七、高级路由

路由模板不能以“/”或“~”字符开头,并且不能包含“?”字符。

以上约定了:

  • 这个路由交由 Class1 这个类来响应。
  • 这个路由交由 DoIt 这个方法来响应。
  • DoIt 应该跟一个参数 id。
  • 这个 id 是可选的。
  • 这个 id 必须是 0-9 组成,个数为任意个。注意如果将 * 改为 +,则表示必须有一个数字,这会覆盖上面的 Optional。

Class1 类:

注意:尽管前面路由指定了由 DoIt 方法来响应,由于 DoIt 不是以 Get、 Post、Put、Delete 一类的名称开头,所以默认它是不会与 GET、POST、PUT、DELETE……对应的,我们还需要加一个 Attribute,比如上面我们加的是 [HttpGet],这样使用 GET 请求路由规定的方法时,就会由 DoIt 来处理。

注意:id 必须与路由中的名称一致

注意:由于 id 是 Optional 的,所以参数 id 为 int?。你可能会问,我可以把 DoIt(int? id) 拆分为两个方法:DoIt()、DoIt(int id) 来分别响应没 id、有 id 的,这种拆分是不可行的。如果路由中 id 不可省略,方法中也是可以用 int? 的。

八、路由顺序

以下这两个顺序是没有关系的,因为路由与 URL 是完整匹配,不是前缀匹配。

但是,下面这两个路由,由于 id 为 Optional,所以当 URL 中省略 id 时,哪个路由在前、哪个路由在后就会不一样了,它总是由第一个符合条件的路由响应

下面这两个路由也是在前面的起作用,因为 URL 并不能识别 id 还是 id2。

九、注意谓词

理论上来说,REST 风格是用:GET、POST、PUT、DELETE 谓词来表示:取、增、改、删。但实际中,很多服务器安全配置不一定允许 PUT、DELETE 谓词,而且有些接口项目中,也不一定会发送 PUT、DELETE(比如 wx.uploadFile 就只会 POST,不会 PUT)。

所以实际中,我们应该不要拘泥,应该根据实际情况来调整,POST 照样可以用来实现修改数据。当然,为了不乱,这就要求用前面说的路由来配合。

<<返回首页<<