使用WebAPI路由属性

本文关键字:属性 路由 WebAPI 使用 | 更新日期: 2023-09-27 18:16:17

我有几个方法,我想为它们的url遵循一个特定的模式。

基本上有餐厅,它们有id,以及它们下面的终端集合。

我试图得到以下类型的模式出现:api/Restaurant -获取所有餐厅api/Restaurant/Bobs -获取ID为Bobs的餐厅api/Restaurant/Bobs/terminals -获取Bobs Restaurant中的所有终端api/Restaurant/bobs/terminals/second -获取餐厅bob中ID为second的终端

我已经有了这样做的方法,我已经为每个方法分配了Route属性,如下所示:

    [HttpGet]
    public IEnumerable<IRestaurant> Get()
    {
        //do stuff, return all
    }
    [HttpGet]
        [Route("api/Restaurant/{restuarantName}")]
        public IRestaurant Get(string restaurantName)
        {
           //do stuff
        }
    [HttpGet]
    [Route("api/restuarant/{restaurantName}/terminals")]
    public IEnumerable<IMiseTerminalDevice> GetDevices(string restaurantName)
    {
       //do stuff
    } 
    [HttpGet]
    [Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
    public IMiseTerminalDevice GetDeviceByName(string restaurantName, string terminalName)
    {
        //do stuff
    }

然而,只有我的基本GET (api/餐厅)是工作的。我的WebAPI配置是默认的,读取

    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

谁知道我哪里出错了?所有其他方法返回路由不匹配(餐厅与ID)或404。

提前感谢!

使用WebAPI路由属性

我刚刚创建了默认的WEB API项目,其中包括一个ProductsController。接下来,我将您的api方法粘贴到。

  public class ProductsController:ApiController
    {

        [HttpGet]
        [Route("api/Restaurant/{restaurantName}")]
        public IHttpActionResult Get(string restaurantName)
        {
            //do stuff
            return Ok("api/Restaurant/{restuarantName}");
        }
        [HttpGet]
        [Route("api/restuarant/{restaurantName}/terminals")]
        public IHttpActionResult GetDevices(string restaurantName)
        {
            //do stuff
            return Ok("api/restuarant/{restaurantName}/terminals");
        }
        [HttpGet]
        [Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
        public IHttpActionResult GetDeviceByName(string restaurantName, string terminalName)
        {
            //do stuff
            return Ok("api/restaurant/{restaurantName}/terminals/{terminalName}");
        }
    }

最后,我用Fiddler发出一个请求

**http://localhost:9969/api/restuarant/Vanbeo/terminals**

,一切正常!

系统配置:Visual Studio 2013, WEB API 2.2, Net 4.5

请使用空项目重试吗?

PS:我不得不把这个作为一个答案,因为评论中没有足够的空间!