Search code examples
asp.net-web-apiasp.net-routing

WebAPI GET optional integer parameters


Can someone help me fill in the blanks with my GET methods for webapi. I want to pass in no parameters and get all results. Pass in an int and get a single result and pass in a named parameter to filter by a typeId / zoneId or both but am struggling to get this to work.

TimeController : ApiController

// Time/  

//Time/1

//Time/typeId=1

//Time/zoneId=1

Time/typeId=1&zoneId=1

The closest I got was with

Global

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

        RouteTable.Routes.MapHttpRoute(name: "TemplateTimeApi",
           routeTemplate: "api/{controller}/{typeId}/{zoneId}",
           defaults: new {typeId = RouteParameter.Optional, zoneId = RouteParameter.Optional }
           );

Controller

 List<TimeView> Get(int typeId, int? zoneId = null)

 TimeView Get(int id)

but I get a 404 on no parameters.

I can change one of the parameters to a string if the issue is with two integers, however, I would prefer to understand the issue and get it to work.


Solution

  • // Time/

    If you take a look your routing table: the first routing is matched, but you don't have action with no parameter => 404 thrown.

    //Time/1

    Run correct, the first route is matched, in here, it choose the action: TimeView Get(int id) becasue of the name: id on routing match to paramter "id" with this method. Remember, Web API bases heavily on naming convention.

    //Time/typeId=1

    //Time/zoneId=1

    Wrong URL => 404 thrown, I guess you would like to put as query string, should be: Time?typeId=1 But even wrong because, the first routing is match with parameter "Id", not "typeId", so no action method was found.

    Time/typeId=1&zoneId=1

    Wrong URL too, the same reason with above.

    The correct URL you should have: GET Time/1/1 will match with your second route.

    For more understanding on routing and action: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection