如何正确映射 WebAPI 路由

Posted

技术标签:

【中文标题】如何正确映射 WebAPI 路由【英文标题】:How to map WebAPI routes correctly 【发布时间】:2016-07-16 11:00:31 【问题描述】:

我正在使用 Web API 为类似 Twitter 的网站构建 API,但在映射路线时遇到了问题

我对用户控制器有以下操作:

public User Get(string firstname, string lastname)
public User Get(Guid id)
public User Friends(Guid id)
public User Followers(Guid id)
public User Favorites(Guid id)

所需的路线和生成的文档应该是:

api/users?firstname=firstname&lastname=lastname
api/users/id
api/users/id/friends
api/users/id/followers
api/users/id/favorites

在 WebApiConfig.cs 我有:

config.Routes.MapHttpRoute(
    "2",
    "api/controller/id",
    new  action = "get", id = RouteParameter.Optional 
);


config.Routes.MapHttpRoute(
     "1",
     "api/controller/id/action"
);

【问题讨论】:

【参考方案1】:

关于这个主题有很多有用的参考资料,例如:

Routing Basics with Web-API Web-API Routing for multiple methods Routing in Asp.net Mvc 4 and Web Api

你看过这些吗?

更新..

明确说明哪个参数是哪个更好的做法,即:

    config.Routes.MapHttpRoute(
        name: "2",
        routeTemplate: "api/controller/id",
        defaults: new  action = "Get", id = RouteParameter.Optional ,
    );

    config.Routes.MapHttpRoute(
        name: "1",
        routeTemplate: "api/controller/action/id",
        defaults: null
    );

我看到的主要错误是您在路线“1”中的操作/ID 顺序错误。

【讨论】:

看了所有这些【参考方案2】:

考虑到你想要的灵活性,你应该看看

Attribute Routing in ASP.NET Web API 2

在 WebApiConfig.cs 中启用属性路由

// Web API routes
config.MapHttpAttributeRoutes();

在用户控制器中

注意给定动作名称Friends, Followers and Favorites 他们暗示返回集合而不是单个用户

[RoutePrefix("api/users")]
public class UserController: ApiController 

    //eg: GET api/users?firstname=firstname&lastname=lastname
    [HttpGet]
    [Route("")]
    public User Get([FromUri]string firstname,[FromUri] string lastname) ...

    //eg: GET api/users/id
    [HttpGet]
    [Route("id:guid")]
    public User Get(Guid id)...

    //eg: GET api/users/id/friends
    [HttpGet]
    [Route("id:guid/friends")]
    public IEnumerable<User> Friends(Guid id)...

    //eg: GET api/users/id/followers
    [HttpGet]
    [Route("id:guid/followers")]
    public IEnumerable<User> Followers(Guid id)...

    //eg: GET api/users/id/favorites
    [HttpGet]
    [Route("id:guid/favorites")]
    public IEnumerable<User> Favorites(Guid id)...

【讨论】:

【参考方案3】:

路由是顺序敏感的。 first 匹配总是获胜。因此,按照从最具体到最不具体的顺序排列路线非常重要。

// All parameters are required, or it won't match.
// So it will only match URLs 4 segments in length
// starting with /api.
config.Routes.MapHttpRoute(
     "1",
     "api/controller/id/action"
);

// Controller is required, id is optional.
// So it will match any URL starting with
// /api that is 2 or 3 segments in length.
config.Routes.MapHttpRoute(
    "2",
    "api/controller/id",
    new  action = "get", id = RouteParameter.Optional 
);

当您的路线以这种方式排序时,您将获得您期望的行为。

【讨论】:

以上是关于如何正确映射 WebAPI 路由的主要内容,如果未能解决你的问题,请参考以下文章

Sitecore 7.5 的 MVC 检测和 WebApi 属性路由

如何从 WebApi 操作返回 html 页面?

asp.net webapi 2属性路由不起作用

ASP.NET WebApi 从入门到"放弃"系列---WebApi 请求路由

如何在Windows Server2008R2中部署WebAPI

.NET core 2.1 Web API 是不是支持基于约定的路由?