Using WebAPI Route attribute
I have just created the default WEB API project which includes a ProductsController. Next, I pasted your api methods in.
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}");
}
}
Finally, I used Fiddler to make an request
**http://localhost:9969/api/restuarant/Vanbeo/terminals**
and everything works fine!
System Configs: Visual Studio 2013, WEB API 2.2, Net 4.5
Could you please retry with an empty project?
PS: I have to post this as an answer because there is not enough space in the comment!
Mathieson
Updated on May 23, 2020Comments
-
Mathieson almost 4 years
I've got a few methods, which I want to follow a specific pattern for their URLs.
Basically there's restaurants, which have IDs, and a collection of Terminals under them.
I'm trying to get the following sort of pattern to emerge: api/Restaurant - get all Restaurants api/Restaurant/Bobs - gets the restaurant with the ID of Bobs api/Restaurant/Bobs/terminals - get all terminals in bobs restaurant api/Restaurant/bobs/terminals/second - get the terminal with the ID of second in the restaurant bob
I've got the methods to do this, and I've assigned the Route attribute to each as follows:
[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 }
However only my basic GET (api/Restaurant) is working. My WebAPI config is the default, and reads
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"));
Anybody know where I'm going wrong? All other methods return routing mismatch (restaurant with ID) or a 404.
Thanks in advance!
-
Mathieson almost 10 yearsI created a new WebAPI project, and replaced the ValuesController method with the code above - now I find that localhost:3322/API/restaurant/bob returns correctly. However localhost:3322/API/restaurant/bob/terminals returns a 404
-
Toan Nguyen almost 10 yearsCan you just upgrade your Web API package to version 2.2 and retry again?
-
Mathieson almost 10 yearsWebAPI is at 2.2. I think there's a problem with the method names - changing my signature to [Route("api/restaurants/{restaurantName}/{terminalName}")] [Route("api/restaurants/{restaurantName}/terminals/{terminalName}")] [HttpGet] public IHttpActionResult GetTerminalByName(string restaurantName, string terminalName) has enabled me to get to the method at least. I've refactored to move to a larger aggregate root of Restaurant, so this can be a good way to sidestep the issue. Still frustrating though - even the RouteDebugger isn't showing much!