1

我希望能夠支持這些網址:配置webapi2航線,以支持不同類型的GET請求(動作/ ID)

// 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要求

是否有可能同時支持?

+0

寄存器的多個路由 – Nkosi

回答

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) { ... } 
} 
+0

謝謝,如果我設置2條路線,這將是這樣的:' 「API/{控制器}/{行動}」'和'「API/{controller}/{id}「'(id可選),因爲我不會遇到動作和id的情況。但是,那麼'api/Users/Active'和'api/Users/5'會如何正確使用哪條路徑? – ibiza

+0

您可以使用約束 – Nkosi

+0

請修復打字錯誤「RoutePrefic」 - >「RoutePrefix」 – Daniel

相關問題