【问题标题】:How to map WebAPI routes correctly如何正确映射 WebAPI 路由
【发布时间】: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}"
);

如何正确映射 WebAPI 路由?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

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

    你看过这些吗?

    更新..

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

        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 }
      );
      

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

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 2012-11-23
        • 1970-01-01
        • 2012-04-11
        • 2020-01-09
        • 1970-01-01
        相关资源
        最近更新 更多