Web API中id参数后带有操作的路由

本文关键字:操作 路由 API id 参数 Web | 更新日期: 2023-09-27 18:14:03

在web api中,默认路由为:/api/locations/123?days=5

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

但是,如果我想让路线看起来像这个/api/locations/123/events?days=5,同时仍然能够用这个/api/locations/123?state=md 这样的路线到达LocationsController,该怎么办

控制器:

public class LocationsController : ApiController {
    // GET api/locations/123/events?days=5
    public IEnumerable<Event> GetEventsByDays(int idLocation, int days) {
        // do stuff
    }
    // GET api/locations/123?state=md
    public IEnumerable<Location> GetLocationsByState(string state) {
        // do stuff
    }
}

这里确实有两个问题:

  1. 有一个返回事件的LocationsController有意义吗?或者应该有一个完全独立的控制器吗
  2. WebApiConfig中的路由将如何设置以允许这样的路由

Web API中id参数后带有操作的路由

您谈论的是两件不同的事情:

路由

路由在ASP中使用。NET MVC&WebApi将URL直接映射到控制器和/或操作。这对于可读性特别有用,因为开发人员可以专注于设计人类可读的URL(例如,产品支持和搜索引擎索引(。这里重要的是,在路由和控制器之间没有唯一的关系。如果你想映射相同的控制器/动作,你可以创建10条路线。

例如,你的两条路线可以是这样的

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
); 
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{idLocation}/events/{days}",
    defaults: new { id = RouteParameter.Optional }
); 

还要注意,/api/locations/123?state=md对于默认路由模板来说是不正确的。是/api/locations/123。因为您在url中有一个额外的参数,所以您将执行GetLocationsByState。

控制器

建议每个控制器有一个单独的责任,并尽可能地保持较小的责任。您的业务逻辑应该在其他地方。

Jeffrey Palermo(洋葱建筑公司创始人(说

如果你看不到ASP。NET MVC操作方法在屏幕上不必滚动,你有一个问题

最后,就像你做任何事情一样,无论好坏,你都可以做你想做的事。困难并不总是建立一个体系结构,而是维护和遵循自己的规则。

我希望这对你有帮助。我想你对路线不太熟悉,所以请毫不犹豫地阅读介绍和动作选择。

如果您希望独立于位置操作事件,则可以为事件提供一个单独的控制器。请看这是否有帮助。