【问题标题】:Configure webapi2 route to support different kind of GET requests (action/id)配置 webapi2 路由以支持不同类型的 GET 请求(action/id)
【发布时间】:2017-04-08 05:19:00
【问题描述】:

我希望能够支持这些 URL:

// GET:  api/Users              returns a list (all)
// GET:  api/Users/5            returns the user with Id 5
// GET:  api/Users/Active       returns a list (only those not soft-deleted)
// POST: api/Users              creates a user

我第一次尝试这样配置:

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

但后来我无法支持api/Users/Active 请求

所以我尝试这样配置:

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

但是我不能支持api/Users/5请求

可以同时支持吗?

【问题讨论】:

  • 注册多条路线

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


【解决方案1】:

注册多条路线。

您还可以提供约束,限制 URI 段如何匹配占位符:

constraints: new { id = @"\d+" }   // Only matches if "id" is one or more digits.

例子

// GET:  api/Users              returns a list (all)
// GET:  api/Users/5            returns the user with Id 5
// POST: api/Users              creates a user
config.Routes.MapHttpRoute(
    name: "Api",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: new { id = @"\d+" }
);

// GET:  api/Users/Active       returns a list (only those not soft-deleted)
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

或者启用属性路由。

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

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

控制器

[RoutePrefix("api/users")]
public class UsersController : ApiController {
    // GET:  api/Users              returns a list (all)
    [HttpGet]
    [Route("")] 
    public IHttpActionResult Get() { ... }
    // GET:  api/Users/5            returns the user with Id 5
    [HttpGet]
    [Route("{id:int}")] 
    public IHttpActionResult Get(int id) { ... }
    // GET:  api/Users/Active       returns a list (only those not soft-deleted)
    [HttpGet]
    [Route("Active")] 
    public IHttpActionResult Active() { ... }
    // POST: api/Users              creates a user
    [HttpPost]
    [Route("")] 
    public IHttpActionResult Post(User user) { ... }
}

【讨论】:

  • 谢谢,如果我配置 2 条路由,会是这样:"api/{controller}/{action}""api/{controller}/{id}"(id 可选)因为我不会有一个带有操作和 id 的案例。但是,api/Users/Activeapi/Users/5 怎么知道正确使用哪个路由?
  • 你可以使用约束
  • 请改正错字“RoutePrefic”->“RoutePrefix”
  • 感谢您的回答。我还发现this Q/A 非常有用。
猜你喜欢
  • 2014-03-21
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多