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 Restaurantsapi/Restaurant/Bobs - gets the restaurant with the ID of Bobsapi/Restaurant/Bobs/terminals - get all terminals in bobs restaurantapi/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!

1

Best Answer


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 stuffreturn Ok("api/Restaurant/{restuarantName}");}[HttpGet][Route("api/restuarant/{restaurantName}/terminals")]public IHttpActionResult GetDevices(string restaurantName){//do stuffreturn Ok("api/restuarant/{restaurantName}/terminals");}[HttpGet][Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]public IHttpActionResult GetDeviceByName(string restaurantName, string terminalName){//do stuffreturn 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!